openstreetmap-website/script/locale/yaml2po
2015-02-20 19:47:26 +00:00

64 lines
1.7 KiB
Ruby
Executable file

#!/usr/bin/env ruby
# yaml2po, for converting RoR translation YAML to the standard gettext
# for eventual use with a translation site such as Transifex
# Use:
# - To create a 'master' .pot
# yaml2po > translations.pot
# - To create a language's .po (includes from scratch)
# yaml2po de > de.po
# - To create all languages' .pos and a .pot (under /config/locales/po)
# yaml2po --all
require "yaml"
require "optparse"
LOCALE_DIR = File.dirname(__FILE__) + "/../../config/locales/"
EN = YAML.load_file(LOCALE_DIR + "en.yml")
def iterate(hash, fhash = {}, path = "", outfile = $stdout)
hash.each do |key, val|
fhash[key] = {} unless fhash.key? key
if val.is_a? Hash
fhash[key] = {} unless fhash[key].is_a? Hash
iterate(val, fhash[key], path + key + ":", outfile)
else
outfile.puts "msgctxt \"#{path}#{key}\""
outfile.puts "msgid \"#{val}\""
outfile.puts "msgstr \"#{fhash[key]}\""
end
end
end
def lang2po(lang, outfile = $stdout)
puts lang
infile = LOCALE_DIR + lang + ".yml"
if File.exist? infile
oth = YAML.load_file(infile)
oth = oth[lang]
iterate(EN["en"], oth, "", outfile)
else
iterate(EN["en"], {}, "", outfile)
end
end
opt = ARGV[0]
if opt == "--all"
# Produce .po files for all langs, and a .pot template
PO_DIR = LOCALE_DIR + "po/"
Dir.mkdir(PO_DIR) unless File.directory?(PO_DIR)
Dir.glob(LOCALE_DIR + "*.yml") do |filename|
lang = File.basename(filename, ".yml")
unless lang == "en"
outfile = File.new(PO_DIR + "#{lang}.po", "w")
lang2po(lang, outfile)
outfile.close
end
end
outfile = File.new(PO_DIR + "rails_port.pot", "w")
iterate(EN["en"], {}, "", outfile)
outfile.close
elsif opt
lang2po(opt)
else
iterate(EN["en"])
end