Last week we had to convert our existing Rails application, which uses Gettext to the new I18n API in combination with the SimpleBackend. I personally never liked Gettext, there was simply not enough control over translations as PO/MO files are not native ruby or at least can be easily accessed by Ruby (like YAML files).
We therefore decided to switch to the brand new, not even released, I18n API. But now we had a serious problem, our code base isn’t small and all that code had to be converted in some way. We could do it by hand, but hey, that’s a lot of work and especially very error-prone. Some convertor had to be written. Here it is as a rails plugin: GettextToI18n.
What does the I18n convertor do?
It scrapes your whole application and searches for gettext calls, like this:
It will convert this gettext call to the newly I18n format:
Then it builds up a big hash containing all the the translations. We decided it was handy to use the scopes that are introduced in the new I18n api. So it stores the translations in the following format:
For models:
["model"]["model_name"]={:message_1 => "to be translated"}
For controller:
["controller"]["controller_name"]={:message_1 => "to be translated"}
After this hash of translations has been built up, the convertor writes it as a YAML file to: config/locales/template.yml.That’s all!
What’s supported?
It supports basic gettext calls. We have run it over our code base and it converts all gettext calls we use without any problem.
A normal gettext call
converts to:
I18n.t :message_0, :scope => [:txt, :controller, :controller_name])
A gettext call with variables
_("My name is %{name}" % {:name => "Jaap"})
converts to:
I18n.t :message_0, :name => "Jaap", :scope => [:txt, :controller, :controller_name])
A gettext call with variables that contain gettext calls
_("Click %{link} to go to the homepage" % {:link => link_to(_("Here"), root_path)})
converts to:
I18n.t :message_0, :link => link_to(I18n.t(:message_1, :scope => [:txt, :controller, :controller_name]), root_path), :scope => [:txt, :controller, :controller_name])
Installation
./script/plugin install git://github.com/japetheape/gettext_to_i18n.git
Usage
To convert your application:
rake gettext_to_i18n:transform
Please make sure you backup your complete application as it can screw things up.
Contribution
Please contribute to this plugin and make it better, as I won’t use it anymore, cause we are not going to convert another time (I think ;-)). Things that has to be done are:
unnamed variables:
_("I play the %s" % "saxophone")
Go to the development location at github and fork this plugin!