应用程序的语言环境文件会影响Engine的语言环境文件。它强制在托管应用程序中拥有相同的文件。如何解决?

时间:2013-06-14 18:03:13

标签: ruby-on-rails-3.2 rails-engines

我在使用引擎的应用中遇到了奇怪的行为。应用程序的语言环境转换文件会影响引擎的转换文件。

要使引擎的文件正常工作,我必须在应用程序中显式创建相同的文件。只是为它们命名相同的put空语言环境哈希就足够了。

这是我的引擎的语言环境目录。我有.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.rbru.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
    },
  },
}

如何解决此问题?我不想在托管应用程序中显式创建相同的文件。我只想把它弄空,只有引擎让它有自己的翻译。因为它给发动机的使用者带来了额外的不便。

1 个答案:

答案 0 :(得分:2)

所以我想出了问题所在。

我的引擎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