[PATCH 4 of 6] i18n: encode output in user's local encoding

Martin Geisler mg at daimi.au.dk
Wed Jan 14 17:17:00 CST 2009


# HG changeset patch
# User Martin Geisler <mg at daimi.au.dk>
# Date 1231974876 -3600
# Node ID 0173d4706f6bc7b78fd62da1a7980e1da0a0ffed
# Parent  f841f4b4fe2ac971c04032756893b3d54daf89b9
i18n: encode output in user's local encoding

This makes the translated output obey the HGENCODING environment
variable or the preferred encoding as set by the LANG or LC_ALL
environment variables.

Python 2.4 has a lgettext method which is similar, except that it
doesn't know about HGENCODING or the settings in .hgrc.

diff -r f841f4b4fe2a -r 0173d4706f6b mercurial/i18n.py
--- a/mercurial/i18n.py	Thu Jan 15 00:12:35 2009 +0100
+++ b/mercurial/i18n.py	Thu Jan 15 00:14:36 2009 +0100
@@ -22,5 +22,30 @@
         break
 
 t = gettext.translation('hg', localedir, fallback=True)
-gettext = t.gettext
+
+def gettext(message):
+    """Translate message.
+
+    The message is looked up in the catalog to get a Unicode string,
+    which is encoded in the local encoding before being returned.
+
+    Important: message is restricted to characters in the encoding
+    given by sys.getdefaultencoding() which is most likely 'ascii'.
+    """
+    # If message is None, t.ugettext will return u'None' as the
+    # translation whereas our callers expect us to return None.
+    if message is None:
+        return message
+
+    # We cannot just run the text through util.tolocal since that
+    # leads to infinite recursion when util._encoding is invalid.
+    try:
+        u = t.ugettext(message)
+        return u.encode(util._encoding, "replace")
+    except LookupError:
+        return message
+
 _ = gettext
+
+# Moved after _ because of circular import.
+import util


More information about the Mercurial-devel mailing list