Файлы локали приложения влияют на файлы локали Engine. Это заставляет иметь те же файлы в приложении хостинга. Как это исправить?

Я испытываю странное поведение в своем приложении с двигателем. Файлы перевода локали приложения влияют на файлы движков.

Чтобы файлы движка работали, я должен явно создать те же файлы в приложении. Достаточно просто назвать их одинаковыми, вставив в них пустой хэш локали.

Это каталог локали моего движка. У меня есть .rb файлов с переводами (не .yml):

# the directory:
engine/config/locale
                |
                -- en.rb
                -- ru.rb

# Translation files. ru.rb is the same.
# en.rb
{
  :en => {
    :foo => {
      :bar => "Bar",
    },
  },
}

В представлениях моего движка я называю переводы следующим образом:

<%= t("foo.bar") %>

Проблема в том, что у меня должны быть абсолютно одинаковые файлы в моем хостинг-приложении. Если каталог приложения /config/locales/ пуст (нет файлов en.rb и ru.rb), то у меня возникает ошибка I18n::InvalidLocaleData, даже если /config/locales/ движка выглядит так, как указано выше (оба файла присутствуют и верны).

Эти файлы перевода приложения могут иметь разное содержимое, но они должны присутствовать и иметь один и тот же ключ локали (:en или :ru). Например, этого достаточно для корректной работы файлов движка:

# app's translation files. ru.rb is the same.
# en.rb
{
  :en => {
      # even no content may be at all but an :en key has to be present
    },
  },
}

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


person Green    schedule 14.06.2013    source источник


Ответы (1)


Так я понял, где была проблема.

В файле engine.rb моего движка у меня был такой код для инициализации. Проблема была с приемником config. Поскольку я предоставляю блоку экземпляр app, получателем config является app. И это вызвало проблему:

initializer("my_engine.locales") do |app|
  tracking_logger = Logger.new(app.root.join('log', "my_engine_log.log"), 10, 30*1024*1024)
  config.i18n.load_path += Dir[root.join('my', 'locales', '*.{rb,yml}').to_s]
  config.i18n.default_locale = :ru
  config.i18n.fallbacks = [:en]
  tracking_logger.debug "MyEngine::Engine specific locale settings are set. Def locale == :ru\n\n"
end

Итак, я сменил приемник на MyEngine, и теперь все работает просто отлично:

initializer("my_engine.locales") do |app|
  tracking_logger = Logger.new(app.root.join('log', "my_engine_log.log"), 10, 30*1024*1024)
  MyEngine::Engine.config.i18n.load_path += Dir[root.join('my', 'locales', '*.{rb,yml}').to_s]
  MyEngine::Engine.config.i18n.default_locale = :ru
  MyEngine::Engine.config.i18n.fallbacks = [:en]
  tracking_logger.debug "MyEngine::Engine specific locale settings are set. Def locale == :ru\n\n"
end
person Green    schedule 14.06.2013