Vous pouvez en toute sécurité utilice url_for
pour changer de langue avec url params
si vous définissez only_path: true
:
<%= link_to I18n.t('language_name', locale: I18n.locale), url_for( params.clone.permit!.merge(locale: locale, only_path: true ) %>
Nous .clone
le site params
avant de les autoriser tous ( .permit!
), pour préserver les paramètres forts ailleurs. La seule solution plus sûre que je puisse trouver serait de mettre tous les paramètres sur une liste blanche, ce qui prendrait beaucoup de temps...
Mise en œuvre robuste de l'I18n :
Ajouter un locales.rb
pour définir ce que I18n.available_locales
que vous soutenez :
# config/initializers/locales.rb
# Permitted locales available for the application
I18n.available_locales = [:en, :fr]
Définir un language_name
dans le fichier de paramètres linguistiques de chaque langue (par ex. fr.yml
) :
fr:
language_name: "Français"
Au fur et à mesure que vous ajoutez des langues, cet ERB vous permettra de passer d'une langue à l'autre de manière générique :
// app/views/layouts/_languages.html.erb
<span class="languages">
<% I18n.available_locales.each do |locale| %>
<% if I18n.locale == locale %>
<%= link_to I18n.t('language_name', locale: locale), url_for( params.clone.permit!.merge(locale: locale, only_path: true ), {style: "display:none" } %>
<% else %>
<%= link_to I18n.t('language_name', locale: locale), url_for( params.clone.permit!.merge(locale: locale, only_path: true ) %>
<% end %>
<% end %>
</span>
Pour le contrôleur, nous trouvons automatiquement la langue correcte pour l'utilisateur en détectant les paramètres de son navigateur. Accept-Language
HTTP (en utilisant l'en-tête http_accept_language gemme).
Définir un session
pour préserver les paramètres locaux entre les requêtes.
Ou, en option, utilisez default_url_options
pour insérer le ?locale=
dans l'url de votre application. Je fais les deux.
Contrôleur :
class ApplicationController < ActionController::Base
before_action :set_locale
private
def set_locale
I18n.locale = begin
extract_locale ||
session[:locale] ||
http_accept_language.compatible_language_from(I18n.available_locales) ||
I18n.default_locale
end
session[:locale] = I18n.locale
end
def extract_locale
parsed_locale = params[:locale].dup
I18n.available_locales.map(&:to_s).include?(parsed_locale) ? parsed_locale : nil
end
def default_url_options
{ locale: I18n.locale }
end
end
0 votes
link_to "Refresh with a new GET param", params.merge( newKey: "newValue" )