Multilingual Rails Application
Posted by: Prachi | 09 May 2013 | CommentsIn rails application, I want to make it multilingual. We need to define YAML language files for all required languages and tell the Rails application which language it should currently use.
Rails I18n.locale
saves the current language and can be read by the application.
Steps for language translation
Lets we use German and English language here for translation .
1. Add language.yml in config/locales
In /config/locales/en.yml
en:
hello: "Hello World"
In /config/locales/de.yml
hi:
hello: "hallo Welt"
2. Configuration changes
In rails application the default locale is :en for English.
Add in config/application.rb
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
3. Setting and Passing the Locale
Setting a selected locale as current language is easy. You can set the locale in the ApplicationController
using before_filter
before_filter :set_locale
def set_locale
I18n.locale = params[:locale] if params[:locale].present?
end
4. Adding Translations
Then we insert the links for the navigation in the app/views/layouts/application.html.erb
:
<p>
<%= link_to_unless I18n.locale == :en, "English", locale: :en %>
|
<%= link_to_unless I18n.locale == :de, "Deutsch", locale: :de %>
</p>
The I18n API’s translate
method is used to translate the text into current language.
So, change the view to display translated text. Use I18n API’s #t
helper to translated string as
e.g in posts#index
<h1><%=t :hello %></h1>
Now, when you run posts#index the heading will display translated string for hello as per language. You can test translation by switching languages.
5. Organization of Locale Files
Putting translations for all parts of an application in one file per locale could be hard to manage.so we can store these files in a hierarchy as follows.
|-defaults
|---de.rb
|---en.rb
|-models
|---post
|-----de.rb
|-----en.rb
|-views
|---defaults
|-----de.rb
|-----en.rb
|---posts
|-----de.rb
|-----en.rb