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