#!/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) postr = '' hash.each {|key, val| fhash[key] = {} unless fhash.has_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 def lang2po(lang, outfile=$stdout) puts lang oth = {} infile = LOCALE_DIR+lang+'.yml' if File.exists? 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") {|filename| lang = File.basename(filename, '.yml') unless lang == 'en' outfile = File.new(PO_DIR+"#{lang}.po", 'w') lang2po(lang, outfile) outfile.close 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