Simple Localization in Rails 2.2
July 21st, 2008 by TrevorI've been staying on the sidelines when it comes to localization in Rails for a while now, but I couldn't help getting excited about the upcoming native support in Rails 2.2. So, with some guidance from the Rails i18n team, I decided to give things a try.
I've been extremely pleased with the results so far, but I'm all ears if anyone would like to offer suggestions on how to better achieve basic localization for a Rails app. Here's where I'm at so far in a kind of how-to format. This is all plugin-free, using only what's available in core. I expect that plugins will be coming out to add features and functionality, but you can accomplish quite a bit without any extras.
You can try to follow along, or just get the gist be reading through the steps. As noted in the comments, this is just a proof of concept, is not secure, and shouldn't be used in production as-is.
1. Make a new Rails app and freeze edge:
~ $ rails i18n ~ $ cd i18n ~ $ rake rails:freeze:edge
2. Make a couple of translation stores (files) in lib/locale directory:
# lib/locale/en-US.rb I18n.store_translations 'en-US', :hello_world => "Hello World", :hello_flash => "Hello Flash" #lib/locale/pirate.rb I18n.store_translations 'pirate', :hello_world => "Ahoy World", :hello_flash => "Ahoy Flash"
3. Set I18n.locale with a before_filter:
# app/controllers/application.rb class ApplicationController < ActionController::Base before_filter :set_locale def set_locale locale = params[:locale] || 'en-US' I18n.locale = locale I18n.populate do require "lib/locale/#{locale}.rb" end end end
4. Create a "t" convenience method (I thought this was going to be there automagically?):
# app/helpers/application_helper.rb module ApplicationHelper def t(*args) translate(*args) end end
7. Make a controller and route to test things out, using symbols from your translation for user messages:
# config/routes.rb ActionController::Routing::Routes.draw do |map| map.root :controller => 'home', :action => 'index' end # app/controllers/home_controller.rb class HomeController < ApplicationController def index flash[:notice] = :hello_flash end end
6. Create a view using symbols for user messages and use the "t" helper to translate:
# app/views/home/index.html.erb <h1><%=t :hello_world %></h1> <%=t flash[:notice] %> <%= link_to 'en-US', root_path(:locale => 'en-US') %> or <%= link_to 'pirate', root_path(:locale => 'pirate') %>
6. Fire up the old script/server and check it out:
~ $ script/server


I think that about covers it. Of course, this is a very simple example, but it should cover the basics well enough to get started. Please let me know if you have any ideas about how to simplify/improve this, and thanks again to the Rails i18n team for all of their work - everything looks great so far!











