从gem动态加载I18n翻译到Rails引擎

9
我创建了一个宝石(TranslationsGem),在多个项目中使用它(引擎和Rails应用程序)。这个宝石设置了几个哈希,这些哈希加载到I18n后端中。
一个名为#store_dynamic_translations的方法设置了几个哈希,这些哈希加载到I18n后端中。它基本上是这样工作的:
I18n.backend.store_translations(:en, { test: { property: 'value' } })

我的测试确认了方法和翻译加载工作正常。但是我无法在主机引擎和Rails应用程序中使其工作。 在我的测试环境中,我必须在test_helper中执行该方法,以确保正确加载翻译。在测试环境之外,我似乎无法使其正常工作。我可以验证该方法已被执行,但翻译未加载。
我尝试了很多方法,比如在Engine initializer中执行该方法和使用ActiveSupport hooks。在主机Rails应用程序中,我尝试在初始化器中执行#store_dynamic_translations,但没有成功。
奇怪的是,如果我在我的Rails应用程序控制器或视图中执行#store_dynamic_translations,它就能正常工作。有没有办法在应用启动时设置这个?
编辑:我设置了一个示例存储库,其中包含当前设置。
  1. 一个将翻译动态存储到I18n后端的Gem。
  2. 一个加载该Gem并应该可用其翻译的Rails引擎
相关测试中取消注释MyI18n::Translations.store_dynamic_translations指令可以使测试通过。但我认为应该可以在引擎初始化器中完成这个操作?

我在SO上写了一篇回答,讲述了添加翻译的不同方法,你可以尝试创建一个特定的翻译后端,并使用链接方式添加它,如这里所描述的:https://dev59.com/XYLba4cB1Zd3GeqPg5_V#25387302 - Marc Lainez
Rails有一个可以调用的after_initialize钩子。或者你可以在应用程序控制器中的before_action块中调用它。 - ekampp
@EmilKampp,从我刚才运行的测试中看来,after_initialize 看起来确实有效!与我尝试过的所有其他钩子不同。今天将尝试进行验证。 - richard
好的,请告诉我进展如何。 - ekampp
1个回答

1
根据Emill Kampp的建议,正确的钩子是after_initialize。我在engine.rb中指定了这个钩子:
module Blorgh
  class Engine < ::Rails::Engine
    isolate_namespace Blorgh

    config.after_initialize do
      MyI18n::Translations.store_dynamic_translations
    end
  end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接