我想知道,是否可以与任何工具或gem或w / e 2个或更多yml文件同步?
例如。我有名为el.yml的希腊语yml文件
el:
layout:
home: "Αρχική"
英语名为en.yml
en:
layout:
home: "Home"
category: "Category"
是否有任何基于单个yml文件的工具,即en.yml(root)转到其余的ymls并使用默认(en.yml)值创建缺少的翻译?
运行这样的工具后,我希望el.yml变得喜欢这个:
el:
layout:
home: "Αρχική"
category: "Category"
我在.NET RESX Synchronizer中使用了类似的工具,它确实如此,但对于resx文件。
答案 0 :(得分: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
它做了一个简单的merge()。在你的情况下,它需要en.yml并将el.yml合并到其中并将其保存为el.yml。 en.yml没有被触及。
答案 1 :(得分:1)
这并不完全符合您的需求,但可能会检出http://www.github.com/mynewsdesk/translate可能会有用。
引用:
此插件提供了一个Web界面,用于将Rails I18n文本(需要Rails 2.2或更高版本)从一个区域转换为另一个区域。该插件仅使用Rails附带的简单I18n后端进行了测试。 I18n文本在config / locales下读取和写入YAML文件。
答案 2 :(得分:1)
也没找到,所以我写了一个小宝石: http://github.com/nofxx/i18n_sync
答案 3 :(得分:0)
您可以尝试locale_assistant gem。如果您在更多目录中有更多文件,那么非常方便。
https://github.com/jsaak/locale_assistant
(我是这个宝石的创造者)