如何从Rails I18n中的yml文件中检索所有翻译

Tia*_*ago 32 yaml ruby-on-rails internationalization rails-i18n

我猜测rails将所有解析后的翻译yml文件存储在一种数组/哈希中.有没有办法访问这个?

例如,如果我有一个文件:

en:
  test_string: "testing this"
  warning: "This is just an example
Run Code Online (Sandbox Code Playgroud)

我可以做一些像I18n.translations_store [:en] [:test_string]的事吗?我可以使用YAML :: load解析yml文件,但在我的情况下,我已经将子文件夹中的yml文件拆分为组织,我很确定rails已经解析了它们.

bal*_*alu 60

你必须在后端调用私有方法.这是您访问的方式:

translations = I18n.backend.send(:translations)
translations[:en][:test_string] # => "testing this"
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果后端未初始化,即"尚未将其用于其他任何内容",则"translations"将为空.如果您打开一个新控制台并尝试加载翻译,您将看到这一点.你可以通过`I18n.t(:foo)来绕过它; translations = I18n.backend.send(:translations)`(即使你没有'foo`翻译).我相信有更好的方法. (27认同)
  • 您不需要使用私有方法.只需调用`I18n.t('.')` (17认同)
  • 非常感谢.如果后端尚未初始化并且散列为空,则可以用这种方式初始化它:`I18n.backend.send(:init_translations),除非I18n.backend.initialized? (12认同)

Eri*_* H. 18

根据8xx8的评论,更简单的版本:

I18n.t(:foo)
I18n.backend.send(:translations)[:en][:test_string]
Run Code Online (Sandbox Code Playgroud)

I18n.t(".")[:test_string]
Run Code Online (Sandbox Code Playgroud)

这减轻了必须预加载翻译或指定语言环境.