I18n 翻译查找中的转义点 (.)

Escape dot (.) from I18n translation look up

有什么方法可以避开 I18n 点吗? 我有包含点的键,但似乎无法找到正确查找的方法。

谢谢

根据我的经验,当您的数据存储(mongodb 或在本例中为 i18n)以特殊方式处理键中的点时,最好的方法是不要与之抗争。我的建议是将您的虚线键扩展到 i18n 期望的树中。所以这个

projects.form.title: Create new project

变成这样

projects:
  form:
    title: Create new project

或者您可以将键中的点替换为下划线。用 html 实体 (.) 替换它们,或者更糟的是,unicode 相似物只会导致混淆 and/or 错误。

我在从 non-YAML 来源加载翻译时遇到了同样的问题,其中句点语法比树关系更方便。您可以使用以下代码将密钥转换为 I18n 加载的一部分(在 I18n.load_path 中的 .rb 文件或自定义后端中)。

require 'i18n/core_ext/hash'

# Raw, period-delineated keys (from a DB, API, etc.):
translations = {
  'a.b.c' => 'foo',
  'd.e.f' => 'bar'
}

translations.inject({}) { |hash, (key, value)|
  item = key.split('.').reverse.inject(value) { |v, k| { k => v } }
  hash.deep_merge!(item)
}
$ => {"a"=>{"b"=>{"c"=>"foo"}}, "d"=>{"e"=>{"f"=>"bar"}}}