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
Не повезло, это не работает. Любые подсказки?