【问题标题】:Synchronize locale yml files tool in Rails在 Rails 中同步语言环境 yml 文件工具
【发布时间】:2010-12-03 14:13:54
【问题描述】:

我想知道,是否可以与任何工具或 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 文件。

【问题讨论】:

    标签: ruby-on-rails localization yaml


    【解决方案1】:

    我刚刚为此编写了自己的 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 没有被触及。

    【讨论】:

      【解决方案2】:

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

      引用:

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

      【讨论】:

      • 具有强大的功能,但在这个阶段似乎相当休眠 - 过去 2 年没有签入,未解决的问题包括“不适用于 Rails 3”。有点遗憾。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        https://github.com/jsaak/locale_assistant

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

        【讨论】:

        • 小心自我推销,见FAQ;它很快被视为垃圾邮件。我们会感谢一个小的“我是维护者”免责声明。 :-)
        猜你喜欢
        • 1970-01-01
        • 2015-03-27
        • 2011-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-28
        • 2011-04-15
        相关资源
        最近更新 更多