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 файл, и все было исправлено.

надеюсь, это поможет кому-то в будущем!