【问题标题】:i18n sync of locals yaml keys本地 yaml 密钥的 i18n 同步
【发布时间】:2011-11-02 20:23:19
【问题描述】:

类似的问题,但对于 java,Keeping i18n resources synced

如何保持 i18n yaml 本地人的密钥同步?即当一个密钥被添加到 en.yml 时,如何将这些密钥添加到 nb.yml 或 ru.yml?

如果我在 my_title: "a title" 旁边添加密钥 my_label: "some text in english" 我想把它交给我的其他当地人我指定,因为我不能做所有的翻译,它应该回退到其他语言的英语

例如 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:
   ...

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

【问题讨论】:

  • 不完全是您所追求的,但您看过 Tolk 吗? — github.com/dhh/tolk
  • 出于某种原因,我不太喜欢托克。我想要更简单的东西。我只想使用 en.yml 作为主密钥并从中同步密钥,看看 git 中的变化。不过,我对其他想法持开放态度。
  • 您是否考虑过类似于此处建议的解决方案? — stackoverflow.com/questions/5470648/synchronize-two-yaml-files
  • 很好的提示,没有找到那个问题。这正是我要问的。唯一不好的可能是重组,但也许这会变得更好!我去看看!

标签: ruby-on-rails ruby internationalization yaml


【解决方案1】:

试试i18n_translation_spawner gem,它可能会有所帮助。

【讨论】:

【解决方案2】:

我会检查 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

【讨论】:

  • 酷。使用这个 yaml 很难维护多种语言。每次都需要重新部署,而且只有开发者才能改变。我想要更好的解决方案。但这对 yaml 有帮助,谢谢!
【解决方案3】:

您可以为此使用i18n-tasks gem。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 2012-10-31
    • 1970-01-01
    • 2021-05-12
    • 2015-07-23
    • 1970-01-01
    相关资源
    最近更新 更多