如何动态地向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"})