Blog
Rails, JavaScript and I18n

First and foremost, internationalizing an existing application is a tedious, repetitive task. So even though your customer may not need it as part of the first development, paying attention to this aspect is not only recommended, but often turns out to be quite necessary. This will avoid a lot of trouble for you in the long run!
Here are some techniques, tools and tips that will help you get started. But first, let’s review how i18n (I’m not typing that word a second time) works in Rails.
First of all, you don’t need any extra gem to internationalize your application. Everything is already built into the framework.
The default language is English (:en), and all your translations (in YAML files) are stored into config/locales/.
The format of these files is relatively free, except for the names of ActiveRecord models and attributes, and validation error messages. As usual with Rails, conventions exist and the process will be a lot easier if you follow them.
order.en.yml
en:
order: Order
activerecord:
models:
order: Order
attributes:
order:
quote_id: Quote
internal_reference: Internal reference
user_id: User
patent_id: Patent
currency: Currency
billing_country_id: Billing country
billing_title: Title
billing_lastname: Lastname
billing_firstname: Firstname
billing_function: Function
billing_company: Company
billing_vat_number: VAT# of the company/firm
billing_address_1: Address line 1
billing_address_2: Address line 2
billing_city: City
billing_postcode: Post/Zip Code
reference: Reference
ordering_paralegal_id: Ordering paralegal
provided_translation_ids: Provided translations
person_in_charge: Person in charge
first_annuities_offices_ids: First annuities offices
annuities_offices_ids: Annuities offices
ordered_at: Order date
orders:
certificates_have_been_ordered: Your certificates have been correctly ordered
thank_you: Thank you for your order!
place_an_order: Place an order in 4 simple steps.
place_order_now: Place order now
nothing_to_down: Nothing to download
process_steps:
quote_summary: Quote Summary
special_requests: Special Requests
billing_mailing_info: Billing/Mailing Info
confirmation: Confirmation
fast_track_process_steps:
ft_service_selection: Service Selection
ft_special_requests: Special Requests
ft_billing_mailing_info: Billing/Mailing Info
ft_confirmation: Confirmation
footer:
print_page: Print this page
start_valid: Start a new validation quote for this patent
back_to: Back to cases
export_pdf: Export to PDF
export_exel: Export to Excel
header:
placed: placed on
you_can: You can review your order here.
validation_certificates: Validation certificates ordering
You can put all your texts in a single file (such as en.yml), but we recommend splitting them into different theme files, which must be namesome_theme.language_code.yml (e.g. users.en.yml).
The first thing you need to do is set the locale of the application. Here is how you would do it if your User model has a stored locale:
application_controller.rb
class ApplicationController < ActionController::Base
before_filter :set_locale
def set_locale
I18n.locale = (@current_user.locale.to_sym || I18n.default_locale)
end
end
Now that we know which local to use, we need to replace all the text in our views, controllers, etc by a method code, which will select the correct translation. This is the translate(key) method (aliased to t for short). This method is automatically available in views. In controllers, you will need to call I18n.t(key).
As said before, the translation files have conventions as to their structure. Here is where they will prove useful: let’s say you want to display the text “Print this page” (line 48), you could callt('orders.footer.print_page'), but that is a little long, especially if you consider you will have to do this for every single link, button, header and paragraph of your view (I warned you it was tedious). But if you’re in app/views/orders/_footer.html.erb, you can simply call t('.print_page'). Rails will know to complete the missing hierarchy of your key with the path to the current view or partial. Of course, you can still use the complete path whenever you need to access translations outside your current scope.
Lastly, a little tip for the text in your JavaScript: have a look at the i18n-js gem, which lets you use similar tools as what is provided by Rails from JavaScript.
Read more: I18n on RailsGuides