4

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

例如。我有一个名为 el.yml 的希腊语 yml 文件

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

还有一个叫 en.yml 的英文

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

是否有任何基于单个 yml 文件的工具,即 en.yml ( root ) 可以转到 yml 的其余部分并使用默认 (en.yml) 值创建缺失的翻译?

运行这样的工具后,我希望 el.yml 变成这样:

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

我在 .NET RESX Synchronizer中使用了一个类似的工具,它正是这样做的,但用于 resx 文件。

4

4 回答 4

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

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

于 2011-03-23T13:06:44.243 回答
1

这并不完全是您所需要的,但也许查看http://www.github.com/mynewsdesk/translate out 可以证明是有用的。

引用:

这个插件提供了一个 Web 界面,用于将 Rails I18n 文本(需要 Rails 2.2 或更高版本)从一种语言环境翻译到另一种语言环境。该插件仅使用 Rails 附带的简单 I18n 后端进行了测试。I18n 文本从 config/locales 下的 YAML 文件读取和写入。

于 2009-10-03T17:27:32.563 回答
1

也没有找到,所以我写了一个 lil gem:http: //github.com/nofxx/i18n_sync

于 2010-05-17T05:15:49.540 回答
0

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

https://github.com/jsaak/locale_assistant

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

于 2013-03-04T21:46:15.403 回答