在Rails中同步语言环境yml文件工具

时间:2009-10-03 14:59:27

标签: ruby-on-rails localization yaml

我想知道,是否可以与任何工具或gem或w / e 2个或更多yml文件同步?

例如。我有名为el.yml的希腊语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 个答案:

答案 0 :(得分:2)

我刚为此编写了自己的rake任务:

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

它做了一个简单的merge()。在你的情况下,它需要en.yml并将el.yml合并到其中并将其保存为el.yml。 en.yml没有被触及。

答案 1 :(得分:1)

这并不完全符合您的需求,但可能会检出http://www.github.com/mynewsdesk/translate可能会有用。

引用:

  

此插件提供了一个Web界面,用于将Rails I18n文本(需要Rails 2.2或更高版本)从一个区域转换为另一个区域。该插件仅使用Rails附带的简单I18n后端进行了测试。 I18n文本在config / locales下读取和写入YAML文件。

答案 2 :(得分:1)

也没找到,所以我写了一个小宝石: http://github.com/nofxx/i18n_sync

答案 3 :(得分:0)

您可以尝试locale_assistant gem。如果您在更多目录中有更多文件,那么非常方便。

https://github.com/jsaak/locale_assistant

(我是这个宝石的创造者)