Как использовать гем route_translator и не требовать локали?

Я могу успешно использовать гем route_translator, когда мне нужна локаль. Когда я переключаюсь между двумя локалями, которые у меня есть (en: fr), у меня нет проблем с нажатием любой из ссылок и отображением правильных представлений и переводов ссылок.

Вот мой файл config/routes.rb, в котором мои маршруты работают как положено.

MyRailsApp::Application.routes.draw do  

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

#    resources :pages

    localized do
#      resources :pages
      match "/about",      to: "pages#about", via: "get"
      match "/clients",    to: "pages#clients", via: "get"
      match "/contact",    to: "pages#contact", via: "get"
      match "/manage",     to: "pages#manage", via: "get"
      match "/media",      to: "pages#media", via: "get"
      match "/privacy",    to: "pages#privacy", via: "get"
      match "/system",     to: "pages#system", via: "get"
      match "/testpage",   to: "pages#testpage", via: "get"
    end

  end

  root                     to: "pages#home", via: :get
  match "/:locale" => "pages#home", via: :get, :as => "locale_root"

end

Вот логика локали в app/controllers/application_controller.rb, которая по умолчанию устанавливает локаль en, если локаль не найдена.

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  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] || I18n.default_locale || 'en'
      cookies[:locale] = I18n.locale if cookies[:locale] != I18n.locale 
    end

end

rake routes:

   about_fr GET  /:locale/qui_sommes_nous(.:format) pages#about {:locale=>"fr"}
   about_en GET  /:locale/about(.:format)           pages#about {:locale=>"en"}
 clients_fr GET  /:locale/clients(.:format)         pages#clients {:locale=>"fr"}
 clients_en GET  /:locale/clients(.:format)         pages#clients {:locale=>"en"}
 contact_fr GET  /:locale/contactez_nous(.:format)  pages#contact {:locale=>"fr"}
 contact_en GET  /:locale/contact(.:format)         pages#contact {:locale=>"en"}
  manage_fr GET  /:locale/gerer(.:format)           pages#manage {:locale=>"fr"}
  manage_en GET  /:locale/manage(.:format)          pages#manage {:locale=>"en"}
   media_fr GET  /:locale/edition(.:format)         pages#media {:locale=>"fr"}
   media_en GET  /:locale/media(.:format)           pages#media {:locale=>"en"}
 privacy_fr GET  /:locale/confidentialite(.:format) pages#privacy {:locale=>"fr"}
 privacy_en GET  /:locale/privacy(.:format)         pages#privacy {:locale=>"en"}
  system_fr GET  /:locale/systeme(.:format)         pages#system {:locale=>"fr"}
  system_en GET  /:locale/system(.:format)          pages#system {:locale=>"en"}
testpage_fr GET  /:locale/testpage(.:format)        pages#testpage {:locale=>"fr"}
testpage_en GET  /:locale/testpage(.:format)        pages#testpage {:locale=>"en"}
       root GET  /                                  pages#home
locale_root GET  /:locale(.:format)                 pages#home

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

`rake routes` with `(/:locale)`:

   about_fr GET  /fr(/:locale)/qui_sommes_nous(.:format) pages#about {:locale=>"fr"}
   about_en GET  (/:locale)/about(.:format)              pages#about {:locale=>"en"}
 clients_fr GET  /fr(/:locale)/clients(.:format)         pages#clients {:locale=>"fr"}
 clients_en GET  (/:locale)/clients(.:format)            pages#clients {:locale=>"en"}
 contact_fr GET  /fr(/:locale)/contactez_nous(.:format)  pages#contact {:locale=>"fr"}
 contact_en GET  (/:locale)/contact(.:format)            pages#contact {:locale=>"en"}
  manage_fr GET  /fr(/:locale)/gerer(.:format)           pages#manage {:locale=>"fr"}
  manage_en GET  (/:locale)/manage(.:format)             pages#manage {:locale=>"en"}
   media_fr GET  /fr(/:locale)/edition(.:format)         pages#media {:locale=>"fr"}
   media_en GET  (/:locale)/media(.:format)              pages#media {:locale=>"en"}
 privacy_fr GET  /fr(/:locale)/confidentialite(.:format) pages#privacy {:locale=>"fr"}
 privacy_en GET  (/:locale)/privacy(.:format)            pages#privacy {:locale=>"en"}
  system_fr GET  /fr(/:locale)/systeme(.:format)         pages#system {:locale=>"fr"}
  system_en GET  (/:locale)/system(.:format)             pages#system {:locale=>"en"}
testpage_fr GET  /fr(/:locale)/testpage(.:format)        pages#testpage {:locale=>"fr"}
testpage_en GET  (/:locale)/testpage(.:format)           pages#testpage {:locale=>"en"}
       root GET  /                                       pages#home
locale_root GET  /:locale(.:format)                      pages#home

Единственные маршруты, с которыми у меня возникают проблемы, - это те, которые находятся в инструкции localize do. Они включают все мои доступные локали, когда я переключаюсь между en и fr.

Я посмотрел конфигурации в GitHub. но я не видел ничего, что могло бы решить мою проблему. Описания конфигураций ничего не говорят ясно, что заставляет меня думать, что они решат мою проблему.


person Pamela Cook - LightBe Corp    schedule 19.05.2015    source источник


Ответы (1)


У меня была такая же проблема... решение.

Измените свой файл ..\config\routes.rb на это:

MyRailsApp::Application.routes.draw do  

    localized do

      match "/about",      to: "pages#about", via: "get"
      match "/clients",    to: "pages#clients", via: "get"
      match "/contact",    to: "pages#contact", via: "get"
      match "/manage",     to: "pages#manage", via: "get"
      match "/media",      to: "pages#media", via: "get"
      match "/privacy",    to: "pages#privacy", via: "get"
      match "/system",     to: "pages#system", via: "get"
      match "/testpage",   to: "pages#testpage", via: "get"
      match "/",           to: "pages#home", via: "get", :as => :locale_root
    end
    root to: "pages#home", via: :get

end

Вам просто нужно удалить scope вокруг localized.

Также добавьте следующее в файл application.rb.

RouteTranslator.config do |config|
  config.force_locale = true
  config.locale_param_key = :locale
end

На этом вы закончите со следующими маршрутами:

about_fr GET  /fr/qui_sommes_nous(.:format) pages#about {:locale=>"fr"}
about_en GET  /en/about(.:format)           pages#about {:locale=>"en"}
...
root_fr GET  /fr                                pages#home {:locale=>"fr"}
root_en GET  /en                                pages#home {:locale=>"en"}
root    GET  /                                  pages#home 
person MaHebert    schedule 28.05.2015
comment
Работал отлично! Спасибо! Теперь я хочу посмотреть, смогу ли я использовать это и не требовать, чтобы локаль по умолчанию была en. - person Pamela Cook - LightBe Corp; 29.05.2015