i18n синхронизация ключей yaml местных жителей - PullRequest
6 голосов
/ 24 августа 2011

Аналогичный вопрос, но для java, Как синхронизировать ресурсы i18n

Как поддерживать синхронизацию ключей местных жителей 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 ]

1 голос
/ 19 ноября 2012

Я проверю драгоценный камень i18n_translation_spawner. В случае, если кому-то нужно не так быстро, но выполнять работу, я использую этот скрипт:

Сначала мы расширяем класс 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
1 голос
/ 21 ноября 2013

Для этого вы можете использовать i18n-tasks gem.

a

Он сканирует вызовы, такие как I18n.t('some.key'), и предоставляет отчеты об использовании ключа, пропавших без вести.и неиспользованные ключи.Он также может предварительно заполнить недостающие ключи, в том числе из Google Translate, а также удалить неиспользуемые ключи.

1 голос
/ 13 сентября 2011

Попробуйте камень i18n_translation_spawner , это может быть полезно.

...