Lien vers la page actuelle avec différentes locales
Testé sur Rails 4
Bonjour à tous. Après quelques temps de recherche, je décide d'écrire ma propre solution pour ce problème.
link_to 'English', url_for( :locale => 'en' )
link_to 'Deutch', url_for( :locale => 'de' )
Cela fonctionne parfaitement, mais cela permet Vulnérabilité XSS Il suffit de passer des paramètres dans votre URL comme ci-dessous :
http://localhost:3000/en/about?host=www.fishingsiteorbadurl.com/%23&port=80
Ou dans le pire des cas :
http://localhost:3000/en/about?host=%D0%BE%D1%87%D0%B5%D0%BD%D1%8C%D0%BF%D0%BB%D0%BE%D1%85%D0%BE%D0%B9%D1%81%D0%B0%D0%B9%D1%82.%D1%80%D1%84
Vérifiez les URLs que vous obtiendrez en passant par ce lien dans votre application.
Ma solution de production. La méthode "changer de langue" redirige vers n'importe quelle page avec la bonne locale en utilisant HTTP_REFERER dans l'objet de la demande. Attention : la méthode URI.path ne permet de récupérer que le chemin d'accès, pas l'url entière.
Faites la méthode "changer la langue" dans n'importe quel contrôleur :
def change_lang
if request.referer.nil?
refer = root_url
else
uri = URI(request.referer)
refer = uri.path
end
lang = params[:lang]
cookies[:locale] = lang
redirect_to refer
end
application_controller.rb
before_action :set_locale
def set_locale
# -- Get lang from cookies or url parameter locale
user_locale = cookies[:locale] || params[:locale]
# -- If present
if user_locale.present?
# -- If it is has 2 symbols
user_locale = user_locale.scan(/[a-zA-Z]{2}/)
else
# -- If no - use default en locale
user_locale = 'en'
end
# -- Check, is this locale available for using.
# Please note: this needed for disable invalid locale warning.
if I18n.available_locales.include?(user_locale[0].to_sym)
I18n.locale = user_locale[0]
else
I18n.locale = "en"
end
end
ajoutez ceci à votre mise en page
<%= link_to 'English', change_lang_path('en') %> <%= link_to 'Russian', change_lang_path('ru') %>
config/routes.rb
scope "(:locale)", locale: /[a-zA-Z]{2}/ do
get "change_lang/:lang" => "users#change_lang", :as => "change_lang"
end
Il n'est pas nécessaire d'utiliser params.merge ou toute autre solution de fortune.
J'espère que cela vous aidera, car j'ai personnellement passé beaucoup de temps à le résoudre.
0 votes
link_to "Refresh with a new GET param", params.merge( newKey: "newValue" )