i18n.py
85 lines
| 3.0 KiB
| text/x-python
|
PythonLexer
/ mercurial / i18n.py
Martin Geisler
|
r8226 | # 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 | ||||
Matt Mackall
|
r10263 | # GNU General Public License version 2 or any later version. | ||
Benoit Boissinot
|
r1400 | |||
Simon Heimberg
|
r8312 | import encoding | ||
Yuya Nishihara
|
r21987 | import gettext, sys, os, locale | ||
Martin Geisler
|
r7650 | |||
# modelled after templater.templatepath: | ||||
Augie Fackler
|
r14975 | if getattr(sys, 'frozen', None) is not None: | ||
Martin Geisler
|
r7650 | module = sys.executable | ||
else: | ||||
module = __file__ | ||||
base = os.path.dirname(module) | ||||
for dir in ('.', '..'): | ||||
Martin Geisler
|
r9538 | localedir = os.path.join(base, dir, 'locale') | ||
Martin Geisler
|
r7650 | if os.path.isdir(localedir): | ||
break | ||||
Yuya Nishihara
|
r21987 | _languages = None | ||
if (os.name == 'nt' | ||||
and 'LANGUAGE' not in os.environ | ||||
and 'LC_ALL' not in os.environ | ||||
and 'LC_MESSAGES' not in os.environ | ||||
and 'LANG' not in os.environ): | ||||
# Try to detect UI language by "User Interface Language Management" API | ||||
# if no locale variables are set. Note that locale.getdefaultlocale() | ||||
# uses GetLocaleInfo(), which may be different from UI language. | ||||
# (See http://msdn.microsoft.com/en-us/library/dd374098(v=VS.85).aspx ) | ||||
try: | ||||
import ctypes | ||||
langid = ctypes.windll.kernel32.GetUserDefaultUILanguage() | ||||
_languages = [locale.windows_locale[langid]] | ||||
except (ImportError, AttributeError, KeyError): | ||||
# ctypes not found or unknown langid | ||||
pass | ||||
t = gettext.translation('hg', localedir, _languages, fallback=True) | ||||
Martin Geisler
|
r7651 | |||
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 | ||||
Matt Mackall
|
r21746 | if type(message) is unicode: | ||
# goofy unicode docstrings in test | ||||
paragraphs = message.split(u'\n\n') | ||||
else: | ||||
paragraphs = [p.decode("ascii") for p in message.split('\n\n')] | ||||
Martin Geisler
|
r11403 | # Be careful not to translate the empty string -- it holds the | ||
# meta data of the .po file. | ||||
u = u'\n\n'.join([p and t.ugettext(p) or '' for p in paragraphs]) | ||||
Martin Geisler
|
r7651 | try: | ||
Martin Geisler
|
r9319 | # encoding.tolocal cannot be used since it will first try to | ||
# decode the Unicode string. Calling u.decode(enc) really | ||||
# means u.encode(sys.getdefaultencoding()).decode(enc). Since | ||||
# the Python encoding defaults to 'ascii', this fails if the | ||||
# translated string use non-ASCII characters. | ||||
Matt Mackall
|
r7948 | return u.encode(encoding.encoding, "replace") | ||
Martin Geisler
|
r7651 | except LookupError: | ||
Martin Geisler
|
r9320 | # An unknown encoding results in a LookupError. | ||
Martin Geisler
|
r7651 | return message | ||
Brodie Rao
|
r13849 | def _plain(): | ||
if 'HGPLAIN' not in os.environ and 'HGPLAINEXCEPT' not in os.environ: | ||||
return False | ||||
exceptions = os.environ.get('HGPLAINEXCEPT', '').strip().split(',') | ||||
return 'i18n' not in exceptions | ||||
if _plain(): | ||||
Brodie Rao
|
r10455 | _ = lambda message: message | ||
else: | ||||
_ = gettext | ||||