Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | import os |
2 | import base64 | |
3 | import shutil | |
4 | import gettext | |
5 | import unittest | |
6 | ||
7 | from test.test_support import run_suite | |
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 | ||
149 | ||
150 | class GettextTestCase2(GettextBaseTest): | |
151 | def setUp(self): | |
152 | GettextBaseTest.setUp(self) | |
153 | self.localedir = os.curdir | |
154 | # Set up the bindings | |
155 | gettext.bindtextdomain('gettext', self.localedir) | |
156 | gettext.textdomain('gettext') | |
157 | # For convenience | |
158 | self._ = gettext.gettext | |
159 | ||
160 | def test_bindtextdomain(self): | |
161 | self.assertEqual(gettext.bindtextdomain('gettext'), self.localedir) | |
162 | ||
163 | def test_textdomain(self): | |
164 | self.assertEqual(gettext.textdomain(), 'gettext') | |
165 | ||
166 | def test_some_translations(self): | |
167 | eq = self.assertEqual | |
168 | # test some translations | |
169 | eq(self._('albatross'), 'albatross') | |
170 | eq(self._(u'mullusk'), 'bacon') | |
171 | eq(self._(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove') | |
172 | eq(self._(ur'nudge nudge'), 'wink wink') | |
173 | ||
174 | def test_double_quotes(self): | |
175 | eq = self.assertEqual | |
176 | # double quotes | |
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_triple_single_quotes(self): | |
183 | eq = self.assertEqual | |
184 | # triple single 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_double_quotes(self): | |
191 | eq = self.assertEqual | |
192 | # triple double 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_multiline_strings(self): | |
199 | eq = self.assertEqual | |
200 | # multiline strings | |
201 | eq(self._('''This module provides internationalization and localization | |
202 | support for your Python programs by providing an interface to the GNU | |
203 | gettext message catalog library.'''), | |
204 | '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba | |
205 | fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH | |
206 | trggrkg zrffntr pngnybt yvoenel.''') | |
207 | ||
208 | ||
209 | class PluralFormsTestCase(GettextBaseTest): | |
210 | def setUp(self): | |
211 | GettextBaseTest.setUp(self) | |
212 | self.mofile = MOFILE | |
213 | ||
214 | def test_plural_forms1(self): | |
215 | eq = self.assertEqual | |
216 | x = gettext.ngettext('There is %s file', 'There are %s files', 1) | |
217 | eq(x, 'Hay %s fichero') | |
218 | x = gettext.ngettext('There is %s file', 'There are %s files', 2) | |
219 | eq(x, 'Hay %s ficheros') | |
220 | ||
221 | def test_plural_forms2(self): | |
222 | eq = self.assertEqual | |
223 | fp = open(self.mofile, 'rb') | |
224 | t = gettext.GNUTranslations(fp) | |
225 | fp.close() | |
226 | x = t.ngettext('There is %s file', 'There are %s files', 1) | |
227 | eq(x, 'Hay %s fichero') | |
228 | x = t.ngettext('There is %s file', 'There are %s files', 2) | |
229 | eq(x, 'Hay %s ficheros') | |
230 | ||
231 | def test_hu(self): | |
232 | eq = self.assertEqual | |
233 | f = gettext.c2py('0') | |
234 | s = ''.join([ str(f(x)) for x in range(200) ]) | |
235 | eq(s, "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") | |
236 | ||
237 | def test_de(self): | |
238 | eq = self.assertEqual | |
239 | f = gettext.c2py('n != 1') | |
240 | s = ''.join([ str(f(x)) for x in range(200) ]) | |
241 | eq(s, "10111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111") | |
242 | ||
243 | def test_fr(self): | |
244 | eq = self.assertEqual | |
245 | f = gettext.c2py('n>1') | |
246 | s = ''.join([ str(f(x)) for x in range(200) ]) | |
247 | eq(s, "00111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111") | |
248 | ||
249 | def test_gd(self): | |
250 | eq = self.assertEqual | |
251 | f = gettext.c2py('n==1 ? 0 : n==2 ? 1 : 2') | |
252 | s = ''.join([ str(f(x)) for x in range(200) ]) | |
253 | eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222") | |
254 | ||
255 | def test_gd2(self): | |
256 | eq = self.assertEqual | |
257 | # Tests the combination of parentheses and "?:" | |
258 | f = gettext.c2py('n==1 ? 0 : (n==2 ? 1 : 2)') | |
259 | s = ''.join([ str(f(x)) for x in range(200) ]) | |
260 | eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222") | |
261 | ||
262 | def test_lt(self): | |
263 | eq = self.assertEqual | |
264 | f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2') | |
265 | s = ''.join([ str(f(x)) for x in range(200) ]) | |
266 | eq(s, "20111111112222222222201111111120111111112011111111201111111120111111112011111111201111111120111111112011111111222222222220111111112011111111201111111120111111112011111111201111111120111111112011111111") | |
267 | ||
268 | def test_ru(self): | |
269 | eq = self.assertEqual | |
270 | f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2') | |
271 | s = ''.join([ str(f(x)) for x in range(200) ]) | |
272 | eq(s, "20111222222222222222201112222220111222222011122222201112222220111222222011122222201112222220111222222011122222222222222220111222222011122222201112222220111222222011122222201112222220111222222011122222") | |
273 | ||
274 | def test_pl(self): | |
275 | eq = self.assertEqual | |
276 | f = gettext.c2py('n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2') | |
277 | s = ''.join([ str(f(x)) for x in range(200) ]) | |
278 | eq(s, "20111222222222222222221112222222111222222211122222221112222222111222222211122222221112222222111222222211122222222222222222111222222211122222221112222222111222222211122222221112222222111222222211122222") | |
279 | ||
280 | def test_sl(self): | |
281 | eq = self.assertEqual | |
282 | f = gettext.c2py('n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3') | |
283 | s = ''.join([ str(f(x)) for x in range(200) ]) | |
284 | eq(s, "30122333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333012233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333") | |
285 | ||
286 | def test_security(self): | |
287 | raises = self.assertRaises | |
288 | # Test for a dangerous expression | |
289 | raises(ValueError, gettext.c2py, "os.chmod('/etc/passwd',0777)") | |
290 | ||
291 | ||
292 | class UnicodeTranslationsTest(GettextBaseTest): | |
293 | def setUp(self): | |
294 | GettextBaseTest.setUp(self) | |
295 | fp = open(UMOFILE, 'rb') | |
296 | try: | |
297 | self.t = gettext.GNUTranslations(fp) | |
298 | finally: | |
299 | fp.close() | |
300 | self._ = self.t.ugettext | |
301 | ||
302 | def test_unicode_msgid(self): | |
303 | unless = self.failUnless | |
304 | unless(isinstance(self._(''), unicode)) | |
305 | unless(isinstance(self._(u''), unicode)) | |
306 | ||
307 | def test_unicode_msgstr(self): | |
308 | eq = self.assertEqual | |
309 | eq(self._(u'ab\xde'), u'\xa4yz') | |
310 | ||
311 | ||
312 | class WeirdMetadataTest(GettextBaseTest): | |
313 | def setUp(self): | |
314 | GettextBaseTest.setUp(self) | |
315 | fp = open(MMOFILE, 'rb') | |
316 | try: | |
317 | try: | |
318 | self.t = gettext.GNUTranslations(fp) | |
319 | except: | |
320 | self.tearDown() | |
321 | raise | |
322 | finally: | |
323 | fp.close() | |
324 | ||
325 | def test_weird_metadata(self): | |
326 | info = self.t.info() | |
327 | self.assertEqual(info['last-translator'], | |
328 | 'John Doe <jdoe@example.com>\nJane Foobar <jfoobar@example.com>') | |
329 | ||
330 | ||
331 | def suite(): | |
332 | suite = unittest.TestSuite() | |
333 | suite.addTest(unittest.makeSuite(GettextTestCase1)) | |
334 | suite.addTest(unittest.makeSuite(GettextTestCase2)) | |
335 | suite.addTest(unittest.makeSuite(PluralFormsTestCase)) | |
336 | suite.addTest(unittest.makeSuite(UnicodeTranslationsTest)) | |
337 | suite.addTest(unittest.makeSuite(WeirdMetadataTest)) | |
338 | return suite | |
339 | ||
340 | ||
341 | def test_main(): | |
342 | run_suite(suite()) | |
343 | ||
344 | ||
345 | if __name__ == '__main__': | |
346 | test_main() | |
347 | ||
348 | ||
349 | # For reference, here's the .po file used to created the GNU_MO_DATA above. | |
350 | # | |
351 | # The original version was automatically generated from the sources with | |
352 | # pygettext. Later it was manually modified to add plural forms support. | |
353 | ||
354 | ''' | |
355 | # Dummy translation for the Python test_gettext.py module. | |
356 | # Copyright (C) 2001 Python Software Foundation | |
357 | # Barry Warsaw <barry@python.org>, 2000. | |
358 | # | |
359 | msgid "" | |
360 | msgstr "" | |
361 | "Project-Id-Version: 2.0\n" | |
362 | "PO-Revision-Date: 2003-04-11 14:32-0400\n" | |
363 | "Last-Translator: J. David Ibanez <j-david@noos.fr>\n" | |
364 | "Language-Team: XX <python-dev@python.org>\n" | |
365 | "MIME-Version: 1.0\n" | |
366 | "Content-Type: text/plain; charset=iso-8859-1\n" | |
367 | "Content-Transfer-Encoding: 8bit\n" | |
368 | "Generated-By: pygettext.py 1.1\n" | |
369 | "Plural-Forms: nplurals=2; plural=n!=1;\n" | |
370 | ||
371 | #: test_gettext.py:19 test_gettext.py:25 test_gettext.py:31 test_gettext.py:37 | |
372 | #: test_gettext.py:51 test_gettext.py:80 test_gettext.py:86 test_gettext.py:92 | |
373 | #: test_gettext.py:98 | |
374 | msgid "nudge nudge" | |
375 | msgstr "wink wink" | |
376 | ||
377 | #: test_gettext.py:16 test_gettext.py:22 test_gettext.py:28 test_gettext.py:34 | |
378 | #: test_gettext.py:77 test_gettext.py:83 test_gettext.py:89 test_gettext.py:95 | |
379 | msgid "albatross" | |
380 | msgstr "" | |
381 | ||
382 | #: test_gettext.py:18 test_gettext.py:24 test_gettext.py:30 test_gettext.py:36 | |
383 | #: test_gettext.py:79 test_gettext.py:85 test_gettext.py:91 test_gettext.py:97 | |
384 | msgid "Raymond Luxury Yach-t" | |
385 | msgstr "Throatwobbler Mangrove" | |
386 | ||
387 | #: test_gettext.py:17 test_gettext.py:23 test_gettext.py:29 test_gettext.py:35 | |
388 | #: test_gettext.py:56 test_gettext.py:78 test_gettext.py:84 test_gettext.py:90 | |
389 | #: test_gettext.py:96 | |
390 | msgid "mullusk" | |
391 | msgstr "bacon" | |
392 | ||
393 | #: test_gettext.py:40 test_gettext.py:101 | |
394 | msgid "" | |
395 | "This module provides internationalization and localization\n" | |
396 | "support for your Python programs by providing an interface to the GNU\n" | |
397 | "gettext message catalog library." | |
398 | msgstr "" | |
399 | "Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba\n" | |
400 | "fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH\n" | |
401 | "trggrkg zrffntr pngnybt yvoenel." | |
402 | ||
403 | # Manually added, as neither pygettext nor xgettext support plural forms | |
404 | # in Python. | |
405 | msgid "There is %s file" | |
406 | msgid_plural "There are %s files" | |
407 | msgstr[0] "Hay %s fichero" | |
408 | msgstr[1] "Hay %s ficheros" | |
409 | ''' | |
410 | ||
411 | # Here's the second example po file example, used to generate the UMO_DATA | |
412 | # containing utf-8 encoded Unicode strings | |
413 | ||
414 | ''' | |
415 | # Dummy translation for the Python test_gettext.py module. | |
416 | # Copyright (C) 2001 Python Software Foundation | |
417 | # Barry Warsaw <barry@python.org>, 2000. | |
418 | # | |
419 | msgid "" | |
420 | msgstr "" | |
421 | "Project-Id-Version: 2.0\n" | |
422 | "PO-Revision-Date: 2003-04-11 12:42-0400\n" | |
423 | "Last-Translator: Barry A. WArsaw <barry@python.org>\n" | |
424 | "Language-Team: XX <python-dev@python.org>\n" | |
425 | "MIME-Version: 1.0\n" | |
426 | "Content-Type: text/plain; charset=utf-8\n" | |
427 | "Content-Transfer-Encoding: 7bit\n" | |
428 | "Generated-By: manually\n" | |
429 | ||
430 | #: nofile:0 | |
431 | msgid "ab\xc3\x9e" | |
432 | msgstr "\xc2\xa4yz" | |
433 | ''' | |
434 | ||
435 | # Here's the third example po file, used to generate MMO_DATA | |
436 | ||
437 | ''' | |
438 | msgid "" | |
439 | msgstr "" | |
440 | "Project-Id-Version: No Project 0.0\n" | |
441 | "POT-Creation-Date: Wed Dec 11 07:44:15 2002\n" | |
442 | "PO-Revision-Date: 2002-08-14 01:18:58+00:00\n" | |
443 | "Last-Translator: John Doe <jdoe@example.com>\n" | |
444 | "Jane Foobar <jfoobar@example.com>\n" | |
445 | "Language-Team: xx <xx@example.com>\n" | |
446 | "MIME-Version: 1.0\n" | |
447 | "Content-Type: text/plain; charset=iso-8859-15\n" | |
448 | "Content-Transfer-Encoding: quoted-printable\n" | |
449 | "Generated-By: pygettext.py 1.3\n" | |
450 | ''' |