1 Index: Python-2.7.9/Lib/gettext.py
2 ===================================================================
3 --- Python-2.7.9.orig/Lib/gettext.py
4 +++ Python-2.7.9/Lib/gettext.py
5 @@ -53,6 +53,7 @@ from errno import ENOENT
6 __all__ = ['NullTranslations', 'GNUTranslations', 'Catalog',
7 'find', 'translation', 'install', 'textdomain', 'bindtextdomain',
8 'dgettext', 'dngettext', 'gettext', 'ngettext',
9 + 'pgettext', 'lpgettext', 'npgettext', 'lnpgettext', 'ldnpgettext',
12 _default_localedir = os.path.join(sys.prefix, 'share', 'locale')
13 @@ -193,11 +194,21 @@ class NullTranslations:
14 return self._fallback.gettext(message)
17 + def pgettext(self, context, message):
19 + return self._fallback.pgettext(context, message)
22 def lgettext(self, message):
24 return self._fallback.lgettext(message)
27 + def lpgettext(self, context, message):
29 + return self._fallback.lpgettext(context, message)
32 def ngettext(self, msgid1, msgid2, n):
34 return self._fallback.ngettext(msgid1, msgid2, n)
35 @@ -206,6 +217,14 @@ class NullTranslations:
39 + def npgettext(self, context, msgid1, msgid2, n):
41 + return self._fallback.npgettext(context, msgid1, msgid2, n)
47 def lngettext(self, msgid1, msgid2, n):
49 return self._fallback.lngettext(msgid1, msgid2, n)
50 @@ -227,6 +246,14 @@ class NullTranslations:
52 return unicode(msgid2)
54 + def lnpgettext(self, context, msgid1, msgid2, n):
56 + return self._fallback.lnpgettext(context, msgid1, msgid2, n)
65 @@ -252,13 +279,22 @@ class NullTranslations:
66 __builtin__.__dict__['lgettext'] = self.lgettext
67 if "lngettext" in names:
68 __builtin__.__dict__['lngettext'] = self.lngettext
70 + if "pgettext" in names:
71 + __builtin__.__dict__['pgettext'] = self.pgettext
72 + if "npgettext" in names:
73 + __builtin__.__dict__['npgettext'] = self.npgettext
74 + if "lnpgettext" in names:
75 + __builtin__.__dict__['lnpgettext'] = self.lnpgettext
77 class GNUTranslations(NullTranslations):
78 # Magic number of .mo files
79 LE_MAGIC = 0x950412deL
80 BE_MAGIC = 0xde120495L
82 + # The encoding of a msgctxt and a msgid in a .mo file is
83 + # msgctxt + "\x04" + msgid (gettext version >= 0.15)
84 + CONTEXT = "%s\x04%s"
87 """Override this method to support alternative .mo formats."""
88 unpack = struct.unpack
89 @@ -354,6 +390,21 @@ class GNUTranslations(NullTranslations):
90 return tmsg.encode(self._charset)
93 + def pgettext(self, context, message):
94 + ctxt_msg_id = self.CONTEXT % (context, message)
96 + tmsg = self._catalog.get(ctxt_msg_id, missing)
99 + return self._fallback.pgettext(context, message)
101 + # Encode the Unicode tmsg back to an 8-bit string, if possible
102 + if self._output_charset:
103 + return tmsg.encode(self._output_charset)
104 + elif self._charset:
105 + return tmsg.encode(self._charset)
108 def lgettext(self, message):
110 tmsg = self._catalog.get(message, missing)
111 @@ -365,6 +416,18 @@ class GNUTranslations(NullTranslations):
112 return tmsg.encode(self._output_charset)
113 return tmsg.encode(locale.getpreferredencoding())
115 + def lpgettext(self, context, message):
116 + ctxt_msg_id = self.CONTEXT % (context, message)
118 + tmsg = self._catalog.get(ctxt_msg_id, missing)
119 + if tmsg is missing:
121 + return self._fallback.lpgettext(context, message)
123 + if self._output_charset:
124 + return tmsg.encode(self._output_charset)
125 + return tmsg.encode(locale.getpreferredencoding())
127 def ngettext(self, msgid1, msgid2, n):
129 tmsg = self._catalog[(msgid1, self.plural(n))]
130 @@ -381,6 +444,23 @@ class GNUTranslations(NullTranslations):
134 + def npgettext(self, context, msgid1, msgid2, n):
135 + ctxt_msg_id = self.CONTEXT % (context, msgid1)
137 + tmsg = self._catalog[(ctxt_msg_id, self.plural(n))]
138 + if self._output_charset:
139 + return tmsg.encode(self._output_charset)
140 + elif self._charset:
141 + return tmsg.encode(self._charset)
145 + return self._fallback.npgettext(context, msgid1, msgid2, n)
151 def lngettext(self, msgid1, msgid2, n):
153 tmsg = self._catalog[(msgid1, self.plural(n))]
154 @@ -416,6 +496,21 @@ class GNUTranslations(NullTranslations):
155 tmsg = unicode(msgid2)
158 + def lnpgettext(self, context, msgid1, msgid2, n):
159 + ctxt_msg_id = self.CONTEXT % (context, msgid1)
161 + tmsg = self._catalog[(ctxt_msg_id, self.plural(n))]
162 + if self._output_charset:
163 + return tmsg.encode(self._output_charset)
164 + return tmsg.encode(locale.getpreferredencoding())
167 + return self._fallback.lnpgettext(context, msgid1, msgid2, n)
174 # Locate a .mo file using the gettext strategy
175 def find(domain, localedir=None, languages=None, all=0):
176 @@ -532,6 +627,14 @@ def dgettext(domain, message):
178 return t.gettext(message)
180 +def dpgettext(domain, context, message):
182 + t = translation(domain, _localedirs.get(domain, None),
183 + codeset=_localecodesets.get(domain))
186 + return t.pgettext(context, message)
188 def ldgettext(domain, message):
190 t = translation(domain, _localedirs.get(domain, None),
191 @@ -540,6 +643,14 @@ def ldgettext(domain, message):
193 return t.lgettext(message)
195 +def ldpgettext(domain, context, message):
197 + t = translation(domain, _localedirs.get(domain, None),
198 + codeset=_localecodesets.get(domain))
201 + return t.lpgettext(context, message)
203 def dngettext(domain, msgid1, msgid2, n):
205 t = translation(domain, _localedirs.get(domain, None),
206 @@ -551,6 +662,17 @@ def dngettext(domain, msgid1, msgid2, n)
208 return t.ngettext(msgid1, msgid2, n)
210 +def dnpgettext(domain, context, msgid1, msgid2, n):
212 + t = translation(domain, _localedirs.get(domain, None),
213 + codeset=_localecodesets.get(domain))
219 + return t.npgettext(context, msgid1, msgid2, n)
221 def ldngettext(domain, msgid1, msgid2, n):
223 t = translation(domain, _localedirs.get(domain, None),
224 @@ -562,18 +684,41 @@ def ldngettext(domain, msgid1, msgid2, n
226 return t.lngettext(msgid1, msgid2, n)
228 +def ldnpgettext(domain, context, msgid1, msgid2, n):
230 + t = translation(domain, _localedirs.get(domain, None),
231 + codeset=_localecodesets.get(domain))
237 + return t.lnpgettext(context, msgid1, msgid2, n)
239 def gettext(message):
240 return dgettext(_current_domain, message)
242 +def pgettext(context, message):
243 + return dpgettext(_current_domain, context, message)
245 def lgettext(message):
246 return ldgettext(_current_domain, message)
248 +def lpgettext(context, message):
249 + return ldpgettext(_current_domain, context, message)
251 def ngettext(msgid1, msgid2, n):
252 return dngettext(_current_domain, msgid1, msgid2, n)
254 +def npgettext(context, msgid1, msgid2, n):
255 + return dnpgettext(_current_domain, context, msgid1, msgid2, n)
257 def lngettext(msgid1, msgid2, n):
258 return ldngettext(_current_domain, msgid1, msgid2, n)
260 +def lnpgettext(context, msgid1, msgid2, n):
261 + return ldnpgettext(_current_domain, context, msgid1, msgid2, n)
263 # dcgettext() has been deemed unnecessary and is not implemented.
265 # James Henstridge's Catalog constructor from GNOME gettext. Documented usage
266 Index: Python-2.7.9/Tools/i18n/msgfmt.py
267 ===================================================================
268 --- Python-2.7.9.orig/Tools/i18n/msgfmt.py
269 +++ Python-2.7.9/Tools/i18n/msgfmt.py
272 This program converts a textual Uniforum-style message catalog (.po file) into
273 a binary GNU catalog (.mo file). This is essentially the same function as the
274 -GNU msgfmt program, however, it is a simpler implementation.
275 +GNU msgfmt program, however, it is a simpler implementation. Currently it
276 +does not handle plural forms but it does handle message contexts.
278 Usage: msgfmt.py [OPTIONS] filename.po
280 @@ -32,7 +33,7 @@ import getopt
289 @@ -46,11 +47,14 @@ def usage(code, msg=''):
293 -def add(id, str, fuzzy):
294 +def add(ctxt, id, str, fuzzy):
295 "Add a non-fuzzy translation to the dictionary."
297 if not fuzzy and str:
302 + MESSAGES["%s\x04%s" % (ctxt, id)] = str
306 @@ -100,6 +104,7 @@ def generate():
307 def make(filename, outfile):
312 # Compute .mo name from .po name and arguments
313 if filename.endswith('.po'):
314 @@ -115,7 +120,7 @@ def make(filename, outfile):
315 print >> sys.stderr, msg
319 + section = msgctxt = None
323 @@ -124,8 +129,8 @@ def make(filename, outfile):
325 # If we get a comment line after a msgstr, this is a new entry
326 if l[0] == '#' and section == STR:
327 - add(msgid, msgstr, fuzzy)
329 + add(msgctxt, msgid, msgstr, fuzzy)
330 + section = msgctxt = None
332 # Record a fuzzy mark
333 if l[:2] == '#,' and 'fuzzy' in l:
334 @@ -133,10 +138,16 @@ def make(filename, outfile):
338 - # Now we are in a msgid section, output previous section
339 - if l.startswith('msgid') and not l.startswith('msgid_plural'):
340 + # Now we are in a msgid or msgctxt section, output previous section
341 + if l.startswith("msgctxt"):
343 + add(msgctxt, msgid, msgstr, fuzzy)
347 + elif l.startswith('msgid') and not l.startswith('msgid_plural'):
349 - add(msgid, msgstr, fuzzy)
350 + add(msgctxt, msgid, msgstr, fuzzy)
354 @@ -174,6 +185,8 @@ def make(filename, outfile):
355 l = ast.literal_eval(l)
358 + elif section == CTXT:
363 @@ -183,7 +196,7 @@ def make(filename, outfile):
367 - add(msgid, msgstr, fuzzy)
368 + add(msgctxt, msgid, msgstr, fuzzy)