I am using subdomains to determine the locale in a Rails 4 website. I have this working with a locale switcher exactly the way I want it but now I need to translate the routes a
EDIT:
This gem is my recommended way to do it. Supports multiple languages without reloading the routes (Which my example didn't). You have to change very few things but it's more consistent than the code below. route translator
Original answer (not working):
This is what have worked for me, you can try it out, in your routes for example you can put:
AppName::Application.routes.draw do
get "/#{I18n.t("index")}", :to => "pages#index", :as => "index"
get "/#{I18n.t("contact")}", :to => "pages#contact", :as => "contact"
end
this will get you the routes in your default locale when you run the app, however in runtime, when you change your locale you need to redraw your routes in order to get the routes for the new locale.
I18n.locale = :es #different locale
AppName::Application.reload_routes!
Assuming your default_locale is :en
, this example will take the first routes from:
en:
index: "index-in-english"
contact: "contact-in-english"
and when the app reload the routes, it will take the translations from your new locale, in this example from
es:
index: "index-in-spanish"
contact: "contact-in-spanish"
This way you it will render pages#index and pages#contact and it'll only change the route, you don't have to touch your code. Hope this helps you
To translate routes in a Rails 4+ app, take a look at the route_translator gem. It allows translating routes and comes with a number of configuration options, such as adding a locale section to the generated paths, or support for subdomain based app.
From my experience, the domain should not be the only thing that determines the locale. It's so much easier if you just put the current locale into a cookie, so that the User can choose in the end!
Now to the translation-part of your question. I think you should change the way you are using the routing.
If you see the countries as resources, and the actions as a different part, you will make your life easier. The model to_param
method can help you with that:
resource :country do
get :weather, on: :member
...
end
That will result in urls like south-america/weather
but from my perspective, that is even better in terms of readability and search engine optimization. google used to like paths a lot.
For the different translations of your paths, you could iterate over your domains and provide a translation for each segment: http://guides.rubyonrails.org/routing.html#translated-paths