i18n同步当地人yaml键

时间:2011-08-24 13:57:07

标签: ruby-on-rails ruby internationalization yaml

类似的问题,但对于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:
   ...

有没有宝石做这样的事情?如果你认为这是一个好主意,也许我应该花点时间自己做。其他方法?

3 个答案:

答案 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。

a

它扫描诸如I18n.t('some.key')之类的呼叫,并提供有关密钥使用,丢失和未使用密钥的报告。它还可以预先填充缺失的密钥,包括来自谷歌翻译,它也可以删除未使用的密钥。