Bug: https://github.com/itstool/itstool/issues/25 Bug-Debian: https://bugs.debian.org/912099 Forwarded: https://github.com/itstool/itstool/issues/25 Bug: https://github.com/itstool/itstool/issues/36 PR: https://github.com/itstool/itstool/pull/47 Index: itstool.in --- itstool.in.orig +++ itstool.in @@ -44,9 +44,22 @@ if PY3: else: return str(s) ustr_type = str + def pr_str(s): + """Return a string that can be safely print()ed""" + # Since print works on both bytes and unicode, just return the argument + return s else: string_types = basestring, ustr = ustr_type = unicode + def pr_str(s): + """Return a string that can be safely print()ed""" + if isinstance(s, str): + # Since print works on str, just return the argument + return s + else: + # print may not work on unicode if the output encoding cannot be + # detected, so just encode with UTF-8 + return unicode.encode(s, 'utf-8') NS_ITS = 'http://www.w3.org/2005/11/its' NS_ITST = 'http://itstool.org/extensions/' @@ -1077,9 +1090,9 @@ class Document (object): if strict: raise else: - sys.stderr.write('Warning: Could not merge %stranslation for msgid:\n%s\n' % ( + sys.stderr.write(pr_str('Warning: Could not merge %stranslation for msgid:\n%s\n' % ( (lang + ' ') if lang is not None else '', - msgstr.encode('utf-8'))) + msgstr))) self._xml_err = '' return node def scan_node(node): @@ -1096,6 +1109,8 @@ class Document (object): child.replaceNode(newnode) else: repl = self.get_translated(ph_node, translations, strict=strict, lang=lang) + if repl == ph_node: + repl = repl.copyNode(1) child.replaceNode(repl) scan_node(child) try: @@ -1104,9 +1119,9 @@ class Document (object): if strict: raise else: - sys.stderr.write('Warning: Could not merge %stranslation for msgid:\n%s\n' % ( + sys.stderr.write(pr_str('Warning: Could not merge %stranslation for msgid:\n%s\n' % ( (lang + ' ') if lang is not None else '', - msgstr.encode('utf-8'))) + msgstr))) self._xml_err = '' ctxt.doc().freeDoc() return node