Rails - 查找不同语言环境之间缺少的键(.yml 文件)

Posted

技术标签:

【中文标题】Rails - 查找不同语言环境之间缺少的键(.yml 文件)【英文标题】:Rails - Find missing keys between different locales (.yml files) 【发布时间】:2015-03-27 12:07:51 【问题描述】:

我有 2 个语言环境文件 en.ymlpt.yml。有一些键只存在于 pt.yml 和其他键只存在于 en.yml

是否有列出所有这些键的方法或例程? (只是比较两个文件)

示例输出:

en.activerecord.attributes.person.hand
pt.activerecord.models.bird

Obs:i18n-tasks missing 任务以外的东西。

【问题讨论】:

【参考方案1】:

我发现这个解决方案很完美。它来自 Kisko Labs 的博客文章。参考在这里:http://blog.kiskolabs.com/post/908453942/comparing-rails-locale-files-for-missing

LOCALE_1 = "~/Code/project/config/locales/fi.yml"
LOCALE_2 = "~/Code/project/config/locales/en.yml"
    
require 'yaml'
    
def flatten_keys(hash, prefix="")
  keys = []
  hash.keys.each do |key|
    if hash[key].is_a? Hash
      current_prefix = prefix + "#key."
      keys << flatten_keys(hash[key], current_prefix)
    else
      keys << "#prefix#key"
    end
  end
  prefix == "" ? keys.flatten : keys
end
 
def compare(locale_1, locale_2)
  yaml_1 = YAML.load(File.open(File.expand_path(locale_1)))
  yaml_2 = YAML.load(File.open(File.expand_path(locale_2)))

  keys_1 = flatten_keys(yaml_1[yaml_1.keys.first])
  keys_2 = flatten_keys(yaml_2[yaml_2.keys.first])

  missing = keys_2 - keys_1
  file = locale_1.split('/').last
  if missing.any?
    puts "Missing from #file:"
    missing.each  |key| puts "  - #key" 
  else
    puts "Nothing missing from #file."
  end
end

【讨论】:

【参考方案2】:

这样就可以了:

require 'set'
require 'yaml'

files = ['en.yml', 'pt.yml']

p files.map | file_path| YAML.load(File.read(file_path))
  .map |object| Set.new(object.keys) 
  .reduce(:^)

文档:YAML 和 Set

【讨论】:

以上是关于Rails - 查找不同语言环境之间缺少的键(.yml 文件)的主要内容,如果未能解决你的问题,请参考以下文章

如何解决错误“‘生产’环境缺少‘secret_key_base’”(Rails 4.1)

Rails:预编译资产缺少节点模块

C语言 error C2143: 语法错误 : 缺少“;”(在“类型”的前面)?

查找两个不同长度的向量之间的所有组合

使用过滤器方法并从给定字典中查找值在 5 到 8 之间的键

级联/继承/共享 Rails 配置环境