2014-12-05 2 views
2

Я работаю над многоязычным рельсовым приложением, и мне нужно, чтобы маршруты были разными для каждой локали. Это трудно объяснить, как это для меня, поэтому я буду использовать пример:Маршруты маршрутов на основе языка

  • ан:/EN/расценки
  • эсов:/эс/цены

Я нашел этот ответ: Rails 4 i18n, how to translate routes where subdomain is used for the locale

Поэтому мой routes.rb выглядит следующим образом:

scope "/:locale" do    
    get "/", to: "pages#index", as: "index" 
    get "/#{I18n.t("pricing")}", :to => "pages#pricing", :as => "pricing" 
end 

Я также использую AppName::Application.reload_routes! при загрузке приложения (контроллер приложения before_action), но сразу после изменения локали остальная часть URI после/locale остается прежней - это создает проблему, когда пользователь пытается перезагрузить страницу, потому что она больше не существует. Другие клики в порядке, с новыми языковыми URI.

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

Заранее спасибо.

ответ

-1

У меня есть обезьяна-исправленная решение этой проблемы. Просто установите before_action confirm_path в контроллер приложения сразу после установки языкового стандарта.

def confirm_path 
    current_path = Rails.application.routes.recognize_path(request.env['PATH_INFO']) 
    MyApp::Application.reload_routes! 
    correct_url = url_for(controller: current_path[:controller], action: current_path[:action]) 
    if correct_url != request.original_url 
    redirect_to correct_url, status: 301 
    end 
end 

Я действительно не рекомендую этот ответ, и я знаю, что он не идеален. Используйте жемчужину вместо этого, как упомянуто @dgilperez. Я отправляю его на всякий случай, если кто-то в ситуации, когда слишком поздно реорганизовать ваш код.

1

Я использую драгоценный камень rails-translate-routes для этой точной цели на производственных площадках (Qoolife is an example you can check).

Если вы используете I18n в качестве внутреннего сервера перевода, он будет вести себя отлично. Если ваш проект также использует gettext, посмотрите на my fork of the gem. В качестве альтернативы вы можете посмотреть драгоценный камень route_translator.

С любым из них, код будет выглядеть очень похоже:

# config/routes.rb 
ActionDispatch::Routing::Translator.translate_from_file('config/locales/routes.yml') 

# config/locales/routes.yml 
en: 
    routes: 
    # you can leave empty locales, for example the default one 
es: 
    routes: 
    pricing: precios 

Затем вам нужно будет установить ваш locale из поддомена, используя маршрутную ограничение или в ApplicationController. Посмотрите на this issue, где это обсуждается.

+0

К сожалению, это не идеальное решение, оно требует драгоценного камня и переделать всю структуру. В идеале 'reload_routes!' Следует вызывать, когда пользователь нажимает на другой язык. Не могли бы вы предложить немного взломать это? Спасибо – kellins

+0

Я бы предпочел использовать хорошо протестированный камень для * взлома *. Я действительно был бы очень рад считать, что это «рефактор», а не «переделка» ... Также, вызывая '' reload_routes! '' Каждый раз, когда пользователь попадает в ресурс ... ну, это кажется не только уродливым и пропущенным -use для этого метода, это также требует, чтобы вы сделали некоторые «переделки». Я бы предложил вам вместо этого рассмотреть драгоценный камень. – dgilperez

+0

Кроме того, я просто понял, что вы притворяетесь, что включаете локали в маршрут вместо субдоменов. Это должно работать из коробки с драгоценным камнем. – dgilperez

Смежные вопросы