blob: d345baa26b12c732c3ace0fb0f063238fe84ca40 [file] [log] [blame]
Barry Warsaw9e035922000-08-25 19:14:25 +00001import os
Barry Warsawff6d8132000-08-25 19:50:38 +00002import base64
Barry Warsaw9e035922000-08-25 19:14:25 +00003import gettext
Martin v. Löwisd8996052002-11-21 21:45:32 +00004import unittest
Barry Warsawa1ce93f2003-04-11 18:36:43 +00005
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006from test import support
Barry Warsawa1ce93f2003-04-11 18:36:43 +00007
Fred Drake004d5e62000-10-23 17:22:08 +00008
Martin v. Löwisd8996052002-11-21 21:45:32 +00009# TODO:
10# - Add new tests, for example for "dgettext"
11# - Remove dummy tests, for example testing for single and double quotes
12# has no sense, it would have if we were testing a parser (i.e. pygettext)
13# - Tests should have only one assert.
Barry Warsaw64dab462000-08-30 03:32:07 +000014
Guido van Rossum39478e82007-08-27 17:23:59 +000015GNU_MO_DATA = b'''\
Martin v. Löwisd8996052002-11-21 21:45:32 +0000163hIElQAAAAAGAAAAHAAAAEwAAAALAAAAfAAAAAAAAACoAAAAFQAAAKkAAAAjAAAAvwAAAKEAAADj
17AAAABwAAAIUBAAALAAAAjQEAAEUBAACZAQAAFgAAAN8CAAAeAAAA9gIAAKEAAAAVAwAABQAAALcD
18AAAJAAAAvQMAAAEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABQAAAAYAAAACAAAAAFJh
19eW1vbmQgTHV4dXJ5IFlhY2gtdABUaGVyZSBpcyAlcyBmaWxlAFRoZXJlIGFyZSAlcyBmaWxlcwBU
20aGlzIG1vZHVsZSBwcm92aWRlcyBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgbG9jYWxpemF0aW9u
21CnN1cHBvcnQgZm9yIHlvdXIgUHl0aG9uIHByb2dyYW1zIGJ5IHByb3ZpZGluZyBhbiBpbnRlcmZh
22Y2UgdG8gdGhlIEdOVQpnZXR0ZXh0IG1lc3NhZ2UgY2F0YWxvZyBsaWJyYXJ5LgBtdWxsdXNrAG51
23ZGdlIG51ZGdlAFByb2plY3QtSWQtVmVyc2lvbjogMi4wClBPLVJldmlzaW9uLURhdGU6IDIwMDAt
24MDgtMjkgMTI6MTktMDQ6MDAKTGFzdC1UcmFuc2xhdG9yOiBKLiBEYXZpZCBJYsOhw7FleiA8ai1k
25YXZpZEBub29zLmZyPgpMYW5ndWFnZS1UZWFtOiBYWCA8cHl0aG9uLWRldkBweXRob24ub3JnPgpN
26SU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9aXNvLTg4
27NTktMQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBub25lCkdlbmVyYXRlZC1CeTogcHlnZXR0
28ZXh0LnB5IDEuMQpQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD1uIT0xOwoAVGhyb2F0
29d29iYmxlciBNYW5ncm92ZQBIYXkgJXMgZmljaGVybwBIYXkgJXMgZmljaGVyb3MAR3V2ZiB6YnFo
30eXIgY2ViaXZxcmYgdmFncmVhbmd2YmFueXZtbmd2YmEgbmFxIHlicG55dm1uZ3ZiYQpmaGNjYmVn
31IHNiZSBsYmhlIENsZ3ViYSBjZWJ0ZW56ZiBvbCBjZWJpdnF2YXQgbmEgdmFncmVzbnByIGdiIGd1
32ciBUQUgKdHJnZ3JrZyB6cmZmbnRyIHBuZ255YnQgeXZvZW5lbC4AYmFjb24Ad2luayB3aW5rAA==
Barry Warsawff6d8132000-08-25 19:50:38 +000033'''
34
Antoine Pitroube8d06f2014-10-28 20:17:51 +010035# This data contains an invalid major version number (5)
36# An unexpected major version number should be treated as an error when
37# parsing a .mo file
38
39GNU_MO_DATA_BAD_MAJOR_VERSION = b'''\
403hIElQAABQAGAAAAHAAAAEwAAAALAAAAfAAAAAAAAACoAAAAFQAAAKkAAAAjAAAAvwAAAKEAAADj
41AAAABwAAAIUBAAALAAAAjQEAAEUBAACZAQAAFgAAAN8CAAAeAAAA9gIAAKEAAAAVAwAABQAAALcD
42AAAJAAAAvQMAAAEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABQAAAAYAAAACAAAAAFJh
43eW1vbmQgTHV4dXJ5IFlhY2gtdABUaGVyZSBpcyAlcyBmaWxlAFRoZXJlIGFyZSAlcyBmaWxlcwBU
44aGlzIG1vZHVsZSBwcm92aWRlcyBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgbG9jYWxpemF0aW9u
45CnN1cHBvcnQgZm9yIHlvdXIgUHl0aG9uIHByb2dyYW1zIGJ5IHByb3ZpZGluZyBhbiBpbnRlcmZh
46Y2UgdG8gdGhlIEdOVQpnZXR0ZXh0IG1lc3NhZ2UgY2F0YWxvZyBsaWJyYXJ5LgBtdWxsdXNrAG51
47ZGdlIG51ZGdlAFByb2plY3QtSWQtVmVyc2lvbjogMi4wClBPLVJldmlzaW9uLURhdGU6IDIwMDAt
48MDgtMjkgMTI6MTktMDQ6MDAKTGFzdC1UcmFuc2xhdG9yOiBKLiBEYXZpZCBJYsOhw7FleiA8ai1k
49YXZpZEBub29zLmZyPgpMYW5ndWFnZS1UZWFtOiBYWCA8cHl0aG9uLWRldkBweXRob24ub3JnPgpN
50SU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9aXNvLTg4
51NTktMQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBub25lCkdlbmVyYXRlZC1CeTogcHlnZXR0
52ZXh0LnB5IDEuMQpQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD1uIT0xOwoAVGhyb2F0
53d29iYmxlciBNYW5ncm92ZQBIYXkgJXMgZmljaGVybwBIYXkgJXMgZmljaGVyb3MAR3V2ZiB6YnFo
54eXIgY2ViaXZxcmYgdmFncmVhbmd2YmFueXZtbmd2YmEgbmFxIHlicG55dm1uZ3ZiYQpmaGNjYmVn
55IHNiZSBsYmhlIENsZ3ViYSBjZWJ0ZW56ZiBvbCBjZWJpdnF2YXQgbmEgdmFncmVzbnByIGdiIGd1
56ciBUQUgKdHJnZ3JrZyB6cmZmbnRyIHBuZ255YnQgeXZvZW5lbC4AYmFjb24Ad2luayB3aW5rAA==
57'''
58
59# This data contains an invalid minor version number (7)
60# An unexpected minor version number only indicates that some of the file's
61# contents may not be able to be read. It does not indicate an error.
62
63GNU_MO_DATA_BAD_MINOR_VERSION = b'''\
643hIElQcAAAAGAAAAHAAAAEwAAAALAAAAfAAAAAAAAACoAAAAFQAAAKkAAAAjAAAAvwAAAKEAAADj
65AAAABwAAAIUBAAALAAAAjQEAAEUBAACZAQAAFgAAAN8CAAAeAAAA9gIAAKEAAAAVAwAABQAAALcD
66AAAJAAAAvQMAAAEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABQAAAAYAAAACAAAAAFJh
67eW1vbmQgTHV4dXJ5IFlhY2gtdABUaGVyZSBpcyAlcyBmaWxlAFRoZXJlIGFyZSAlcyBmaWxlcwBU
68aGlzIG1vZHVsZSBwcm92aWRlcyBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgbG9jYWxpemF0aW9u
69CnN1cHBvcnQgZm9yIHlvdXIgUHl0aG9uIHByb2dyYW1zIGJ5IHByb3ZpZGluZyBhbiBpbnRlcmZh
70Y2UgdG8gdGhlIEdOVQpnZXR0ZXh0IG1lc3NhZ2UgY2F0YWxvZyBsaWJyYXJ5LgBtdWxsdXNrAG51
71ZGdlIG51ZGdlAFByb2plY3QtSWQtVmVyc2lvbjogMi4wClBPLVJldmlzaW9uLURhdGU6IDIwMDAt
72MDgtMjkgMTI6MTktMDQ6MDAKTGFzdC1UcmFuc2xhdG9yOiBKLiBEYXZpZCBJYsOhw7FleiA8ai1k
73YXZpZEBub29zLmZyPgpMYW5ndWFnZS1UZWFtOiBYWCA8cHl0aG9uLWRldkBweXRob24ub3JnPgpN
74SU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9aXNvLTg4
75NTktMQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBub25lCkdlbmVyYXRlZC1CeTogcHlnZXR0
76ZXh0LnB5IDEuMQpQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD1uIT0xOwoAVGhyb2F0
77d29iYmxlciBNYW5ncm92ZQBIYXkgJXMgZmljaGVybwBIYXkgJXMgZmljaGVyb3MAR3V2ZiB6YnFo
78eXIgY2ViaXZxcmYgdmFncmVhbmd2YmFueXZtbmd2YmEgbmFxIHlicG55dm1uZ3ZiYQpmaGNjYmVn
79IHNiZSBsYmhlIENsZ3ViYSBjZWJ0ZW56ZiBvbCBjZWJpdnF2YXQgbmEgdmFncmVzbnByIGdiIGd1
80ciBUQUgKdHJnZ3JrZyB6cmZmbnRyIHBuZ255YnQgeXZvZW5lbC4AYmFjb24Ad2luayB3aW5rAA==
81'''
82
83
Guido van Rossum39478e82007-08-27 17:23:59 +000084UMO_DATA = b'''\
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000853hIElQAAAAACAAAAHAAAACwAAAAFAAAAPAAAAAAAAABQAAAABAAAAFEAAAAPAQAAVgAAAAQAAABm
86AQAAAQAAAAIAAAAAAAAAAAAAAAAAAAAAYWLDngBQcm9qZWN0LUlkLVZlcnNpb246IDIuMApQTy1S
87ZXZpc2lvbi1EYXRlOiAyMDAzLTA0LTExIDEyOjQyLTA0MDAKTGFzdC1UcmFuc2xhdG9yOiBCYXJy
88eSBBLiBXQXJzYXcgPGJhcnJ5QHB5dGhvbi5vcmc+Ckxhbmd1YWdlLVRlYW06IFhYIDxweXRob24t
89ZGV2QHB5dGhvbi5vcmc+Ck1JTUUtVmVyc2lvbjogMS4wCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFp
90bjsgY2hhcnNldD11dGYtOApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CkdlbmVyYXRl
91ZC1CeTogbWFudWFsbHkKAMKkeXoA
92'''
Fred Drake004d5e62000-10-23 17:22:08 +000093
Guido van Rossum39478e82007-08-27 17:23:59 +000094MMO_DATA = b'''\
Barry Warsawe960e222003-05-20 17:28:54 +0000953hIElQAAAAABAAAAHAAAACQAAAADAAAALAAAAAAAAAA4AAAAeAEAADkAAAABAAAAAAAAAAAAAAAA
96UHJvamVjdC1JZC1WZXJzaW9uOiBObyBQcm9qZWN0IDAuMApQT1QtQ3JlYXRpb24tRGF0ZTogV2Vk
97IERlYyAxMSAwNzo0NDoxNSAyMDAyClBPLVJldmlzaW9uLURhdGU6IDIwMDItMDgtMTQgMDE6MTg6
98NTgrMDA6MDAKTGFzdC1UcmFuc2xhdG9yOiBKb2huIERvZSA8amRvZUBleGFtcGxlLmNvbT4KSmFu
99ZSBGb29iYXIgPGpmb29iYXJAZXhhbXBsZS5jb20+Ckxhbmd1YWdlLVRlYW06IHh4IDx4eEBleGFt
100cGxlLmNvbT4KTUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFy
101c2V0PWlzby04ODU5LTE1CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IHF1b3RlZC1wcmludGFi
102bGUKR2VuZXJhdGVkLUJ5OiBweWdldHRleHQucHkgMS4zCgA=
103'''
104
Barry Warsawff6d8132000-08-25 19:50:38 +0000105LOCALEDIR = os.path.join('xx', 'LC_MESSAGES')
106MOFILE = os.path.join(LOCALEDIR, 'gettext.mo')
Antoine Pitroube8d06f2014-10-28 20:17:51 +0100107MOFILE_BAD_MAJOR_VERSION = os.path.join(LOCALEDIR, 'gettext_bad_major_version.mo')
108MOFILE_BAD_MINOR_VERSION = os.path.join(LOCALEDIR, 'gettext_bad_minor_version.mo')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000109UMOFILE = os.path.join(LOCALEDIR, 'ugettext.mo')
Barry Warsawe960e222003-05-20 17:28:54 +0000110MMOFILE = os.path.join(LOCALEDIR, 'metadata.mo')
Barry Warsawff6d8132000-08-25 19:50:38 +0000111
112
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000113class GettextBaseTest(unittest.TestCase):
Martin v. Löwisd8996052002-11-21 21:45:32 +0000114 def setUp(self):
Neal Norwitza0e0cd32004-07-19 00:08:59 +0000115 if not os.path.isdir(LOCALEDIR):
116 os.makedirs(LOCALEDIR)
Éric Araujo7fa886d2010-11-06 04:11:59 +0000117 with open(MOFILE, 'wb') as fp:
118 fp.write(base64.decodebytes(GNU_MO_DATA))
Antoine Pitroube8d06f2014-10-28 20:17:51 +0100119 with open(MOFILE_BAD_MAJOR_VERSION, 'wb') as fp:
120 fp.write(base64.decodebytes(GNU_MO_DATA_BAD_MAJOR_VERSION))
121 with open(MOFILE_BAD_MINOR_VERSION, 'wb') as fp:
122 fp.write(base64.decodebytes(GNU_MO_DATA_BAD_MINOR_VERSION))
Éric Araujo7fa886d2010-11-06 04:11:59 +0000123 with open(UMOFILE, 'wb') as fp:
124 fp.write(base64.decodebytes(UMO_DATA))
125 with open(MMOFILE, 'wb') as fp:
126 fp.write(base64.decodebytes(MMO_DATA))
Walter Dörwald155374d2009-05-01 19:58:58 +0000127 self.env = support.EnvironmentVarGuard()
128 self.env['LANGUAGE'] = 'xx'
Éric Araujo37a89332010-11-06 04:09:29 +0000129 gettext._translations.clear()
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000130
131 def tearDown(self):
Walter Dörwald155374d2009-05-01 19:58:58 +0000132 self.env.__exit__()
133 del self.env
Victor Stinnercdb2c602014-07-24 12:07:45 +0200134 support.rmtree(os.path.split(LOCALEDIR)[0])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000135
Andrew Kuchling8b963c52015-04-13 10:38:56 -0400136GNU_MO_DATA_ISSUE_17898 = b'''\
1373hIElQAAAAABAAAAHAAAACQAAAAAAAAAAAAAAAAAAAAsAAAAggAAAC0AAAAAUGx1cmFsLUZvcm1z
138OiBucGx1cmFscz0yOyBwbHVyYWw9KG4gIT0gMSk7CiMtIy0jLSMtIyAgbWVzc2FnZXMucG8gKEVk
139WCBTdHVkaW8pICAjLSMtIy0jLSMKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVU
140Ri04CgA=
141'''
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000142
143class GettextTestCase1(GettextBaseTest):
144 def setUp(self):
145 GettextBaseTest.setUp(self)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000146 self.localedir = os.curdir
147 self.mofile = MOFILE
Martin v. Löwisd8996052002-11-21 21:45:32 +0000148 gettext.install('gettext', self.localedir)
149
Martin v. Löwisd8996052002-11-21 21:45:32 +0000150 def test_some_translations(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000151 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000152 # test some translations
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000153 eq(_('albatross'), 'albatross')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000154 eq(_('mullusk'), 'bacon')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000155 eq(_(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000156 eq(_(r'nudge nudge'), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000157
158 def test_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000159 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000160 # double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000161 eq(_("albatross"), 'albatross')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000162 eq(_("mullusk"), 'bacon')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000163 eq(_(r"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000164 eq(_(r"nudge nudge"), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000165
166 def test_triple_single_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000167 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000168 # triple single quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000169 eq(_('''albatross'''), 'albatross')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000170 eq(_('''mullusk'''), 'bacon')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000171 eq(_(r'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000172 eq(_(r'''nudge nudge'''), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000173
174 def test_triple_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000175 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000176 # triple double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000177 eq(_("""albatross"""), 'albatross')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000178 eq(_("""mullusk"""), 'bacon')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000179 eq(_(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000180 eq(_(r"""nudge nudge"""), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000181
182 def test_multiline_strings(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000183 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000184 # multiline strings
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000185 eq(_('''This module provides internationalization and localization
Martin v. Löwisd8996052002-11-21 21:45:32 +0000186support for your Python programs by providing an interface to the GNU
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000187gettext message catalog library.'''),
188 '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
Martin v. Löwisd8996052002-11-21 21:45:32 +0000189fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000190trggrkg zrffntr pngnybt yvoenel.''')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000191
192 def test_the_alternative_interface(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000193 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000194 # test the alternative interface
Éric Araujo7fa886d2010-11-06 04:11:59 +0000195 with open(self.mofile, 'rb') as fp:
196 t = gettext.GNUTranslations(fp)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000197 # Install the translation object
Martin v. Löwisd8996052002-11-21 21:45:32 +0000198 t.install()
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000199 eq(_('nudge nudge'), 'wink wink')
200 # Try unicode return type
Benjamin Peterson801844d2008-07-14 14:32:15 +0000201 t.install()
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000202 eq(_('mullusk'), 'bacon')
Georg Brandl602b9ba2006-02-19 13:26:36 +0000203 # Test installation of other methods
Georg Brandl1a3284e2007-12-02 09:40:06 +0000204 import builtins
Benjamin Peterson801844d2008-07-14 14:32:15 +0000205 t.install(names=["gettext", "lgettext"])
206 eq(_, t.gettext)
207 eq(builtins.gettext, t.gettext)
Georg Brandl602b9ba2006-02-19 13:26:36 +0000208 eq(lgettext, t.lgettext)
Georg Brandl1a3284e2007-12-02 09:40:06 +0000209 del builtins.gettext
210 del builtins.lgettext
Martin v. Löwisd8996052002-11-21 21:45:32 +0000211
212
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000213class GettextTestCase2(GettextBaseTest):
Martin v. Löwisd8996052002-11-21 21:45:32 +0000214 def setUp(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000215 GettextBaseTest.setUp(self)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000216 self.localedir = os.curdir
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000217 # Set up the bindings
Martin v. Löwisd8996052002-11-21 21:45:32 +0000218 gettext.bindtextdomain('gettext', self.localedir)
219 gettext.textdomain('gettext')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000220 # For convenience
Martin v. Löwisd8996052002-11-21 21:45:32 +0000221 self._ = gettext.gettext
222
Martin v. Löwisd8996052002-11-21 21:45:32 +0000223 def test_bindtextdomain(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000224 self.assertEqual(gettext.bindtextdomain('gettext'), self.localedir)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000225
226 def test_textdomain(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000227 self.assertEqual(gettext.textdomain(), 'gettext')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000228
Antoine Pitroube8d06f2014-10-28 20:17:51 +0100229 def test_bad_major_version(self):
230 with open(MOFILE_BAD_MAJOR_VERSION, 'rb') as fp:
231 with self.assertRaises(OSError) as cm:
232 gettext.GNUTranslations(fp)
233
234 exception = cm.exception
235 self.assertEqual(exception.errno, 0)
236 self.assertEqual(exception.strerror, "Bad version number 5")
237 self.assertEqual(exception.filename, MOFILE_BAD_MAJOR_VERSION)
238
239 def test_bad_minor_version(self):
240 with open(MOFILE_BAD_MINOR_VERSION, 'rb') as fp:
241 # Check that no error is thrown with a bad minor version number
242 gettext.GNUTranslations(fp)
243
Martin v. Löwisd8996052002-11-21 21:45:32 +0000244 def test_some_translations(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000245 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000246 # test some translations
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000247 eq(self._('albatross'), 'albatross')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000248 eq(self._('mullusk'), 'bacon')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000249 eq(self._(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000250 eq(self._(r'nudge nudge'), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000251
252 def test_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000253 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000254 # double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000255 eq(self._("albatross"), 'albatross')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000256 eq(self._("mullusk"), 'bacon')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000257 eq(self._(r"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000258 eq(self._(r"nudge nudge"), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000259
260 def test_triple_single_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000261 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000262 # triple single quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000263 eq(self._('''albatross'''), 'albatross')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000264 eq(self._('''mullusk'''), 'bacon')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000265 eq(self._(r'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000266 eq(self._(r'''nudge nudge'''), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000267
268 def test_triple_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000269 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000270 # triple double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000271 eq(self._("""albatross"""), 'albatross')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000272 eq(self._("""mullusk"""), 'bacon')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000273 eq(self._(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000274 eq(self._(r"""nudge nudge"""), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000275
276 def test_multiline_strings(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000277 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000278 # multiline strings
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000279 eq(self._('''This module provides internationalization and localization
Martin v. Löwisd8996052002-11-21 21:45:32 +0000280support for your Python programs by providing an interface to the GNU
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000281gettext message catalog library.'''),
282 '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
Martin v. Löwisd8996052002-11-21 21:45:32 +0000283fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000284trggrkg zrffntr pngnybt yvoenel.''')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000285
286
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000287class PluralFormsTestCase(GettextBaseTest):
Martin v. Löwisd8996052002-11-21 21:45:32 +0000288 def setUp(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000289 GettextBaseTest.setUp(self)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000290 self.mofile = MOFILE
291
292 def test_plural_forms1(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000293 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000294 x = gettext.ngettext('There is %s file', 'There are %s files', 1)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000295 eq(x, 'Hay %s fichero')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000296 x = gettext.ngettext('There is %s file', 'There are %s files', 2)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000297 eq(x, 'Hay %s ficheros')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000298
299 def test_plural_forms2(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000300 eq = self.assertEqual
Éric Araujo7fa886d2010-11-06 04:11:59 +0000301 with open(self.mofile, 'rb') as fp:
302 t = gettext.GNUTranslations(fp)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000303 x = t.ngettext('There is %s file', 'There are %s files', 1)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000304 eq(x, 'Hay %s fichero')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000305 x = t.ngettext('There is %s file', 'There are %s files', 2)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000306 eq(x, 'Hay %s ficheros')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000307
308 def test_hu(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000309 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000310 f = gettext.c2py('0')
311 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000312 eq(s, "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000313
314 def test_de(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000315 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000316 f = gettext.c2py('n != 1')
317 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000318 eq(s, "10111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000319
320 def test_fr(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000321 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000322 f = gettext.c2py('n>1')
323 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000324 eq(s, "00111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000325
326 def test_gd(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000327 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000328 f = gettext.c2py('n==1 ? 0 : n==2 ? 1 : 2')
329 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000330 eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000331
332 def test_gd2(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000333 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000334 # Tests the combination of parentheses and "?:"
335 f = gettext.c2py('n==1 ? 0 : (n==2 ? 1 : 2)')
336 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000337 eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000338
339 def test_lt(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000340 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000341 f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2')
342 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000343 eq(s, "20111111112222222222201111111120111111112011111111201111111120111111112011111111201111111120111111112011111111222222222220111111112011111111201111111120111111112011111111201111111120111111112011111111")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000344
345 def test_ru(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000346 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000347 f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2')
348 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000349 eq(s, "20111222222222222222201112222220111222222011122222201112222220111222222011122222201112222220111222222011122222222222222220111222222011122222201112222220111222222011122222201112222220111222222011122222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000350
351 def test_pl(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000352 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000353 f = gettext.c2py('n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2')
354 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000355 eq(s, "20111222222222222222221112222222111222222211122222221112222222111222222211122222221112222222111222222211122222222222222222111222222211122222221112222222111222222211122222221112222222111222222211122222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000356
357 def test_sl(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000358 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000359 f = gettext.c2py('n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3')
360 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000361 eq(s, "30122333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333012233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000362
363 def test_security(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000364 raises = self.assertRaises
Martin v. Löwisd8996052002-11-21 21:45:32 +0000365 # Test for a dangerous expression
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000366 raises(ValueError, gettext.c2py, "os.chmod('/etc/passwd',0777)")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000367
Andrew Kuchling8b963c52015-04-13 10:38:56 -0400368class GNUTranslationParsingTest(GettextBaseTest):
369 def test_plural_form_error_issue17898(self):
370 with open(MOFILE, 'wb') as fp:
371 fp.write(base64.decodebytes(GNU_MO_DATA_ISSUE_17898))
372 with open(MOFILE, 'rb') as fp:
373 # If this runs cleanly, the bug is fixed.
374 t = gettext.GNUTranslations(fp)
375
Martin v. Löwisd8996052002-11-21 21:45:32 +0000376
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000377class UnicodeTranslationsTest(GettextBaseTest):
378 def setUp(self):
379 GettextBaseTest.setUp(self)
Éric Araujo7fa886d2010-11-06 04:11:59 +0000380 with open(UMOFILE, 'rb') as fp:
Barry Warsawedb155f2003-04-24 18:08:13 +0000381 self.t = gettext.GNUTranslations(fp)
Benjamin Peterson801844d2008-07-14 14:32:15 +0000382 self._ = self.t.gettext
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000383
384 def test_unicode_msgid(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000385 unless = self.assertTrue
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000386 unless(isinstance(self._(''), str))
387 unless(isinstance(self._(''), str))
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000388
389 def test_unicode_msgstr(self):
390 eq = self.assertEqual
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000391 eq(self._('ab\xde'), '\xa4yz')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000392
393
Barry Warsawe960e222003-05-20 17:28:54 +0000394class WeirdMetadataTest(GettextBaseTest):
395 def setUp(self):
396 GettextBaseTest.setUp(self)
Éric Araujo7fa886d2010-11-06 04:11:59 +0000397 with open(MMOFILE, 'rb') as fp:
Barry Warsawe960e222003-05-20 17:28:54 +0000398 try:
399 self.t = gettext.GNUTranslations(fp)
400 except:
401 self.tearDown()
402 raise
Barry Warsawe960e222003-05-20 17:28:54 +0000403
404 def test_weird_metadata(self):
405 info = self.t.info()
Christian Heimes6ae5d7f2007-10-31 18:53:44 +0000406 self.assertEqual(len(info), 9)
Barry Warsawe960e222003-05-20 17:28:54 +0000407 self.assertEqual(info['last-translator'],
408 'John Doe <jdoe@example.com>\nJane Foobar <jfoobar@example.com>')
409
410
Éric Araujo6108bf52010-10-04 23:52:37 +0000411class DummyGNUTranslations(gettext.GNUTranslations):
412 def foo(self):
413 return 'foo'
414
415
416class GettextCacheTestCase(GettextBaseTest):
417 def test_cache(self):
418 self.localedir = os.curdir
419 self.mofile = MOFILE
420
421 self.assertEqual(len(gettext._translations), 0)
422
423 t = gettext.translation('gettext', self.localedir)
424
425 self.assertEqual(len(gettext._translations), 1)
426
427 t = gettext.translation('gettext', self.localedir,
428 class_=DummyGNUTranslations)
429
430 self.assertEqual(len(gettext._translations), 2)
431 self.assertEqual(t.__class__, DummyGNUTranslations)
432
433 # Calling it again doesn't add to the cache
434
435 t = gettext.translation('gettext', self.localedir,
436 class_=DummyGNUTranslations)
437
438 self.assertEqual(len(gettext._translations), 2)
439 self.assertEqual(t.__class__, DummyGNUTranslations)
440
441
Martin Panterd226d302015-11-14 11:47:00 +0000442class MiscTestCase(unittest.TestCase):
443 def test__all__(self):
444 blacklist = {'c2py', 'ENOENT'}
445 support.check__all__(self, gettext, blacklist=blacklist)
446
447
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000448def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000449 support.run_unittest(__name__)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000450
451if __name__ == '__main__':
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000452 test_main()
Martin v. Löwisd8996052002-11-21 21:45:32 +0000453
Barry Warsawff6d8132000-08-25 19:50:38 +0000454
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000455# For reference, here's the .po file used to created the GNU_MO_DATA above.
Martin v. Löwisd8996052002-11-21 21:45:32 +0000456#
457# The original version was automatically generated from the sources with
458# pygettext. Later it was manually modified to add plural forms support.
Barry Warsawff6d8132000-08-25 19:50:38 +0000459
Barry Warsaw64dab462000-08-30 03:32:07 +0000460'''
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000461# Dummy translation for the Python test_gettext.py module.
Barry Warsaw19148732001-08-24 19:11:57 +0000462# Copyright (C) 2001 Python Software Foundation
463# Barry Warsaw <barry@python.org>, 2000.
Barry Warsaw64dab462000-08-30 03:32:07 +0000464#
465msgid ""
466msgstr ""
467"Project-Id-Version: 2.0\n"
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000468"PO-Revision-Date: 2003-04-11 14:32-0400\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000469"Last-Translator: J. David Ibanez <j-david@noos.fr>\n"
Barry Warsaw64dab462000-08-30 03:32:07 +0000470"Language-Team: XX <python-dev@python.org>\n"
471"MIME-Version: 1.0\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000472"Content-Type: text/plain; charset=iso-8859-1\n"
473"Content-Transfer-Encoding: 8bit\n"
Barry Warsaw64dab462000-08-30 03:32:07 +0000474"Generated-By: pygettext.py 1.1\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000475"Plural-Forms: nplurals=2; plural=n!=1;\n"
Barry Warsawff6d8132000-08-25 19:50:38 +0000476
Barry Warsaw64dab462000-08-30 03:32:07 +0000477#: test_gettext.py:19 test_gettext.py:25 test_gettext.py:31 test_gettext.py:37
478#: test_gettext.py:51 test_gettext.py:80 test_gettext.py:86 test_gettext.py:92
479#: test_gettext.py:98
480msgid "nudge nudge"
481msgstr "wink wink"
Barry Warsawff6d8132000-08-25 19:50:38 +0000482
Barry Warsaw64dab462000-08-30 03:32:07 +0000483#: test_gettext.py:16 test_gettext.py:22 test_gettext.py:28 test_gettext.py:34
484#: test_gettext.py:77 test_gettext.py:83 test_gettext.py:89 test_gettext.py:95
485msgid "albatross"
486msgstr ""
Barry Warsawff6d8132000-08-25 19:50:38 +0000487
Barry Warsaw64dab462000-08-30 03:32:07 +0000488#: test_gettext.py:18 test_gettext.py:24 test_gettext.py:30 test_gettext.py:36
489#: test_gettext.py:79 test_gettext.py:85 test_gettext.py:91 test_gettext.py:97
490msgid "Raymond Luxury Yach-t"
491msgstr "Throatwobbler Mangrove"
Barry Warsawff6d8132000-08-25 19:50:38 +0000492
Barry Warsaw64dab462000-08-30 03:32:07 +0000493#: test_gettext.py:17 test_gettext.py:23 test_gettext.py:29 test_gettext.py:35
494#: test_gettext.py:56 test_gettext.py:78 test_gettext.py:84 test_gettext.py:90
495#: test_gettext.py:96
496msgid "mullusk"
497msgstr "bacon"
Barry Warsawff6d8132000-08-25 19:50:38 +0000498
Barry Warsaw64dab462000-08-30 03:32:07 +0000499#: test_gettext.py:40 test_gettext.py:101
500msgid ""
501"This module provides internationalization and localization\n"
502"support for your Python programs by providing an interface to the GNU\n"
503"gettext message catalog library."
504msgstr ""
505"Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba\n"
506"fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH\n"
507"trggrkg zrffntr pngnybt yvoenel."
Martin v. Löwisd8996052002-11-21 21:45:32 +0000508
509# Manually added, as neither pygettext nor xgettext support plural forms
510# in Python.
511msgid "There is %s file"
512msgid_plural "There are %s files"
513msgstr[0] "Hay %s fichero"
514msgstr[1] "Hay %s ficheros"
Barry Warsaw64dab462000-08-30 03:32:07 +0000515'''
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000516
517# Here's the second example po file example, used to generate the UMO_DATA
518# containing utf-8 encoded Unicode strings
519
520'''
521# Dummy translation for the Python test_gettext.py module.
522# Copyright (C) 2001 Python Software Foundation
523# Barry Warsaw <barry@python.org>, 2000.
524#
525msgid ""
526msgstr ""
527"Project-Id-Version: 2.0\n"
528"PO-Revision-Date: 2003-04-11 12:42-0400\n"
529"Last-Translator: Barry A. WArsaw <barry@python.org>\n"
530"Language-Team: XX <python-dev@python.org>\n"
531"MIME-Version: 1.0\n"
532"Content-Type: text/plain; charset=utf-8\n"
533"Content-Transfer-Encoding: 7bit\n"
534"Generated-By: manually\n"
535
536#: nofile:0
537msgid "ab\xc3\x9e"
538msgstr "\xc2\xa4yz"
539'''
Barry Warsawe960e222003-05-20 17:28:54 +0000540
541# Here's the third example po file, used to generate MMO_DATA
542
543'''
544msgid ""
545msgstr ""
546"Project-Id-Version: No Project 0.0\n"
547"POT-Creation-Date: Wed Dec 11 07:44:15 2002\n"
548"PO-Revision-Date: 2002-08-14 01:18:58+00:00\n"
549"Last-Translator: John Doe <jdoe@example.com>\n"
550"Jane Foobar <jfoobar@example.com>\n"
551"Language-Team: xx <xx@example.com>\n"
552"MIME-Version: 1.0\n"
553"Content-Type: text/plain; charset=iso-8859-15\n"
554"Content-Transfer-Encoding: quoted-printable\n"
555"Generated-By: pygettext.py 1.3\n"
556'''
Andrew Kuchling8b963c52015-04-13 10:38:56 -0400557
558#
559# messages.po, used for bug 17898
560#
561
562'''
563# test file for http://bugs.python.org/issue17898
564msgid ""
565msgstr ""
566"Plural-Forms: nplurals=2; plural=(n != 1);\n"
567"#-#-#-#-# messages.po (EdX Studio) #-#-#-#-#\n"
568"Content-Type: text/plain; charset=UTF-8\n"
569'''