Смешанные локали в Rails i18n - PullRequest
       1

Смешанные локали в Rails i18n

10 голосов
/ 03 февраля 2011

Rails как-то смешивает мои локали, и я понятия не имею, почему. Большинство моих переведенных строк работают как положено, но для некоторых это смешивает локали.

Интересно, что это происходит только в одной из наших систем. Специально запущенный Пассажир с Apache.

При использовании Webrick, Thin или Passenger Standalone в моей системе разработки все в порядке.

Это то, что у меня есть в application.rb:

config.i18n.default_locale = :de

Это в application_controller.rb:

before_filter :set_locale

def set_locale
  I18n.locale = @current_client ? @current_client.locale : I18n.default_locale
end

(у меня возникают проблемы на страницах, где @current_client равен nil и выполняется часть else).

Итак, я в основном использую :de локаль. При отображении ошибки проверки в форме я получаю смешанные переводы, такие как:

ist zu kurz (nicht weniger als 6 Zeichen) и перевод отсутствует: en.activerecord.errors.custom.password_format

Как видите, сообщение об ошибке первой неудачной проверки преобразуется, как и ожидалось, для второго сообщения об ошибке пытается получить доступ к английскому переводу (который не существует).

Я подозреваю, что проблема с отложенной загрузкой переведенных строк еще до выполнения before_filter.

Есть какие-нибудь подсказки, почему это может произойти?

Для справки: это Rails 3

EDIT

Я только что обнаружил, что это зависит от используемой среды. При использовании среды разработки все нормально. При использовании производственной среды (или производственной среды) я испытываю поведение, описанное выше.

РЕДАКТИРОВАТЬ 2 :

Я узнал еще больше: это конкретно зависит от config.cache_classes. Когда установлено true, я вижу смешанные переводы. При значении false (как в типичной среде разработки) i18n работает как положено.

РЕДАКТИРОВАТЬ 3 :

Может быть, это связано со следующей ошибкой?

https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/5522

Редактировать 4 :

Это связано с ошибкой, упомянутой выше, проблема связана с нетерпеливо загруженными модельными классами, которые используют строки I18n, но активная загрузка классов происходит до инициализации I18n, поэтому переводы не найдены. В этом есть еще одна ошибка:

https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/6353

К сожалению, ребята из Rails не смогли включить исправление в недавний выпуск 3.0.4 (насколько я могу судить). Поэтому я пытаюсь найти обходной путь, подобный этому (в конфигурации моего приложения):

 config.before_eager_load do
   I18n.load_path += Dir[Rails.root.join('config', 'locales', 'de.yml').to_s]
   I18n::Railtie.reloader.paths.concat I18n.load_path
   I18n::Railtie.reloader.execute_if_updated
   I18n.reload!
 end

Не повезло, это не работает. Любые подсказки?

Ответы [ 4 ]

14 голосов
/ 07 июня 2011

Эта проблема также может возникнуть в случае, если у вас есть Gem, который также использует I18n (у меня была эта проблема с active_admin).Rails устанавливает I18n слишком поздно, чтобы Gem мог использовать те же самые load_path.

Что я сделал, чтобы добавить это в production.rb:

config.before_configuration do
      I18n.load_path += Dir[Rails.root.join('config', 'locales', '*.{rb,yml}').to_s]
      I18n.locale = 'pt-PT'
      I18n.reload!
    end
2 голосов
/ 16 февраля 2011

Вот мой последний обходной путь, который, кажется, работает (поместите его в application.rb или один из ваших файлов конфигурации среды, если необходимо):

 # THIS IS A WORKAROUND FOR A I18N BUG IN RAILS!
 # Only required when cache_classes is set to true
 # See https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/6353
 config.before_eager_load do
   I18n.locale = :de
   I18n.load_path += Dir[Rails.root.join('config', 'locales', 'de.yml').to_s]
   I18n.reload!
 end

Надеюсь, это пригодится кому-то еще ...

EDIT:

Если это не работает для вас, попробуйте before_configuration вместо before_eager_load (см. Решение ниже). По крайней мере, снова работает как обходной путь для меня в Rails 3.0.10

0 голосов
/ 18 марта 2011

Обновление до rails 3.0.5 должно исправить это и подобные проблемы с I18n.

См .: https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/6353

0 голосов
/ 03 февраля 2011

Вы пробовали возиться с настройками метода вызова пассажира?Попробуйте установить его в консервативный режим, так что пассажир должен вести себя так же, как тонкий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...