1

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

为了使引擎的文件正常工作,我必须在应用程序中明确创建相同的文件。只需将它们命名为相同,在其中放置空的区域设置哈希就足够了。

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

如何解决这种行为?我不想在托管应用程序中明确创建相同的文件。我只想让它空,只有引擎让自己的翻译。因为它给引擎的用户带来了额外的不便。

4

1 回答 1

2

所以我想出了问题出在哪里。

在我的引擎engine.rb文件中,我有这样的初始化代码。问题出在config. 由于我为app块提供了一个实例,因此接收者configapp. 这导致了问题:

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
于 2013-06-14T20:07:27.393 回答