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"}}}
有什么方法可以避开 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"}}}