|
1 import os |
|
2 import base64 |
|
3 import shutil |
|
4 import gettext |
|
5 import unittest |
|
6 |
|
7 from test import test_support |
|
8 |
|
9 |
|
10 # TODO: |
|
11 # - Add new tests, for example for "dgettext" |
|
12 # - Remove dummy tests, for example testing for single and double quotes |
|
13 # has no sense, it would have if we were testing a parser (i.e. pygettext) |
|
14 # - Tests should have only one assert. |
|
15 |
|
16 GNU_MO_DATA = '''\ |
|
17 3hIElQAAAAAGAAAAHAAAAEwAAAALAAAAfAAAAAAAAACoAAAAFQAAAKkAAAAjAAAAvwAAAKEAAADj |
|
18 AAAABwAAAIUBAAALAAAAjQEAAEUBAACZAQAAFgAAAN8CAAAeAAAA9gIAAKEAAAAVAwAABQAAALcD |
|
19 AAAJAAAAvQMAAAEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABQAAAAYAAAACAAAAAFJh |
|
20 eW1vbmQgTHV4dXJ5IFlhY2gtdABUaGVyZSBpcyAlcyBmaWxlAFRoZXJlIGFyZSAlcyBmaWxlcwBU |
|
21 aGlzIG1vZHVsZSBwcm92aWRlcyBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgbG9jYWxpemF0aW9u |
|
22 CnN1cHBvcnQgZm9yIHlvdXIgUHl0aG9uIHByb2dyYW1zIGJ5IHByb3ZpZGluZyBhbiBpbnRlcmZh |
|
23 Y2UgdG8gdGhlIEdOVQpnZXR0ZXh0IG1lc3NhZ2UgY2F0YWxvZyBsaWJyYXJ5LgBtdWxsdXNrAG51 |
|
24 ZGdlIG51ZGdlAFByb2plY3QtSWQtVmVyc2lvbjogMi4wClBPLVJldmlzaW9uLURhdGU6IDIwMDAt |
|
25 MDgtMjkgMTI6MTktMDQ6MDAKTGFzdC1UcmFuc2xhdG9yOiBKLiBEYXZpZCBJYsOhw7FleiA8ai1k |
|
26 YXZpZEBub29zLmZyPgpMYW5ndWFnZS1UZWFtOiBYWCA8cHl0aG9uLWRldkBweXRob24ub3JnPgpN |
|
27 SU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9aXNvLTg4 |
|
28 NTktMQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBub25lCkdlbmVyYXRlZC1CeTogcHlnZXR0 |
|
29 ZXh0LnB5IDEuMQpQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD1uIT0xOwoAVGhyb2F0 |
|
30 d29iYmxlciBNYW5ncm92ZQBIYXkgJXMgZmljaGVybwBIYXkgJXMgZmljaGVyb3MAR3V2ZiB6YnFo |
|
31 eXIgY2ViaXZxcmYgdmFncmVhbmd2YmFueXZtbmd2YmEgbmFxIHlicG55dm1uZ3ZiYQpmaGNjYmVn |
|
32 IHNiZSBsYmhlIENsZ3ViYSBjZWJ0ZW56ZiBvbCBjZWJpdnF2YXQgbmEgdmFncmVzbnByIGdiIGd1 |
|
33 ciBUQUgKdHJnZ3JrZyB6cmZmbnRyIHBuZ255YnQgeXZvZW5lbC4AYmFjb24Ad2luayB3aW5rAA== |
|
34 ''' |
|
35 |
|
36 UMO_DATA = '''\ |
|
37 3hIElQAAAAACAAAAHAAAACwAAAAFAAAAPAAAAAAAAABQAAAABAAAAFEAAAAPAQAAVgAAAAQAAABm |
|
38 AQAAAQAAAAIAAAAAAAAAAAAAAAAAAAAAYWLDngBQcm9qZWN0LUlkLVZlcnNpb246IDIuMApQTy1S |
|
39 ZXZpc2lvbi1EYXRlOiAyMDAzLTA0LTExIDEyOjQyLTA0MDAKTGFzdC1UcmFuc2xhdG9yOiBCYXJy |
|
40 eSBBLiBXQXJzYXcgPGJhcnJ5QHB5dGhvbi5vcmc+Ckxhbmd1YWdlLVRlYW06IFhYIDxweXRob24t |
|
41 ZGV2QHB5dGhvbi5vcmc+Ck1JTUUtVmVyc2lvbjogMS4wCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFp |
|
42 bjsgY2hhcnNldD11dGYtOApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CkdlbmVyYXRl |
|
43 ZC1CeTogbWFudWFsbHkKAMKkeXoA |
|
44 ''' |
|
45 |
|
46 MMO_DATA = '''\ |
|
47 3hIElQAAAAABAAAAHAAAACQAAAADAAAALAAAAAAAAAA4AAAAeAEAADkAAAABAAAAAAAAAAAAAAAA |
|
48 UHJvamVjdC1JZC1WZXJzaW9uOiBObyBQcm9qZWN0IDAuMApQT1QtQ3JlYXRpb24tRGF0ZTogV2Vk |
|
49 IERlYyAxMSAwNzo0NDoxNSAyMDAyClBPLVJldmlzaW9uLURhdGU6IDIwMDItMDgtMTQgMDE6MTg6 |
|
50 NTgrMDA6MDAKTGFzdC1UcmFuc2xhdG9yOiBKb2huIERvZSA8amRvZUBleGFtcGxlLmNvbT4KSmFu |
|
51 ZSBGb29iYXIgPGpmb29iYXJAZXhhbXBsZS5jb20+Ckxhbmd1YWdlLVRlYW06IHh4IDx4eEBleGFt |
|
52 cGxlLmNvbT4KTUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFy |
|
53 c2V0PWlzby04ODU5LTE1CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IHF1b3RlZC1wcmludGFi |
|
54 bGUKR2VuZXJhdGVkLUJ5OiBweWdldHRleHQucHkgMS4zCgA= |
|
55 ''' |
|
56 |
|
57 LOCALEDIR = os.path.join('xx', 'LC_MESSAGES') |
|
58 MOFILE = os.path.join(LOCALEDIR, 'gettext.mo') |
|
59 UMOFILE = os.path.join(LOCALEDIR, 'ugettext.mo') |
|
60 MMOFILE = os.path.join(LOCALEDIR, 'metadata.mo') |
|
61 try: |
|
62 LANG = os.environ['LANGUAGE'] |
|
63 except: |
|
64 LANG = 'en' |
|
65 |
|
66 |
|
67 class GettextBaseTest(unittest.TestCase): |
|
68 def setUp(self): |
|
69 if not os.path.isdir(LOCALEDIR): |
|
70 os.makedirs(LOCALEDIR) |
|
71 fp = open(MOFILE, 'wb') |
|
72 fp.write(base64.decodestring(GNU_MO_DATA)) |
|
73 fp.close() |
|
74 fp = open(UMOFILE, 'wb') |
|
75 fp.write(base64.decodestring(UMO_DATA)) |
|
76 fp.close() |
|
77 fp = open(MMOFILE, 'wb') |
|
78 fp.write(base64.decodestring(MMO_DATA)) |
|
79 fp.close() |
|
80 os.environ['LANGUAGE'] = 'xx' |
|
81 |
|
82 def tearDown(self): |
|
83 os.environ['LANGUAGE'] = LANG |
|
84 shutil.rmtree(os.path.split(LOCALEDIR)[0]) |
|
85 |
|
86 |
|
87 class GettextTestCase1(GettextBaseTest): |
|
88 def setUp(self): |
|
89 GettextBaseTest.setUp(self) |
|
90 self.localedir = os.curdir |
|
91 self.mofile = MOFILE |
|
92 gettext.install('gettext', self.localedir) |
|
93 |
|
94 def test_some_translations(self): |
|
95 eq = self.assertEqual |
|
96 # test some translations |
|
97 eq(_('albatross'), 'albatross') |
|
98 eq(_(u'mullusk'), 'bacon') |
|
99 eq(_(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove') |
|
100 eq(_(ur'nudge nudge'), 'wink wink') |
|
101 |
|
102 def test_double_quotes(self): |
|
103 eq = self.assertEqual |
|
104 # double quotes |
|
105 eq(_("albatross"), 'albatross') |
|
106 eq(_(u"mullusk"), 'bacon') |
|
107 eq(_(r"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove') |
|
108 eq(_(ur"nudge nudge"), 'wink wink') |
|
109 |
|
110 def test_triple_single_quotes(self): |
|
111 eq = self.assertEqual |
|
112 # triple single quotes |
|
113 eq(_('''albatross'''), 'albatross') |
|
114 eq(_(u'''mullusk'''), 'bacon') |
|
115 eq(_(r'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove') |
|
116 eq(_(ur'''nudge nudge'''), 'wink wink') |
|
117 |
|
118 def test_triple_double_quotes(self): |
|
119 eq = self.assertEqual |
|
120 # triple double quotes |
|
121 eq(_("""albatross"""), 'albatross') |
|
122 eq(_(u"""mullusk"""), 'bacon') |
|
123 eq(_(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove') |
|
124 eq(_(ur"""nudge nudge"""), 'wink wink') |
|
125 |
|
126 def test_multiline_strings(self): |
|
127 eq = self.assertEqual |
|
128 # multiline strings |
|
129 eq(_('''This module provides internationalization and localization |
|
130 support for your Python programs by providing an interface to the GNU |
|
131 gettext message catalog library.'''), |
|
132 '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba |
|
133 fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH |
|
134 trggrkg zrffntr pngnybt yvoenel.''') |
|
135 |
|
136 def test_the_alternative_interface(self): |
|
137 eq = self.assertEqual |
|
138 # test the alternative interface |
|
139 fp = open(self.mofile, 'rb') |
|
140 t = gettext.GNUTranslations(fp) |
|
141 fp.close() |
|
142 # Install the translation object |
|
143 t.install() |
|
144 eq(_('nudge nudge'), 'wink wink') |
|
145 # Try unicode return type |
|
146 t.install(unicode=True) |
|
147 eq(_('mullusk'), 'bacon') |
|
148 # Test installation of other methods |
|
149 import __builtin__ |
|
150 t.install(unicode=True, names=["gettext", "lgettext"]) |
|
151 eq(_, t.ugettext) |
|
152 eq(__builtin__.gettext, t.ugettext) |
|
153 eq(lgettext, t.lgettext) |
|
154 del __builtin__.gettext |
|
155 del __builtin__.lgettext |
|
156 |
|
157 |
|
158 class GettextTestCase2(GettextBaseTest): |
|
159 def setUp(self): |
|
160 GettextBaseTest.setUp(self) |
|
161 self.localedir = os.curdir |
|
162 # Set up the bindings |
|
163 gettext.bindtextdomain('gettext', self.localedir) |
|
164 gettext.textdomain('gettext') |
|
165 # For convenience |
|
166 self._ = gettext.gettext |
|
167 |
|
168 def test_bindtextdomain(self): |
|
169 self.assertEqual(gettext.bindtextdomain('gettext'), self.localedir) |
|
170 |
|
171 def test_textdomain(self): |
|
172 self.assertEqual(gettext.textdomain(), 'gettext') |
|
173 |
|
174 def test_some_translations(self): |
|
175 eq = self.assertEqual |
|
176 # test some translations |
|
177 eq(self._('albatross'), 'albatross') |
|
178 eq(self._(u'mullusk'), 'bacon') |
|
179 eq(self._(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove') |
|
180 eq(self._(ur'nudge nudge'), 'wink wink') |
|
181 |
|
182 def test_double_quotes(self): |
|
183 eq = self.assertEqual |
|
184 # double quotes |
|
185 eq(self._("albatross"), 'albatross') |
|
186 eq(self._(u"mullusk"), 'bacon') |
|
187 eq(self._(r"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove') |
|
188 eq(self._(ur"nudge nudge"), 'wink wink') |
|
189 |
|
190 def test_triple_single_quotes(self): |
|
191 eq = self.assertEqual |
|
192 # triple single quotes |
|
193 eq(self._('''albatross'''), 'albatross') |
|
194 eq(self._(u'''mullusk'''), 'bacon') |
|
195 eq(self._(r'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove') |
|
196 eq(self._(ur'''nudge nudge'''), 'wink wink') |
|
197 |
|
198 def test_triple_double_quotes(self): |
|
199 eq = self.assertEqual |
|
200 # triple double quotes |
|
201 eq(self._("""albatross"""), 'albatross') |
|
202 eq(self._(u"""mullusk"""), 'bacon') |
|
203 eq(self._(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove') |
|
204 eq(self._(ur"""nudge nudge"""), 'wink wink') |
|
205 |
|
206 def test_multiline_strings(self): |
|
207 eq = self.assertEqual |
|
208 # multiline strings |
|
209 eq(self._('''This module provides internationalization and localization |
|
210 support for your Python programs by providing an interface to the GNU |
|
211 gettext message catalog library.'''), |
|
212 '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba |
|
213 fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH |
|
214 trggrkg zrffntr pngnybt yvoenel.''') |
|
215 |
|
216 |
|
217 class PluralFormsTestCase(GettextBaseTest): |
|
218 def setUp(self): |
|
219 GettextBaseTest.setUp(self) |
|
220 self.mofile = MOFILE |
|
221 |
|
222 def test_plural_forms1(self): |
|
223 eq = self.assertEqual |
|
224 x = gettext.ngettext('There is %s file', 'There are %s files', 1) |
|
225 eq(x, 'Hay %s fichero') |
|
226 x = gettext.ngettext('There is %s file', 'There are %s files', 2) |
|
227 eq(x, 'Hay %s ficheros') |
|
228 |
|
229 def test_plural_forms2(self): |
|
230 eq = self.assertEqual |
|
231 fp = open(self.mofile, 'rb') |
|
232 t = gettext.GNUTranslations(fp) |
|
233 fp.close() |
|
234 x = t.ngettext('There is %s file', 'There are %s files', 1) |
|
235 eq(x, 'Hay %s fichero') |
|
236 x = t.ngettext('There is %s file', 'There are %s files', 2) |
|
237 eq(x, 'Hay %s ficheros') |
|
238 |
|
239 def test_hu(self): |
|
240 eq = self.assertEqual |
|
241 f = gettext.c2py('0') |
|
242 s = ''.join([ str(f(x)) for x in range(200) ]) |
|
243 eq(s, "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") |
|
244 |
|
245 def test_de(self): |
|
246 eq = self.assertEqual |
|
247 f = gettext.c2py('n != 1') |
|
248 s = ''.join([ str(f(x)) for x in range(200) ]) |
|
249 eq(s, "10111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111") |
|
250 |
|
251 def test_fr(self): |
|
252 eq = self.assertEqual |
|
253 f = gettext.c2py('n>1') |
|
254 s = ''.join([ str(f(x)) for x in range(200) ]) |
|
255 eq(s, "00111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111") |
|
256 |
|
257 def test_gd(self): |
|
258 eq = self.assertEqual |
|
259 f = gettext.c2py('n==1 ? 0 : n==2 ? 1 : 2') |
|
260 s = ''.join([ str(f(x)) for x in range(200) ]) |
|
261 eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222") |
|
262 |
|
263 def test_gd2(self): |
|
264 eq = self.assertEqual |
|
265 # Tests the combination of parentheses and "?:" |
|
266 f = gettext.c2py('n==1 ? 0 : (n==2 ? 1 : 2)') |
|
267 s = ''.join([ str(f(x)) for x in range(200) ]) |
|
268 eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222") |
|
269 |
|
270 def test_lt(self): |
|
271 eq = self.assertEqual |
|
272 f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2') |
|
273 s = ''.join([ str(f(x)) for x in range(200) ]) |
|
274 eq(s, "20111111112222222222201111111120111111112011111111201111111120111111112011111111201111111120111111112011111111222222222220111111112011111111201111111120111111112011111111201111111120111111112011111111") |
|
275 |
|
276 def test_ru(self): |
|
277 eq = self.assertEqual |
|
278 f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2') |
|
279 s = ''.join([ str(f(x)) for x in range(200) ]) |
|
280 eq(s, "20111222222222222222201112222220111222222011122222201112222220111222222011122222201112222220111222222011122222222222222220111222222011122222201112222220111222222011122222201112222220111222222011122222") |
|
281 |
|
282 def test_pl(self): |
|
283 eq = self.assertEqual |
|
284 f = gettext.c2py('n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2') |
|
285 s = ''.join([ str(f(x)) for x in range(200) ]) |
|
286 eq(s, "20111222222222222222221112222222111222222211122222221112222222111222222211122222221112222222111222222211122222222222222222111222222211122222221112222222111222222211122222221112222222111222222211122222") |
|
287 |
|
288 def test_sl(self): |
|
289 eq = self.assertEqual |
|
290 f = gettext.c2py('n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3') |
|
291 s = ''.join([ str(f(x)) for x in range(200) ]) |
|
292 eq(s, "30122333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333012233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333") |
|
293 |
|
294 def test_security(self): |
|
295 raises = self.assertRaises |
|
296 # Test for a dangerous expression |
|
297 raises(ValueError, gettext.c2py, "os.chmod('/etc/passwd',0777)") |
|
298 |
|
299 |
|
300 class UnicodeTranslationsTest(GettextBaseTest): |
|
301 def setUp(self): |
|
302 GettextBaseTest.setUp(self) |
|
303 fp = open(UMOFILE, 'rb') |
|
304 try: |
|
305 self.t = gettext.GNUTranslations(fp) |
|
306 finally: |
|
307 fp.close() |
|
308 self._ = self.t.ugettext |
|
309 |
|
310 def test_unicode_msgid(self): |
|
311 unless = self.failUnless |
|
312 unless(isinstance(self._(''), unicode)) |
|
313 unless(isinstance(self._(u''), unicode)) |
|
314 |
|
315 def test_unicode_msgstr(self): |
|
316 eq = self.assertEqual |
|
317 eq(self._(u'ab\xde'), u'\xa4yz') |
|
318 |
|
319 |
|
320 class WeirdMetadataTest(GettextBaseTest): |
|
321 def setUp(self): |
|
322 GettextBaseTest.setUp(self) |
|
323 fp = open(MMOFILE, 'rb') |
|
324 try: |
|
325 try: |
|
326 self.t = gettext.GNUTranslations(fp) |
|
327 except: |
|
328 self.tearDown() |
|
329 raise |
|
330 finally: |
|
331 fp.close() |
|
332 |
|
333 def test_weird_metadata(self): |
|
334 info = self.t.info() |
|
335 self.assertEqual(info['last-translator'], |
|
336 'John Doe <jdoe@example.com>\nJane Foobar <jfoobar@example.com>') |
|
337 |
|
338 |
|
339 def test_main(): |
|
340 test_support.run_unittest(__name__) |
|
341 |
|
342 if __name__ == '__main__': |
|
343 test_main() |
|
344 |
|
345 |
|
346 # For reference, here's the .po file used to created the GNU_MO_DATA above. |
|
347 # |
|
348 # The original version was automatically generated from the sources with |
|
349 # pygettext. Later it was manually modified to add plural forms support. |
|
350 |
|
351 ''' |
|
352 # Dummy translation for the Python test_gettext.py module. |
|
353 # Copyright (C) 2001 Python Software Foundation |
|
354 # Barry Warsaw <barry@python.org>, 2000. |
|
355 # |
|
356 msgid "" |
|
357 msgstr "" |
|
358 "Project-Id-Version: 2.0\n" |
|
359 "PO-Revision-Date: 2003-04-11 14:32-0400\n" |
|
360 "Last-Translator: J. David Ibanez <j-david@noos.fr>\n" |
|
361 "Language-Team: XX <python-dev@python.org>\n" |
|
362 "MIME-Version: 1.0\n" |
|
363 "Content-Type: text/plain; charset=iso-8859-1\n" |
|
364 "Content-Transfer-Encoding: 8bit\n" |
|
365 "Generated-By: pygettext.py 1.1\n" |
|
366 "Plural-Forms: nplurals=2; plural=n!=1;\n" |
|
367 |
|
368 #: test_gettext.py:19 test_gettext.py:25 test_gettext.py:31 test_gettext.py:37 |
|
369 #: test_gettext.py:51 test_gettext.py:80 test_gettext.py:86 test_gettext.py:92 |
|
370 #: test_gettext.py:98 |
|
371 msgid "nudge nudge" |
|
372 msgstr "wink wink" |
|
373 |
|
374 #: test_gettext.py:16 test_gettext.py:22 test_gettext.py:28 test_gettext.py:34 |
|
375 #: test_gettext.py:77 test_gettext.py:83 test_gettext.py:89 test_gettext.py:95 |
|
376 msgid "albatross" |
|
377 msgstr "" |
|
378 |
|
379 #: test_gettext.py:18 test_gettext.py:24 test_gettext.py:30 test_gettext.py:36 |
|
380 #: test_gettext.py:79 test_gettext.py:85 test_gettext.py:91 test_gettext.py:97 |
|
381 msgid "Raymond Luxury Yach-t" |
|
382 msgstr "Throatwobbler Mangrove" |
|
383 |
|
384 #: test_gettext.py:17 test_gettext.py:23 test_gettext.py:29 test_gettext.py:35 |
|
385 #: test_gettext.py:56 test_gettext.py:78 test_gettext.py:84 test_gettext.py:90 |
|
386 #: test_gettext.py:96 |
|
387 msgid "mullusk" |
|
388 msgstr "bacon" |
|
389 |
|
390 #: test_gettext.py:40 test_gettext.py:101 |
|
391 msgid "" |
|
392 "This module provides internationalization and localization\n" |
|
393 "support for your Python programs by providing an interface to the GNU\n" |
|
394 "gettext message catalog library." |
|
395 msgstr "" |
|
396 "Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba\n" |
|
397 "fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH\n" |
|
398 "trggrkg zrffntr pngnybt yvoenel." |
|
399 |
|
400 # Manually added, as neither pygettext nor xgettext support plural forms |
|
401 # in Python. |
|
402 msgid "There is %s file" |
|
403 msgid_plural "There are %s files" |
|
404 msgstr[0] "Hay %s fichero" |
|
405 msgstr[1] "Hay %s ficheros" |
|
406 ''' |
|
407 |
|
408 # Here's the second example po file example, used to generate the UMO_DATA |
|
409 # containing utf-8 encoded Unicode strings |
|
410 |
|
411 ''' |
|
412 # Dummy translation for the Python test_gettext.py module. |
|
413 # Copyright (C) 2001 Python Software Foundation |
|
414 # Barry Warsaw <barry@python.org>, 2000. |
|
415 # |
|
416 msgid "" |
|
417 msgstr "" |
|
418 "Project-Id-Version: 2.0\n" |
|
419 "PO-Revision-Date: 2003-04-11 12:42-0400\n" |
|
420 "Last-Translator: Barry A. WArsaw <barry@python.org>\n" |
|
421 "Language-Team: XX <python-dev@python.org>\n" |
|
422 "MIME-Version: 1.0\n" |
|
423 "Content-Type: text/plain; charset=utf-8\n" |
|
424 "Content-Transfer-Encoding: 7bit\n" |
|
425 "Generated-By: manually\n" |
|
426 |
|
427 #: nofile:0 |
|
428 msgid "ab\xc3\x9e" |
|
429 msgstr "\xc2\xa4yz" |
|
430 ''' |
|
431 |
|
432 # Here's the third example po file, used to generate MMO_DATA |
|
433 |
|
434 ''' |
|
435 msgid "" |
|
436 msgstr "" |
|
437 "Project-Id-Version: No Project 0.0\n" |
|
438 "POT-Creation-Date: Wed Dec 11 07:44:15 2002\n" |
|
439 "PO-Revision-Date: 2002-08-14 01:18:58+00:00\n" |
|
440 "Last-Translator: John Doe <jdoe@example.com>\n" |
|
441 "Jane Foobar <jfoobar@example.com>\n" |
|
442 "Language-Team: xx <xx@example.com>\n" |
|
443 "MIME-Version: 1.0\n" |
|
444 "Content-Type: text/plain; charset=iso-8859-15\n" |
|
445 "Content-Transfer-Encoding: quoted-printable\n" |
|
446 "Generated-By: pygettext.py 1.3\n" |
|
447 ''' |