commit d6590d5c4c8b201c0e9327732669a7fcc9f7277f
Author: Georg Baum <[email protected]>
Date:   Sun Apr 24 19:35:38 2016 +0200

    Merge fuzzy translations correctly
    
    If the -o option is given, we may overwrite existing translations with
    translations from the other .po file. In this case, we have to delete or set
    the fuzzy flag accoring to the updated translation.

diff --git a/development/tools/mergepo.py b/development/tools/mergepo.py
index 0ed3b49..577f348 100755
--- a/development/tools/mergepo.py
+++ b/development/tools/mergepo.py
@@ -56,7 +56,7 @@ def parse_msg(lines):
     return polib.unescape(msg)
 
 
-def translate(msgid, msgstr_lines, po2, options):
+def translate(msgid, flags, msgstr_lines, po2, options):
     msgstr = parse_msg(msgstr_lines)
     if options.overwrite:
         other = po2.find(msgid)
@@ -77,6 +77,12 @@ def translate(msgid, msgstr_lines, po2, options):
     if options.nonnull and other.msgstr == other.msgid:
         return 0
     msgstr = other.msgstr
+    if 'fuzzy' in other.flags:
+        if not u'fuzzy' in flags:
+            flags.append(u'fuzzy')
+    else:
+        if u'fuzzy' in flags:
+            flags.remove(u'fuzzy')
     obsolete = (msgstr_lines[0].find('#~') == 0)
     j = msgstr_lines[0].find('"')
     # must not assign to msgstr_lines, because that would not be seen by our 
caller
@@ -105,6 +111,12 @@ def mergepo_polib(target, source, options):
                 continue
             if other.translated() and other.msgstr != entry.msgstr:
                 entry.msgstr = other.msgstr
+                if 'fuzzy' in other.flags:
+                    if not 'fuzzy' in entry.flags:
+                        entry.flags.append('fuzzy')
+                else:
+                    if 'fuzzy' in entry.flags:
+                        entry.flags.remove('fuzzy')
                 changed = changed + 1
     else:
         for entry in po1.untranslated_entries():
@@ -137,6 +149,7 @@ def mergepo_minimaldiff(target, source, options):
     newlines = []
     in_msgid = False
     in_msgstr = False
+    flags = []
     msgstr_lines = []
     msgid_lines = []
     msgid = ''
@@ -147,19 +160,25 @@ def mergepo_minimaldiff(target, source, options):
             else:
                 in_msgid = False
                 msgid = parse_msg(msgid_lines)
-                newlines.extend(msgid_lines)
-                msgid_lines = []
         elif in_msgstr:
             if line.find('"') == 0 or line.find('#~ "') == 0:
                 msgstr_lines.append(line)
             else:
                 in_msgstr = False
-                changed = changed + translate(msgid, msgstr_lines, po2, 
options)
+                changed = changed + translate(msgid, flags, msgstr_lines, po2, 
options)
+                if len(flags) > 0:
+                    flagline = u'#, ' + u', '.join(flags)
+                    newlines.append(flagline)
+                    flags = []
+                newlines.extend(msgid_lines)
                 newlines.extend(msgstr_lines)
+                msgid_lines = []
                 msgstr_lines = []
                 msgid = ''
         if not in_msgid and not in_msgstr:
-            if line.find('msgid') == 0 or line.find('#~ msgid') == 0:
+            if line.find('#,') == 0 and len(flags) == 0:
+                flags = line[2:].strip().split(u', ')
+            elif line.find('msgid') == 0 or line.find('#~ msgid') == 0:
                 msgid_lines.append(line)
                 in_msgid = True
             elif line.find('msgstr') == 0 or line.find('#~ msgstr') == 0:
@@ -172,8 +191,14 @@ def mergepo_minimaldiff(target, source, options):
                 newlines.append(line)
     if msgid != '':
         # the file ended with a msgstr
-        changed = changed + translate(msgid, msgstr_lines, po2, options)
+        changed = changed + translate(msgid, flags, msgstr_lines, po2, options)
+        if len(flags) > 0:
+            flagline = u'#, ' + u', '.join(flags)
+            newlines.append(flagline)
+            flags = []
+        newlines.extend(msgid_lines)
         newlines.extend(msgstr_lines)
+        msgid_lines = []
         msgstr_lines = []
         msgid = ''
     if changed > 0:
@@ -196,7 +221,8 @@ def mergepo(target, source, options):
     try:
         changed = mergepo_minimaldiff(target, source, options)
         sys.stderr.write('Updated %d translations with minimal diff.\n' % 
changed)
-    except:
+    except Exception as e:
+        sys.stderr.write('Unable to use minimal diff: %s\n' % e)
         changed = mergepo_polib(target, source, options)
         sys.stderr.write('Updated %d translations using polib.\n' % changed)
 

Reply via email to