类似的问题,但对于java,Keeping i18n resources synced
如何保持i18n yaml本地人的密钥同步?即当一个键被添加到en.yml时,如何将它们添加到nb.yml或ru.yml?
如果我在my_label: "some text in english"
旁边添加密钥my_title: "a title"
,我想将其发送给其他本地人我指定,因为我无法完成所有翻译和它应该用其他语言回归英语
例如 en.yml
somegroup:
my_tile: "a title in english"
my_label: "some text in english"
othergroup:
...
我想发出命令并将整个键和值注入挪威语翻译和相应位置,如果遗漏的话。然后git diff
会显示所有使用此语言的翻译。
nb.yml
somegroup:
my_tile: "En tittel på norsk"
+ my_label: "some text in english"
othergroup:
...
有没有宝石做这样的事情?如果你认为这是一个好主意,也许我应该花点时间自己做。其他方法?
答案 0 :(得分:1)
试试i18n_translation_spawner宝石,它可能会有所帮助。
答案 1 :(得分:1)
我将检查i18n_translation_spawner gem。如果有人需要一个不那么快但做的工作,我会使用这个脚本:
首先我们扩展Hash类以支持deep_merge并用一些字符串替换所有叶值。
require 'yaml'
class Hash
def deep_merge(hash)
target = dup
hash.keys.each do |key|
if hash[key].is_a? Hash and self[key].is_a? Hash
target[key] = target[key].deep_merge(hash[key])
next
end
target[key] = hash[key]
end
target
end
def fill_all_values value
each_key do |key|
if self[key].is_a?(String)
store(key,value)
else
self[key].fill_all_values value
end
end
end
end
现在我们可以使用我们的翻译合并:
def merge_yaml_i18n_files(locale_code_A,locale_code_B,untranslated_message)
hash_A = YAML.load_file("i18n/#{locale_code_A}.yml")
hash_B = YAML.load_file("i18n/#{locale_code_B}.yml")
hash_A_ut = Marshal.load(Marshal.dump(hash_A))
hash_A_ut.fill_all_values(untranslated_message)
hash_B_ut = Marshal.load(Marshal.dump(hash_B))
hash_B_ut.fill_all_values(untranslated_message)
hash_A = hash_B_ut.deep_merge(hash_A)
hash_B = hash_A_ut.deep_merge(hash_B)
puts hash_A.to_yaml
puts hash_B.to_yaml
end
最后,我们将此方法称为:
merge_yaml_i18n_files('en','es','untranslated')
如果我们在以下i18n文件中应用此功能:
es.yaml
test:
hello: Hola
only_es: abc
en.yaml
test:
hello: Hello
only_en: def
结果将是:
es.yaml
test:
hello: Hola
only_en: untranslated
only_es: abc
en.yaml
test:
hello: Hello
only_en: def
only_es: untranslated
答案 2 :(得分:1)
您可以使用i18n-tasks gem。
它扫描诸如I18n.t('some.key')
之类的呼叫,并提供有关密钥使用,丢失和未使用密钥的报告。它还可以预先填充缺失的密钥,包括来自谷歌翻译,它也可以删除未使用的密钥。