如何动态地向I18n添加值?

时间:2014-08-19 15:09:39

标签: ruby-on-rails ruby translation rails-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)

我怎样才能实现它?

1 个答案:

答案 0 :(得分:7)

肮脏的方式

您可以通过自定义模块或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 Backends

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

https://github.com/globalize/globalize

编辑:Dima的简单方法

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

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