Mam witrynę w języku francuskim i angielskim. Chcę, aby użytkownik mógł przełączać język w locie po kliknięciu łącza w nagłówku. Całkiem proste.Przełącz język z adresem URL w Ruby on Rails 3
Śledzę Ruby on Rails 3 przewodnik, i mam to:
class ApplicationController < ActionController::Base
before_filter :set_locale
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
protect_from_forgery
def default_url_options(options={})
logger.debug "default_url_options is passed options: #{options.inspect}\n"
{ :locale => I18n.locale }
end
end
Moje trasy wyglądać następująco:
scope "(:locale)", :locale => /en|fr/ do
match 'home' => 'home#index'
match 'home/ajax_twitter' => 'home#ajax_twitter'
match 'equipe' => 'equipe#index'
match 'equipe/sylvain' => 'equipe#sylvain'
match 'equipe/benoit' => 'equipe#benoit'
match 'equipe/stephane' => 'equipe#stephane'
match 'equipe/suemarie' => 'equipe#suemarie'
match 'equipe/regis' => 'equipe#regis'
match 'equipe/fred' => 'equipe#fred'
match 'equipe/callback' => 'equipe#callback'
match 'equipe/auth' => 'equipe#auth'
match 'equipe/ajax_contact' => 'equipe#ajax_contact'
match 'linkedinauth/callback' => 'linkedinAuth#callback'
match 'linkedinauth/init_auth' => 'linkedinAuth#init_auth'
match 'mission' => 'mission#index'
match 'service' => 'service#index'
match 'developmen' => 'developmen#index'
match 'contact' => 'contact#index'
match 'mandats' => 'mandats#index'
end
match '/:locale' => "home#index"
I moim zdaniem zrobić to:
<% if I18n.locale == I18n.default_locale %>
<%= link_to "English", '/en'%>
<% else %>
<%= link_to "Français", '/fr'%>
<%end%>
Wszystko działa dobrze na stronie głównej, ale jeśli spróbuję zmienić język, gdy jestem w określonym kontrolerze, wracam do h ome page. Próbowałem dodać to:
<% if I18n.locale == I18n.default_locale %>
<%= link_to "English", '/en/' + params[:controller]%>
<% else %>
<%= link_to "Français", '/fr/' + params[:controller]%>
<%end%>
rozwiązuje ten kontroler, ale jeśli jesteśmy w konkretnym działaniu i ponownie zmienić język, wrócę do „indeksu” tego kontrolera.
Moje pytanie: Jaki jest najlepszy sposób, aby sobie z tym poradzić?
Chyba mógłbym zaimplementować coś w ApplicationController (filter), aby sprawdzić, czy kontroler/akcja/id jest przekazywany i dołączać do ustawień narodowych. Czy mogę to zrobić w routes.rb?
Dla niektórych symboli przyczyny używanie (np. ': en') powoduje, że' ActionController :: RoutingError (No route matches {...}) 'na ** kolejnych ** kliknięciach (testowane w Rails 3.2.12). Używanie łańcuchów rozwiązuje problem (': locale => 'en''). – user569825
jest to bardziej przydatna odpowiedź, ponieważ dotyczy istniejącego kontekstu, tj. Params. i łączenie ich z ustawieniami narodowymi, które są parametrem na poziomie meta ... – Jerome