Search code examples
ruby-on-railsrubyruby-on-rails-3internationalizationi18n-gem

Prosy thing with I18n and redirects (RoR) locales parameter is changing


I tried to implement 'change language' feature at my app. I've looked through official guide http://guides.rubyonrails.org/i18n.html and everything was clear for me. Unfortunatly I dont know how to fix one issue. For example when I am accessing login form through link /en/login everything is fine till I click on submit form.

After redirection param[:locale] is not passed as expected and I am getting default locales. Is there any "Rails-way" soultion to redirect with previously chosen locales? I guess that it is possible to pass every time param to redirect_to but its kinda problematic to do on every controller.

My routes:

    scope "(:locale)", :locale => /pl|en/ do
      devise_for :users
      resources :pages
      get "/login"    => "sessions#new"
      post "/users/sign_in"    => "sessions#create"
      delete "/users/sign_out" => "sessions#destroy"
      root :to => "pages#index"
      resources :websites
    end
      match '/:locale' => 'pages#index'

App controller:

    class ApplicationController < ActionController::Base
      protect_from_forgery
      before_filter :set_locale

      def set_locale
         I18n.locale = params[:locale] || I18n.default_locale
      end

    end

Solution

  • as the same guide is recommending, you can add

    class ApplicationController < ActionController::Base
    def default_url_options(options={}) 
        { :locale => I18n.locale } 
    end
    

    It will redirect your user to the proper localised root page

    localhost:3000/?locale=pl
    localhost:3000/?locale=en
    ....