Как избежать добавления локали по умолчанию в сгенерированных URL-адресах?
Если вы следуете I18N Rails Guide, все сгенерированные ссылки содержат параметр locale (localhost/en/about, localhost/fr/about), Это связано с тем, что мы используем метод default_url_options
, чтобы всегда добавлять параметр Locale:
def default_url_options(options={})
{ :locale => I18n.locale }
end
Можно ли удалить параметр локали из сгенерированного URL-адреса, если локаль неизвестна или по умолчанию?
Что мне нужно:
- Неизвестно локаль:
mysite/about
- Локаль ru:
mysite/about
(а не localhost/en/about
)
- Локаль fr:
mysite/fr/about
Я попытался установить только локаль, если она не была стандартной по умолчанию, но результатом является то, что сгенерированные ссылки никогда не содержат параметр locale...
Я пробовал много вещей, подобных этому
def default_url_options(options={})
if I18n.locale == :fr
{ :locale => I18n.locale }
else
{ :locale => nil }
end
end
Целый код:
ApplicationController.rb:
before_filter :set_locale
def set_locale
I18n.locale = params[:locale]
end
def default_url_options(options={})
{ :locale => I18n.locale }
end
routes.rb
scope "(:locale)", :locale => /en|fr/ do
match 'about' => 'static_pages#about', :via => :get
match 'contact' => 'static_pages#contact', :via => :get
match '/' => 'search#index', :as => :search
end
root :to => 'search#index'
Ответы
Ответ 1
Хорошо, я понимаю намного лучше. Действительно, вы почти это сделали.
Вам просто нужен очень полезный оператор в Ruby: ||
Если первое значение существует, оно используется, в противном случае учитывается второй аргумент.
def set_locale
I18n.locale = params[:locale] || :en
end
Ответ 2
Выбранный ответ абсолютно прав и предоставляет все необходимое для перенаправления URL-адресов без локали в ваш стандарт по умолчанию, но я хотел сделать что-то еще немного и решил, что я поделился бы им с вами.
Мне не хотелось вообще использовать стандартную локаль, т.е.
-
mysite.com/en/page
должен быть таким же, как
-
mysite.com/page
И все ссылки при просмотре из локали по умолчанию НЕ должны включать языковой стандарт, то есть mysite.com должен иметь ссылки, которые не включают в себя локаль (en) по умолчанию в них. Вместо ссылки mysite.com
на
-
mysite.com/en/page
он должен ссылаться на
-
mysite.com/page
Я достиг этого с помощью следующих изменений до default_url_options
:
def default_url_options(options={})
{ :locale => ((I18n.locale == I18n.default_locale) ? nil : I18n.locale) }
end
Вы должны определить config.i18n.default_locale
в config/application.rb, чтобы это работало. Вы также можете назначить резервные копии для неподдерживаемых локалей через config.i18n.fallbacks = [ :en ]
, где этот массив является упорядоченным по приоритету списком языков для возврата к.
Ответ 3
Rails 4 + https://github.com/svenfuchs/routing-filter
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
def default_url_options(options = {})
(I18n.locale.to_sym.eql?(I18n.default_locale.to_sym) ? {} : {locale: I18n.locale}).merge options
end
Ответ 4
Я знаю, что это не совсем ваш вопрос, но...
Я предпочитаю другой путь для интернационализации: Установка локали из имени домена
Пример: mysite.com/about, mysite.fr/about
Для меня это лучший способ, но вам нужно купить все домены.