Могу ли я настроить маршруты, которые включают локаль и локаль по умолчанию в маршруте, если она не указана?

В настоящее время у меня есть маршрутизация, для которой требуется локаль (например, /en, /fr и т. д.). В какой-то момент я использовал все приведенные ниже операторы в route.rb:

scope "/:locale", locale: /#{I18n.available_locales.join("|")}/ do

scope "/:locale", defaults: { :locale => "en" } do

scope "/:locale" do

Я знаю, что если я сделаю следующее, если маршрут не включает языковой стандарт, он будет указывать на английскую версию веб-сайта. Однако он не устанавливает локаль, как я хочу, после отображения страницы. Если я перейду к французской версии, щелкнув логику локали, первая ссылка отобразит французскую версию страницы с /fr в ссылке. Однако, если я щелкну другую ссылку на французской странице, локаль вернется к английскому языку, а локаль будет исключена из ссылки.

scope "(/:locale)", defaults: { :locale => "en" } do

Вот код для моих ссылок на локали в моем приложении, где пользователь может щелкнуть изображение или текст флага, чтобы изменить локаль:

<%= link_to_unless_current image_tag("english.jpg", alt: "#{t :english}"), locale: "en" %> <%= link_to_unless_current "#{t :english}", locale: "en" %>
<%= link_to_unless_current image_tag("french.jpg", alt: "#{t :french}"), locale: "fr" %> <%= link_to_unless_current "#{t :french}", locale: "fr" %>

Что я хотел бы сделать, так это предотвратить системную ошибку 500, если случайно кто-то сохранил ссылку до того, как веб-сайт был локализован. Например, если у них есть http://mywebsite.com/video, будет отображаться английская версия веб-сайта и установлен локаль на "en".

Вот код, который у меня есть в application_controller.rb.

  before_filter :set_locale

  def default_url_options(options={}) 
    { :locale => I18n.locale }
  end

  private
    def set_locale
      I18n.locale = (params[:locale] if params[:locale].present?) || cookies[:locale] || 'en'
      cookies[:locale] = I18n.locale if cookies[:locale] != I18n.locale.to_s
    end

Я не нахожу ничего по этому конкретному вопросу, кроме использования драгоценного камня маршрутизации-фильтра. Я использовал гем, но пока не будет рабочей версии гем для Rails 4, у меня нет другого выбора, кроме как решить эту проблему с маршрутизацией.

Любая помощь будет оценена по достоинству.


person Pamela Cook - LightBe Corp    schedule 20.10.2013    source источник
comment
Вы пытались вручную установить локаль в ApplicationController с помощью before_filter? Я помню, что у меня были похожие проблемы с местными жителями, которые забывались в представлениях и прибегали к этому.   -  person Saifis    schedule 21.10.2013
comment
Я обновил свой вопрос тем, что у меня есть в ApplicationController. Он по-прежнему не устанавливает локаль в URL-адресе, если он отсутствует. У меня есть еще один вопрос о том, что пользовательские страницы ошибок не работают из-за отсутствующей локали. Он устанавливает локаль на номер ошибки. Я хочу настроить маршрутизацию, а не определять ее по компьютеру человека. Возможно, небольшое изменение в ApplicationController решит обе мои проблемы.   -  person Pamela Cook - LightBe Corp    schedule 21.10.2013


Ответы (1)


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

  1. не используйте 3 маршрута для локали

достаточно одного маршрута, прочтите руководства по интернационализации.

я думаю, что вам придется использовать дополнительный подход, поскольку вы хотите поддерживать устаревшие URL-адреса:

scope "(/:locale)" {}

  1. используйте опцию config.default_locale

в конфигурации можно настроить резервные копии для локализации.

  1. не смешивайте default_url_options и cookies

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

если у вас ДОЛЖНЫ быть URL-адреса, такие как domain.com/en/something, сделайте это наоборот. избегайте использования файлов cookie, используйте URL-адрес везде и перенаправляйте людей, приходящих с устаревшего URL-адреса.

person phoet    schedule 21.10.2013
comment
Я получаю ошибку сервера 500 без default_url_options. Вот почему я добавил его, как сказано в руководстве i18n. По умолчанию для config.i18n.default_locale используется английский язык. Это то же самое, что и config.default_locale? Как можно сохранить выбранную локаль на компьютере без использования куки? Я не хочу, чтобы пользователю каждый раз приходилось выбирать локаль. У меня много двуязычных пользователей. Я хочу, чтобы локаль была включена в URL-адрес, который я закодировал. Как перенаправить устаревшие URL-адреса и куда поместить код? Нужно ли мне перенаправлять каждый маршрут по отдельности или я могу проверить, отсутствует ли языковой стандарт в маршруте в целом? - person Pamela Cook - LightBe Corp; 21.10.2013
comment
Я работал над другими функциями и решил реализовать ваше предложение. Я пробовал это раньше, но получал неожиданные результаты. Я предполагаю, что у меня были другие ошибки. Он работает так, как я хочу. Когда люди щелкают ссылки на веб-сайте, они показывают язык, как я хочу. Однако, если кто-то захочет перейти по ссылке и забудет локаль, он перейдет на английскую версию. Я не устанавливал default_locale, так как по умолчанию для Rails используется английский язык. Большое спасибо! - person Pamela Cook - LightBe Corp; 09.11.2013