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

时间:2018-01-15 12:46:28

标签: ruby-on-rails hash rails-i18n

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

en:
  activemodel:
    attributes:
      post:
        title: Title
        message: Message
        tag: Tag
      user:
        name: Name
        email: Email

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

'activemodel.attributes.post.title'
'activemodel.attributes.post.message'
'activemodel.attributes.post.tag'
'activemodel.attributes.user.name'
'activemodel.attributes.user.email'

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

任何帮助都会非常感谢!

1 个答案:

答案 0 :(得分:2)

您可以使用递归方法处理package main import ( "fmt" ) func main() { a := [3]string{"a","b","c"} fmt.Println(a[0][0]) } 返回的翻译哈希:

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

然后运行:

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

您将获得一系列可用的翻译路径。如果你为没有翻译的语言运行它,你将获得一个空数组 - 如果你想以不同的方式处理它,你可以在lang_paths(:en) 中为没有翻译的语言环境引发错误。

希望有所帮助!