Инструмент синхронизации файлов yml в Rails - PullRequest
4 голосов
/ 03 октября 2009

Мне было интересно, можно ли синхронизировать с любым инструментом, гемом или w / e 2 или более файлами yml?

например. у меня есть греческий файл yml с именем el.yml

el:
  layout:
    home: "Αρχική"

и английская en.yml

en:
  layout:
    home: "Home"
    category: "Category"

Существует ли какой-либо инструмент, основанный на одном файле yml, т. Е. En.yml (root), который идет к остальным ymls и создает отсутствующие переводы со значениями по умолчанию (en.yml)?

После запуска такого инструмента я бы ожидал, что el.yml станет таким:

el:
  layout:
    home: "Αρχική"
    category: "Category"

Я использую аналогичный инструмент в .NET RESX Synchronizer , и он делает именно это, но для файлов resx.

Ответы [ 4 ]

2 голосов
/ 23 марта 2011

Я просто написал для этого собственное задание по рейку:

LOCALES_PATH  = "#{Rails.root}/config/locales/*.yml"
MASTER_LOCALE = "#{Rails.root}/config/locales/en.yml"

class Hash
  def to_yaml( opts = {} )
    YAML::quick_emit( object_id, opts ) do |out|
      out.map( taguri, to_yaml_style ) do |map|
        sort.each do |k, v| # "sort" added
          map.add( k, v )
        end
      end
    end
  end
end

namespace :locales do
  task :merge do
    require 'yaml'
    master = YAML::load_file MASTER_LOCALE
    master_language_code = File.basename(MASTER_LOCALE, '.yml')
    Dir[LOCALES_PATH].each do |file_name|
      if file_name == MASTER_LOCALE
        puts "=> skipping master locale #{File.basename(MASTER_LOCALE)}"
        next
      end
      language_code = File.basename(file_name, '.yml')
      slave = YAML::load_file(file_name)
      unless slave[language_code]
        puts "-> ERROR on #{File.basename(file_name)}: can't find key '#{language_code}'!"
        next
      end
      merged = master[master_language_code].deep_merge(slave[language_code])
      final = { language_code => merged } # remove other keys
      File.open(file_name, 'w') do |file|
        file.write final.to_yaml.gsub(/\s+$/, '')
      end
      puts "+ merged #{File.basename(file_name)} with master"
    end
  end
end

Делает простое слияние (). В вашем случае он берет en.yml и объединяет в нем el.yml и сохраняет его как el.yml. En.yml не трогается.

1 голос
/ 17 мая 2010

Также не нашел, поэтому я написал жемчужину: http://github.com/nofxx/i18n_sync

1 голос
/ 03 октября 2009

Это не совсем то, что вам нужно, но, возможно, проверка http://www.github.com/mynewsdesk/translate может оказаться полезной.

Цитата:

Этот плагин предоставляет веб-интерфейс для перевода текстов Rails I18n (требуется Rails 2.2 или выше) из одной локали в другую. Плагин был протестирован только с простым бэкэндом I18n, который поставляется с Rails. Тексты I18n читаются и записываются в файлы YAML в config / locales.

0 голосов
/ 05 марта 2013

Вы можете попробовать gem locale_assistant. Очень удобно, если у вас есть больше файлов в других каталогах.

https://github.com/jsaak/locale_assistant

(я создатель этого драгоценного камня)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...