Rails - поиск недостающих ключей между разными локалями (файлы.yml)
У меня есть 2 файла локали en.yml и pt.yml. Есть некоторые ключи, которые существуют только в pt.yml и другие ключи, которые существуют только в en.yml
Есть ли метод или рутина для перечисления всех этих ключей? (Просто сравнивая два файла)
Пример вывода:
en.activerecord.attributes.person.hand
pt.activerecord.models.bird
Obs: что-то кроме i18n-tasks missing
задача.
2 ответа
Я считаю, что это решение идеально работает. Это из блога 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
Это сделало бы это:
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(:^)