##// END OF EJS Templates
i18n: explicitly decode paragraphs...
Matt Mackall -
r21746:2d47d81c default
parent child Browse files
Show More
@@ -1,63 +1,67 b''
1 1 # i18n.py - internationalization support for mercurial
2 2 #
3 3 # Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7
8 8 import encoding
9 9 import gettext, sys, os
10 10
11 11 # modelled after templater.templatepath:
12 12 if getattr(sys, 'frozen', None) is not None:
13 13 module = sys.executable
14 14 else:
15 15 module = __file__
16 16
17 17 base = os.path.dirname(module)
18 18 for dir in ('.', '..'):
19 19 localedir = os.path.join(base, dir, 'locale')
20 20 if os.path.isdir(localedir):
21 21 break
22 22
23 23 t = gettext.translation('hg', localedir, fallback=True)
24 24
25 25 def gettext(message):
26 26 """Translate message.
27 27
28 28 The message is looked up in the catalog to get a Unicode string,
29 29 which is encoded in the local encoding before being returned.
30 30
31 31 Important: message is restricted to characters in the encoding
32 32 given by sys.getdefaultencoding() which is most likely 'ascii'.
33 33 """
34 34 # If message is None, t.ugettext will return u'None' as the
35 35 # translation whereas our callers expect us to return None.
36 36 if message is None:
37 37 return message
38 38
39 paragraphs = message.split('\n\n')
39 if type(message) is unicode:
40 # goofy unicode docstrings in test
41 paragraphs = message.split(u'\n\n')
42 else:
43 paragraphs = [p.decode("ascii") for p in message.split('\n\n')]
40 44 # Be careful not to translate the empty string -- it holds the
41 45 # meta data of the .po file.
42 46 u = u'\n\n'.join([p and t.ugettext(p) or '' for p in paragraphs])
43 47 try:
44 48 # encoding.tolocal cannot be used since it will first try to
45 49 # decode the Unicode string. Calling u.decode(enc) really
46 50 # means u.encode(sys.getdefaultencoding()).decode(enc). Since
47 51 # the Python encoding defaults to 'ascii', this fails if the
48 52 # translated string use non-ASCII characters.
49 53 return u.encode(encoding.encoding, "replace")
50 54 except LookupError:
51 55 # An unknown encoding results in a LookupError.
52 56 return message
53 57
54 58 def _plain():
55 59 if 'HGPLAIN' not in os.environ and 'HGPLAINEXCEPT' not in os.environ:
56 60 return False
57 61 exceptions = os.environ.get('HGPLAINEXCEPT', '').strip().split(',')
58 62 return 'i18n' not in exceptions
59 63
60 64 if _plain():
61 65 _ = lambda message: message
62 66 else:
63 67 _ = gettext
General Comments 0
You need to be logged in to leave comments. Login now