如何动态地向I18n添加值?

我的rails应用程序中有很多ymls,我想将其中一些用于其他服务,以便我可以从多个地方调用它。 这个调用的响应将是一个哈希。

{"en" : {"test" : {"text1" : "hi english"}, {"text2" : "mambo number %{num}"} }, "es" : {"test" : {"text1" : "hi espaniol"}, {"text2" : "mamboes numeros %{num}"} } } 

有没有办法可以将这个哈希加载到I18n翻译中

 I18n.add_translations(some_hash) 

所以我可以访问它们

 I18n.t("test.text1") I18n.t("test.text2", :num => 5) 

我怎么能实现它?

肮脏的方式

您可以通过自定义模块或gem覆盖I18n :: Backend :: Base中的load_translation方法,或者 – 咳嗽 – 猴子修补 – 咳嗽 – 从不同来源获取翻译,对我来说感觉很脏,但我想你可以尝试进一步尝试。

https://github.com/svenfuchs/i18n/blob/master/lib/i18n/backend/base.rb#L13

改变I18n后端

您可以创建一个实现预期行为的不同I18n后端,并通过初始化程序将其连接到I18n。 我假设这是像localeapp和phraseapp这样的工具。 在I18n :: Config中有一种方法

https://github.com/svenfuchs/i18n/blob/master/lib/i18n/config.rb#L23

所以你可以在初始化器中执行此操作

 I18n.backend = MyAwesomeI18nBackend.new 

好处是你可以将多个后端链接在一起

 I18n.backend = I18n::Backend::Chain.new(MyAwesomeI18nBackend.new) 

它确保您仍然可以访问默认的翻译后端或其他自定义后端。

参考

Ryan在解释如何改变后端的日子里做了很棒的回调。 它有点过时,但它让你很清楚需要做什么。

I18n后端

如果您的翻译与保存在数据库中的某些数据相关,您还可以使用globalize来处理这些数据。

https://github.com/globalize/globalize

编辑:Dima更简单的方式

如果您有哈希,则可以使用默认后端的store_translation方法从该哈希加载转换。

 I18n.backend.store_translations(:en, {test: "YOOOOOHHHHHOOOO"})