2016-07-07 3 views
0

Я сделал интернационализацию своего сайта. я использовал https://github.com/enriclluelles/route_translatorИзменение языкового стандарта, но остающееся на текущей странице

Каждое звено работает в зависимости от текущей локали

У меня есть 2 кнопки, как это: EN | FR

Вы можете нажать на нее, чтобы изменить локаль. Это работает так:

if I18n.locale == :fr 
    link_to('en', root_en_path) 
    else 
    link_to('fr', root_fr_path) 
    end 

Единственная проблема заключается в том, что, если я нахожусь на определенной странице в моем веб-сайте и изменить региональные настройки, это будет возвращение к root_path

То, что я хочу, чтобы остаться на той же странице.

Например: У меня есть how_it_works страница

Если я в /fr/how_it_works Я хочу кнопку EN связать с /en/how_it_works

Мне сказали, чтобы передать локаль как парам, но я не Не хочу, потому что я не хочу иметь большую ссылку, например /fr/how_it_works?locale=en, и я уверен, что это плохой дизайн.

ответ

0

После некоторых исследований, я нашел основной способ сделать это. Сначала я подумал, что эта вещь уже реализована в route_translator, но, по-видимому, нет.

Решение:

if I18n.locale == :fr 
    en_uri = request.fullpath.gsub('/fr', '/en') 
    good_link = en_uri[0, 3] == '/en' ? en_uri : root_en_path 
    link_to('en', good_link) 
    else 
    fr_uri = request.fullpath.gsub('/en', '/fr') 
    good_link = fr_uri[0, 3] == '/fr' ? fr_uri : root_fr_path 
    link_to('fr', good_link) 
    end 
1

Совет, который вам дал, был бы лучшим подходом, и нет, вы бы не использовали как вы думали.

Rails.application.routes.draw do 
    scope ':locale', constraints: { locale: /(en|fr)/ } do 
    #define all your scopeable routes within here 
    end 
end 

Таким образом, вы можете посетить /en/how-it-works или /fr/how-it-works. В вашем ApplicationController вы можете сделать before action :set_locale, где вы должны установить локаль как params[:locale].

Надеюсь, что он станет более ясным и решит вашу проблему.

UPDATE

Не могу понять, лучший способ достижения этой цели, но вот так я мог сразу работать:

url_params = params.to_h 
if I18n.locale == :fr 
    link_to('en', url_params.merge(locale: :en)) 
else 
    link_to('fr', url_params.merge(locale: :fr) 
end 
+0

я уже могу посетить эти ссылки, это не проблема. Проблема в том, что я не знаю, как вызвать текущую страницу/путь, как этот '/ fr/current_path' – Charlon

+0

только что обновил мой ответ – oreoluwa