From 48f4388c8bbd072db1e7949c7b954ca9ce989f77 Mon Sep 17 00:00:00 2001 From: Karen Tracey Date: Mon, 6 Oct 2008 01:38:22 +0000 Subject: [PATCH] [1.0.X] Fixed #9212: Added code to check the xgettext version, and if it is lower than 0.15, undo an incorrect encoding to utf-8 done by xgettext. This bug was fixed in xgettext 0.15, but the most-easily-installed Windows gettext binaries are older (0.13.1), so we work around it. Backport of r9155 from trunk. git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@9156 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- .../core/management/commands/makemessages.py | 20 +++++++++++++++++++ docs/topics/i18n.txt | 7 +++++++ 2 files changed, 27 insertions(+) diff --git a/django/core/management/commands/makemessages.py b/django/core/management/commands/makemessages.py index ea7ed2f228..604cb03ee9 100644 --- a/django/core/management/commands/makemessages.py +++ b/django/core/management/commands/makemessages.py @@ -75,6 +75,22 @@ def make_messages(locale=None, domain='django', verbosity='1', all=False, extens message = "usage: make-messages.py -l \n or: make-messages.py -a\n" raise CommandError(message) + # xgettext versions prior to 0.15 assumed Python source files were encoded + # in iso-8859-1, and produce utf-8 output. In the case where xgettext is + # given utf-8 input (required for Django files with non-ASCII characters), + # this results in a utf-8 re-encoding of the original utf-8 that needs to be + # undone to restore the original utf-8. So we check the xgettext version + # here once and set a flag to remember if a utf-8 decoding needs to be done + # on xgettext's output for Python files. We default to assuming this isn't + # necessary if we run into any trouble determining the version. + xgettext_reencodes_utf8 = False + (stdin, stdout, stderr) = os.popen3('xgettext --version', 't') + match = re.search(r'(?P\d+)\.(?P\d+)', stdout.read()) + if match: + xversion = (int(match.group('major')), int(match.group('minor'))) + if xversion < (0, 15): + xgettext_reencodes_utf8 = True + languages = [] if locale is not None: languages.append(locale) @@ -139,6 +155,10 @@ def make_messages(locale=None, domain='django', verbosity='1', all=False, extens errors = stderr.read() if errors: raise CommandError("errors happened while running xgettext on %s\n%s" % (file, errors)) + + if xgettext_reencodes_utf8: + msgs = msgs.decode('utf-8').encode('iso-8859-1') + if thefile != file: old = '#: '+os.path.join(dirpath, thefile)[2:] new = '#: '+os.path.join(dirpath, file)[2:] diff --git a/docs/topics/i18n.txt b/docs/topics/i18n.txt index b2a181e5b8..3e8234b342 100644 --- a/docs/topics/i18n.txt +++ b/docs/topics/i18n.txt @@ -974,3 +974,10 @@ test or compile a changed message file, you will need the ``gettext`` utilities: * In the ``System variables`` list, click ``Path``, click ``Edit`` * Add ``;C:\Program Files\gettext-utils\bin`` at the end of the ``Variable value`` field + +You may also use ``gettext`` binaries you have obtained elsewhere, so long as +the ``xgettext --version`` command works properly. Some version 0.14.4 binaries +have been found to not support this command. Do not attempt to use Django +translation utilities with a ``gettext`` package if the command ``xgettext +--version`` entered at a Windows command prompt causes a popup window saying +"xgettext.exe has generated errors and will be closed by Windows".