#!/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
