Я только что понял, что рекомендуемый Rails способ установки локали в вашем контроллере
before_filter :set_locale
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
устанавливает локаль глобально.Приведенный выше код работает, но мне интересно, действительно ли это default_locale
по умолчанию, если вам нужно вводить его явно?
Что я ожидаю, так это иметь локаль для запроса (как у нас есть сеанс для запроса) и делатьчто-то вроде:
def set_locale
locale = params[:locale] if params[:locale]
end
И если I18n.default_locale
используется по умолчанию в противном случае.В идеале это будет соответствовать необязательной локали в пути:
# config/routes.rb
scope "(:locale)", :locale => /en|nl/ do
resources :books
end
На данный момент, если по какой-то причине я пропускаю настройку локали в каком-либо действии, она использует локаль, установленную в предыдущем запросе, который может быть от другого пользователя!
И нет ли потенциального состояния гонки, поскольку один запрос может изменить глобальный I18n.locale
, в то время как другой запрос (установив другой языковой стандарт до этого) находится в середине рендеринга?
ОБНОВЛЕНИЕ: Некоторые подробности, которые я нашел на данный момент, из документа I18n:
Устанавливает псевдоглобально текущую локаль, т. Е. В хеше Thread.current def locale = (locale)
Теперь я хочу понять, является ли каждый запрос отдельным потоком.
ОБНОВЛЕНИЕ 2: См. Мой ответ для объяснения.