列出给定语言的所有翻译 yml 键

use*_*239 2 hash ruby-on-rails rails-i18n

所以我的应用程序中有一个翻译文件,如下所示:

en:
  activemodel:
    attributes:
      post:
        title: Title
        message: Message
        tag: Tag
      user:
        name: Name
        email: Email
Run Code Online (Sandbox Code Playgroud)

我想获得所有可用关键字符串的列表,因此对于本示例,我将获得以下内容:

'activemodel.attributes.post.title'
'activemodel.attributes.post.message'
'activemodel.attributes.post.tag'
'activemodel.attributes.user.name'
'activemodel.attributes.user.email'
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用 获得所有翻译的哈希值I18n.backend.send(:translations)[:en],但我不确定如何获得每条路径。

任何帮助都会非常感谢!

小智 5

您可以I18n.backend.send(:translations)[:en]使用递归方法处理返回的翻译哈希:

def key_paths(key, hash_or_string)
  if hash_or_string.is_a?(Hash)
    hash_or_string.keys.map do |subkey|
      key_paths([key, subkey].compact.join("."), hash_or_string[subkey])
    end
  else
    key
  end
end
Run Code Online (Sandbox Code Playgroud)

这递归地处理散列,为遇到的子散列嵌套键,以建立您正在寻找的路径。当一个子值不是一个散列值(即它是一个字符串翻译)时,它会返回构建的键,直到它到达嵌套的末尾。

然后,您可以将其打包以使用另一种辅助方法查找给定语言的路径:

def lang_paths(lang)
  key_paths(nil, I18n.backend.send(:translations)[lang] || {}).flatten.sort
end
Run Code Online (Sandbox Code Playgroud)

如果你然后运行:

lang_paths(:en)
Run Code Online (Sandbox Code Playgroud)

你会得到一个可用翻译路径的排序数组。如果您为没有翻译的语言运行它,您将得到一个空数组 -lang_paths如果您想以不同的方式处理没有翻译的语言环境,您可能会引发错误。

希望有帮助!