Enable translated database strings the right way:
[working/Evergreen.git] / build / i18n / scripts / db-seed-i18n.py
index 248a1fa..5deeeb7 100755 (executable)
@@ -1,11 +1,11 @@
 #!/usr/bin/env python
-#
+# vim:et:ts=4:sw=4:
 """
 This class enables translation of Evergreen's seed database strings.
 
 Requires polib from http://polib.googlecode.com
 """
-# Copyright 2007 Dan Scott <dscott@laurentian.ca>
+# Copyright 2007-2008 Dan Scott <dscott@laurentian.ca>
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -38,46 +38,47 @@ class SQL(basel10n.BaseL10N):
 
     def getstrings(self, source):
         """
-        Each INSERT statement contains a schema and tablename which we need to
-        insert into the config.i18n table. We'll push this into our
-        POEntry.occurrences attribute.
+        Each INSERT statement contains 0 or more oils_i18n_gettext()
+        markers for the en-US string that identify the string (which
+        we push into the POEntry.occurrences attribute), class hint,
+        and property. We concatenate the class hint and property and
+        use that for our msgid attribute.
         
-        Each INSERT statement also contains 0 or more oils_i18n_gettext()
-        markers for the en-US string that we'll use for our msgid attribute.
-
         A sample INSERT string that we'll scan is as follows:
 
             INSERT INTO foo.bar (key, value) VALUES 
-                (99, oils_i18n_gettext('string'));
+                (99, oils_i18n_gettext(99, 'string', 'class hint', 'property'));
         """
         self.pothead()
 
-        # table holds the fully-qualified table name (schema.table)
-        # The source SQL may use multi-row VALUES clauses for a single
-        # insert statement, so we need to remember the fq-table for
-        # multiple lines
-        table = ''
-        num = 1
-        findtable = re.compile(r'\s*INSERT\s+INTO\s+(\S+).*?$')
-        findi18n = re.compile(r'.*?oils_i18n_gettext\(\'(.+?)\'\)')
+        num = 0
+        findi18n = re.compile(r'.*?oils_i18n_gettext\((.*?)\'\)')
+        intkey = re.compile(r'\s*(?P<id>\d+),\s*\'(?P<string>.+?)\',\s*\'(?P<class>.+?)\',\s*\'(?P<property>.+?)$')
+        textkey = re.compile(r'\s*\'(?P<id>.*?)\',\s*\'(?P<string>.+?)\',\s*\'(?P<class>.+?)\',\s*\'(?P<property>.+?)$')
 
         # Iterate through the source SQL grabbing table names and l10n strings
         sourcefile = open(source)
         for line in sourcefile:
-            ftable = findtable.search(line)
-            if ftable is not None:
-                table = ftable.group(1)
-            fi18n = findi18n.search(line)
-            if fi18n is not None:
-                for i18n in fi18n.groups():
+            try:
+                num = num + 1
+                entry = findi18n.search(line)
+                if entry is None:
+                    continue
+                for parms in entry.groups():
+                    # Try for an integer-based primary key parameter first
+                    fi18n = intkey.search(parms)
+                    if fi18n is None:
+                        # Otherwise, it must be a text-based primary key parameter
+                        fi18n = textkey.search(parms)
+                    fq_field = "%s.%s" % (fi18n.group('class'), fi18n.group('property'))
+                    poe = polib.POEntry()
+                    poe.occurrences = [(fq_field, num)]
+                    poe.tcomment = 'id::' + fi18n.group('id')
                     # Unescape escaped SQL single-quotes for translators' sanity
-                    i18n = re.compile(r'\'\'').sub("'", i18n)
-                    if i18n is not None:
-                        poe = polib.POEntry()
-                        poe.occurrences = [(table, num)]
-                        poe.msgid = i18n
-                        self.pot.append(poe)
-            num = num + 1
+                    poe.msgid = re.compile(r'\'\'').sub("'", fi18n.group('string'))
+                    self.pot.append(poe)
+            except:
+                print "Error in line %d of SQL source file" % (num) 
 
     def create_sql(self, locale):
         """
@@ -88,14 +89,15 @@ class SQL(basel10n.BaseL10N):
         insert = "INSERT INTO config.i18n_core (fq_field, identity_value," \
             " translation, string) VALUES ('%s', '%s', '%s', '%s');"
         for entry in self.pot:
-            for table in entry.occurrences:
+            for fq_field in entry.occurrences:
                 # Escape SQL single-quotes to avoid b0rkage
-                msgid = re.compile(r'\'').sub("''", entry.msgid)
+                msgid = re.compile(r'\'').sub("''", entry.tcomment)
                 msgstr = re.compile(r'\'').sub("''", entry.msgstr)
+                msgid = re.compile(r'^id::').sub('', msgid)
                 if msgstr == '':
                     # Don't generate a stmt for an untranslated string
                     break
-                self.sql.append(insert % (table[0], msgid, locale, msgstr))
+                self.sql.append(insert % (fq_field[0], msgid, locale, msgstr))
 
 def main():
     """