Changement de langue avec une URL dans Ruby on Rails 3
J'ai un site en français et en anglais. Je veux que l'utilisateur soit en mesure de changer de langue à la volée lorsqu'ils cliquent sur un lien dans l'en-tête. Assez simple.
J'ai suivi le Ruby on Rails 3, guide, et j'ai ceci:
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
Mes itinéraires ressembler à ceci:
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"
Et à mon avis je fais ceci:
<% if I18n.locale == I18n.default_locale %>
<%= link_to "English", '/en'%>
<% else %>
<%= link_to "Français", '/fr'%>
<%end%>
Tous fonctionne bien dans la page d'accueil, mais si j'essaie de passer de la langue alors que je suis dans un contrôleur spécifique, je le renvoi à la page d'accueil. J'ai essayé d'ajouter ceci:
<% if I18n.locale == I18n.default_locale %>
<%= link_to "English", '/en/' + params[:controller]%>
<% else %>
<%= link_to "Français", '/fr/' + params[:controller]%>
<%end%>
Cela résout le contrôleur, mais si nous sommes dans un domaine spécifique de l'action et de changement de langue à nouveau, je serai de retour à l'index de ce contrôleur.
Ma question: Quelle est la meilleure façon de traiter ce problème?
Je suppose que je pourrais mettre en place quelque chose dans le ApplicationController (filtre) pour vérifier si un contrôleur /action /id est transmis et l'ajouter à la locale. Ou puis-je le faire dans les itinéraires.rb?
Vous devez vous connecter pour publier un commentaire.
Eh bien, finalement trouvé un moyen que j'aime...
Aussi simple que cela!
Vive Ruby on Rails!
Si vous avez portée route comme ce qui couvre tous les localisée routes:
Si vous êtes dans une page à l'intérieur de cette étendue de route par exemple '/fr/... " vous pouvez créer des liens pour modifier les paramètres régionaux sans modification de votre site actuel endroit comme celui-ci:
:en
) provoqueActionController::RoutingError (No route matches {...})
sur ultérieure clique (testé dans les Rails 3.2.12). À l'aide de cordes, au lieu de résoudre le problème (:locale => 'en'
).Je crois que c'est plus propre. Donc, ici, il va:
config/application.rb
Créer un .fichier yml pour chaque :locale sur config/locales/:locale.yml
N'oubliez pas d'ajouter ce sur chacun des paramètres régionaux.yml fichiers, c'est comment l'
link_to t(lang)
est traduit lors du changement entre les emplacements.Ajouter à la liste des paramètres régionaux de votre code html:
Donc, maintenant vous pouvez voir tous les lieux que vous avez ajouté à config/application.rb
config/routes.rb:
app/controllers/index_controller.rb
app/controllers/application_controller.rb
De dire que vous voulez un sélecteur pour toutes les langues. E. g. Vous êtes dans
en
locale et vous avez égalementfr
etes
localesDans
application_helper.rb
(ou de toute autre aide dans /app/helpers/)Maintenant n'importe où dans la vue:
Si les paramètres régionaux de l'utilisateur est l'anglais, une URL est
www.example.com/en/path/
Cela va générer:De Plus, si vous souhaitez avoir le lien[] liens dans l'en-tête:
Qui va générer: