Я только понял, что рекомендуемый 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: См. мой ответ для объяснения.