]> git.openstreetmap.org Git - rails.git/blobdiff - script/locale/yaml2po
Don't use Data::Walk and instead construct a flattened list of hash
[rails.git] / script / locale / yaml2po
index c20c70f8c15355414d3bf48c9574c3b58f97bb0c..ff5a77b26b2f9cd21dcac4400a5f2c965c0a539d 100755 (executable)
@@ -4,34 +4,63 @@
 # Use:
 #  - To create a 'master' .pot
 #    yaml2po > translations.pot
-#  - To create a partucular language's .po
+#  - 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/'
+LOCALE_DIR = File.dirname(__FILE__) + '/../../config/locales/'
+EN = YAML::load_file(LOCALE_DIR+'en.yml')
 
-def iterate(hash, fhash={}, path='')
+def iterate(hash, fhash={}, path='', outfile=$stdout)
+  postr = ''
   hash.each {|key, val|
-    unless fhash.has_key? key
-     fhash[key] = {}
-    end
+    fhash[key] = {} unless fhash.has_key? key
     if val.is_a? Hash
-      iterate(val, fhash[key], path+key+':')
+      fhash[key] = {} unless fhash[key].is_a? Hash
+      iterate(val, fhash[key], path+key+':', outfile)
     else
-      puts "#: #{path}#{key}"
-      puts "msgid \"#{val}\""
-      puts "msgstr \"#{fhash[key]}\""
+      outfile.puts "msgctxt \"#{path}#{key}\""
+      outfile.puts "msgid \"#{val}\""
+      outfile.puts "msgstr \"#{fhash[key]}\""
     end
   }
 end
 
-language = ARGV[0]
-oth = {}
-if language
-  oth = YAML::load_file(LOCALE_DIR+language+'.yml')
-  oth = oth[language]
+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
 
-en = YAML::load_file(LOCALE_DIR+'en.yml')
-iterate(en['en'], oth)
+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