Rails i18n如何获取特定键的所有值?

12
在Rails的i18n中,如何使用以下语句获取某个键的所有值:
translations = I18n.backend.send(:translations)

获取所有键

我需要能够获取特定部分,例如仅返回“home”下的所有内容。

en:
  home:
    test: test
4个回答

14

I18n.backend.send(:translations)的返回值只是一个哈希表,因此您可以通过传递相应的键来访问子集。

例如,如果您有:

en:
  foo:
    bar:
      some_term: "a translation"
      some_other_term: "another translation"   

然后,您可以使用以下代码获取哈希表 bar 下的子集:

I18n.backend.send(:translations)[:en][:foo][:bar]
#=> { :some_term=>"a translation", :some_other_term => "another translation"}

4
谢谢,我已经发现了同时使用 I18n.t('home') 也可以。 - Rubytastic
很好,谢谢!这对我非常有用,因为我正在寻找一种获取实际键名的方法。 - richddr

5
默认的 I18n 后端是 I18n::Backend::Simple,它不会将翻译暴露给你。(I18n.backend.translations 是一个受保护的方法。)
通常这不是一个好主意,但如果你真的需要这些信息,而且无法解析文件,那么可以扩展后端类。
class I18n::Backend::Simple
  def translations_store
    translations
  end
end

您可以调用I18n.backend.translations_store来获取解析后的翻译。虽然这可能不是一种长期策略,但它可以让您立即获得所需的信息。


1

设置I18n.locale然后执行I18n.t就可以正常工作,例如:

def self.all_t(string)
  I18n.locale = :en
  en = I18n.t("pages.home.#{string}")
  I18n.locale = :fr
  fr = I18n.("pages.home.#{string}")
  [en, fr]
end

0
来晚了,但我必须从Rails本地化文件中提取所有国家代码,上面的建议对于Rails 6和i18n 1.12不起作用。
事实证明,I18n :: Backend :: Simple上的方法现在是公共的,因此我们现在可以使用:I18n.backend.translations(do_init: true)来检索翻译哈希表。
因此,可以使用以下代码检索上述提到的节点:I18n.backend.translations(do_init: true)[:fr][:home] 希望这有所帮助。

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