Rails 3.1 - Translating routes
October 26, 2011
This post was originally published in the Rambling Labs Blog on October 26, 2011.
Today, I was wondering if there would be a way to add translated routes automatically in Ruby on Rails. This is for a project I’m currently working on, whose users speak mostly spanish, so I want to make them happy with urls like “/contacto”, “/quienes-somos” and “/trabajos/1” instead of “/contact”, “/about-us”, and “jobs/1”.
So, I googled and there it was: the i18n_routing gem.
This reminded me one more time how awesome is the Ruby community, which is definitely one of the main reasons why I’m loving Ruby and Rails so much.
So back on topic, the gem is easy to install, and only depends on the i18n gem. Run
gem install i18n_routing and you should be good to go. It supports rails 2.x as well as 3.x.
Now, for adding the translated routes, you have to wrap your routes in this:
localized(I18n.available_locales) do # Your routes here # This are just test routes resources :users, :jobs resource :contact match 'home' => 'jobs#index' end
Then, and this is the most pleasing aspect of the gem, just add your translations to the locale file that you need! In my case, it’s gonna be the
config/locales/es.yml. Like this:
es: resources: users: 'usuarios' resource: contact: 'contacto' named_routes: about-us: 'quienes-somos' routes: jobs: as: 'trabajos' path_names: new: 'nuevo' edit: 'editar'
Note the correspondence between the routes methods and the routes translation tree. The
resources and the
resource correspond to the
resource methods used when defining the routes. Similarly, the
named_routes corresponds to the
match match. And finally, the
routes is a subtree, containing the resource and it’s path names.
That is all… Nice, right?!
You might find more info about it in their wiki.
Oh, I almost forgot. For debugging, you can add a second parameter
verbose: true to the
localized method. The routes configuration will be printed out when starting the rails console, the application, and even when running the migrations.