Search code examples
ruby-on-railsrubyrails-i18nglobalize

rails 4, globalize gem, how to setting default locale


I'm using the globalize gem to support multiple locales.

config/locales directory have three file

en.yml,  ja.yml, ch-HK.yml

and my routing file is

....
root :to => 'main#index', :locale => :en
 scope ":locale", locale: /#{I18n.available_locales.join("|")}/ do
   namespace(:api){ resources :badges }
   namespace(:api){
     resources :events do
       get :list, :on => :collection
     end 
   }   
end 
....

my root path (/) is setting default locales

but I don't know how to setting default locales in api_controller

I wanna

/api/events.json ->> /en/api/event.json
/ja/api/events.json ->> /ja/api/events.json

is it not accept in rails Project?

must add /:locales/api~~ ?


Solution

  • Every request is passed through a controller and that's the place for setting default locale. All you need to do is to set I18n.locale = :locale. There are various methods of detecting user locale, i.e. request header, user preferred language (if logged and stored). You can also check for request format (in case of API) and set locale accordingly. Setting locale for url is not necessary here.

    Here's a piece of code I'm using for setting locale:

    before_filter :set_locale
    
    def set_locale
      if defined?(params) && params[:locale]
        I18n.locale = params[:locale]
      elsif current_user && current_user.language_id.present?
        I18n.locale = current_user.language.code
      elsif defined?(request)
        I18n.locale = extract_locale_from_accept_language_header
      end
      I18n.locale ||= I18n.default_locale
      I18n.locale = :en unless valid_languages.include?(I18n.locale.to_sym)
    end