Smarter error handling in Dojo i18n script
[working/Evergreen.git] / build / i18n / scripts / dojo_resource.py
index 3134826..d33f655 100755 (executable)
@@ -7,8 +7,8 @@ Requires polib from http://polib.googlecode.com
 
 Source event definitions are structured as follows:
 {
-    MSG_ID1: "This is a message with 1 variable - ${0}.",
-    MSG_ID2: "This is a message with two variables: ${0} and ${1}."
+    "MSG_ID1": "This is a message with 1 variable - ${0}.",
+    "MSG_ID2": "This is a message with two variables: ${0} and ${1}."
 }
 
 Note that this is a deliberately limited subset of the variable substitution
@@ -28,12 +28,14 @@ allowed by http://api.dojotoolkit.org/jsdoc/dojo/1.2/dojo.string.substitute
 # GNU General Public License for more details.
 
 import basel10n
+import codecs
 import optparse
 import polib
 import re
 import sys
 import simplejson
 import os.path
+import os
 
 class DojoResource (basel10n.BaseL10N):
     """
@@ -57,7 +59,11 @@ class DojoResource (basel10n.BaseL10N):
         # Avoid generating duplicate entries by keeping track of msgids
         msgids = dict()
 
-        bundle = simplejson.load(open(source, 'r'))
+       try:
+            bundle = simplejson.load(codecs.open(source, encoding='utf-8', mode='r'))
+       except ValueError:
+           print("Reading Dojo resource file %s" % (source))
+            raise
 
         for key, value in bundle.iteritems():
             if value in msgids:
@@ -78,7 +84,10 @@ class DojoResource (basel10n.BaseL10N):
         """
 
         for entry in self.pot:
-            for filename, msgkey in entry.occurrences:
+            for occurrence in entry.occurrences:
+                # Ack. Horrible hack because polib started insisting
+                # that occurrences use integers for line numbers. The nerve!
+                filename, msgkey = occurrence[0].split('.js');
                 if entry.msgstr == '':
                     # No translation available; use the en-US definition
                     self.msgs[msgkey] = entry.msgid
@@ -106,6 +115,8 @@ def main():
     if options.pot:
         pot.get_strings(options.pot)
         if options.outfile:
+            if not os.path.exists(options.outfile):
+                os.makedirs(os.path.dirname(options.outfile))
             pot.savepot(options.outfile)
         else:
             sys.stdout.write(pot.pot.__str__())
@@ -115,7 +126,9 @@ def main():
         pot.loadpo(options.create)
         pot.create_bundle()
         if options.outfile:
-            outfile = open(options.outfile, 'w')
+            if not os.path.exists(options.outfile):
+                os.makedirs(os.path.dirname(options.outfile))
+            outfile = codecs.open(options.outfile, encoding='utf-8', mode='w')
             simplejson.dump(pot.msgs, outfile, indent=4)
         else:
             print(simplejson.dumps(pot.msgs, indent=4))