Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails中的同步语言环境yml文件工具_Ruby On Rails_Localization_Yaml - Fatal编程技术网

Ruby on rails Rails中的同步语言环境yml文件工具

Ruby on rails Rails中的同步语言环境yml文件工具,ruby-on-rails,localization,yaml,Ruby On Rails,Localization,Yaml,我想知道,是否可以与任何工具或gem或w/e 2或更多yml文件同步 我有一个希腊yml文件,叫做el.yml el: layout: home: "Αρχική" 还有一个叫en.yml的英国人 en: layout: home: "Home" category: "Category" 有没有基于单个yml文件(即en.yml(root))的工具,该文件会转到yml的其余部分,并使用默认值(en.yml)创建缺少的翻译 运行这样一个工具后,我希望el.yml

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

我有一个希腊yml文件,叫做el.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文件来说。

这并不完全是您所需要的,但是签出可能会很有用

引述:

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


也没有找到,所以我写了一个小宝石:

我刚刚为此编写了自己的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不会被触碰。

您可以试试locale\u assistant gem。如果你在更多的目录中有更多的文件,那就很方便了


(我是这个gem的创建者)

具有很好的功能,但在这个阶段似乎处于休眠状态-过去2年没有签入,公开问题包括“不适用于Rails 3”。有点惭愧。小心自我推销,看看;它很快被视为垃圾邮件。我们希望您能给出一个小小的“我是维护者”免责声明。:-)