Ruby on Rails + Devise + I18n: как установить локаль?
Я использую before_filter в ApplicationController для установки локали для моего приложения:
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter :set_locale
def set_locale
I18n.locale = request.compatible_language_from ["uk", "ru", "de", "en"]
end
end
это работает для контроллеров, которые написаны мной. Но все сообщения devise по-прежнему на английском языке.
задание config.i18n.default_locale = "uk"
(или других) в config/application.rb
работает, поэтому я думаю, что проблема в том, что контроллер devise не использует мой before_filter (возможно, он не наследует ApplicationController
на всех (?)).
как решить эту проблему? Как заставить devise использовать мой локаль?
3 ответов
взгляните на Devise Wiki https://github.com/plataformatec/devise/wiki/I18n У них есть много образцов файлов YML.
Если вы все еще хотите написать свой собственный, попробуйте использовать что-то подобное в своих файлах i18n
en:
devise:
sessions:
signed_in: 'Signed in successfully.'
подробнее на GitHub https://github.com/plataformatec/devise#i18n
вам нужно использовать prepend_before_action
(или prepend_before_filter
но это псевдоним prepend_before_action
и скоро будет устаревшим), поэтому у вас должно быть что-то вроде:
class ApplicationController < ActionController::Base
protect_from_forgery
prepend_before_action :set_locale
private
def set_locale
I18n.locale = request.compatible_language_from [:uk, :ru, :de, :en]
end
end
Примечание что это может сломать I18n.locale
в ваших представлениях, поэтому вам может потребоваться установить его в дополнительном before_action
.
у меня была эта проблема, когда мои французские локали devise загружались для всех, и проблема заключалась в том, что мои локали devise были изначально построены в их собственном файле - devise.en.yml
. Я переместил их в en.yml
файл, и все было исправлено.
надеюсь, это поможет кому-то в будущем!