我在使用引擎的应用中遇到了奇怪的行为。应用程序的语言环境转换文件会影响引擎的转换文件。
要使引擎的文件正常工作,我必须在应用程序中显式创建相同的文件。只是为它们命名相同的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.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
},
},
}
如何解决此问题?我不想在托管应用程序中显式创建相同的文件。我只想把它弄空,只有引擎让它有自己的翻译。因为它给发动机的使用者带来了额外的不便。
答案 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