mercurial/i18n.py
author Martin Geisler <mg@daimi.au.dk>
Thu, 15 Jan 2009 00:14:36 +0100
changeset 7651 5b5036ef847a
parent 7650 85ae7aaf08e9
child 7948 de377b1a9a84
permissions -rw-r--r--
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.

"""
i18n.py - internationalization support for mercurial

Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>

This software may be used and distributed according to the terms
of the GNU General Public License, incorporated herein by reference.
"""

import gettext, sys, os

# modelled after templater.templatepath:
if hasattr(sys, 'frozen'):
    module = sys.executable
else:
    module = __file__

base = os.path.dirname(module)
for dir in ('.', '..'):
    localedir = os.path.normpath(os.path.join(base, dir, 'locale'))
    if os.path.isdir(localedir):
        break

t = gettext.translation('hg', localedir, fallback=True)

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