blob: a852443e687837ebe4a5b00b00e8816fdb2859c5 [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
Serhiy Storchaka07bcf052016-11-08 21:17:46 +0200308 # Examples from http://www.gnu.org/software/gettext/manual/gettext.html
309
310 def test_ja(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000311 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000312 f = gettext.c2py('0')
313 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000314 eq(s, "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000315
316 def test_de(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000317 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000318 f = gettext.c2py('n != 1')
319 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000320 eq(s, "10111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000321
322 def test_fr(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000323 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000324 f = gettext.c2py('n>1')
325 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000326 eq(s, "00111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000327
Serhiy Storchaka07bcf052016-11-08 21:17:46 +0200328 def test_lv(self):
329 eq = self.assertEqual
330 f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2')
331 s = ''.join([ str(f(x)) for x in range(200) ])
332 eq(s, "20111111111111111111101111111110111111111011111111101111111110111111111011111111101111111110111111111011111111111111111110111111111011111111101111111110111111111011111111101111111110111111111011111111")
333
Martin v. Löwisd8996052002-11-21 21:45:32 +0000334 def test_gd(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000335 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000336 f = gettext.c2py('n==1 ? 0 : n==2 ? 1 : 2')
337 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000338 eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000339
340 def test_gd2(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000341 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000342 # Tests the combination of parentheses and "?:"
343 f = gettext.c2py('n==1 ? 0 : (n==2 ? 1 : 2)')
344 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000345 eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000346
Serhiy Storchaka07bcf052016-11-08 21:17:46 +0200347 def test_ro(self):
348 eq = self.assertEqual
349 f = gettext.c2py('n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2')
350 s = ''.join([ str(f(x)) for x in range(200) ])
351 eq(s, "10111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222")
352
Martin v. Löwisd8996052002-11-21 21:45:32 +0000353 def test_lt(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000354 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000355 f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2')
356 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000357 eq(s, "20111111112222222222201111111120111111112011111111201111111120111111112011111111201111111120111111112011111111222222222220111111112011111111201111111120111111112011111111201111111120111111112011111111")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000358
359 def test_ru(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000360 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000361 f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2')
362 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000363 eq(s, "20111222222222222222201112222220111222222011122222201112222220111222222011122222201112222220111222222011122222222222222220111222222011122222201112222220111222222011122222201112222220111222222011122222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000364
Serhiy Storchaka07bcf052016-11-08 21:17:46 +0200365 def test_cs(self):
366 eq = self.assertEqual
367 f = gettext.c2py('(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2')
368 s = ''.join([ str(f(x)) for x in range(200) ])
369 eq(s, "20111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
370
Martin v. Löwisd8996052002-11-21 21:45:32 +0000371 def test_pl(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000372 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000373 f = gettext.c2py('n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2')
374 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000375 eq(s, "20111222222222222222221112222222111222222211122222221112222222111222222211122222221112222222111222222211122222222222222222111222222211122222221112222222111222222211122222221112222222111222222211122222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000376
377 def test_sl(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000378 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000379 f = gettext.c2py('n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3')
380 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000381 eq(s, "30122333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333012233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000382
Serhiy Storchaka07bcf052016-11-08 21:17:46 +0200383 def test_ar(self):
384 eq = self.assertEqual
385 f = gettext.c2py('n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5')
386 s = ''.join([ str(f(x)) for x in range(200) ])
387 eq(s, "01233333333444444444444444444444444444444444444444444444444444444444444444444444444444444444444444445553333333344444444444444444444444444444444444444444444444444444444444444444444444444444444444444444")
388
Martin v. Löwisd8996052002-11-21 21:45:32 +0000389 def test_security(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000390 raises = self.assertRaises
Martin v. Löwisd8996052002-11-21 21:45:32 +0000391 # Test for a dangerous expression
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000392 raises(ValueError, gettext.c2py, "os.chmod('/etc/passwd',0777)")
Serhiy Storchaka07bcf052016-11-08 21:17:46 +0200393 # issue28563
394 raises(ValueError, gettext.c2py, '"(eval(foo) && ""')
395 raises(ValueError, gettext.c2py, 'f"{os.system(\'sh\')}"')
396 # Maximum recursion depth exceeded during compilation
397 raises(ValueError, gettext.c2py, 'n+'*10000 + 'n')
398 self.assertEqual(gettext.c2py('n+'*100 + 'n')(1), 101)
399 # MemoryError during compilation
400 raises(ValueError, gettext.c2py, '('*100 + 'n' + ')'*100)
401 # Maximum recursion depth exceeded in C to Python translator
402 raises(ValueError, gettext.c2py, '('*10000 + 'n' + ')'*10000)
403 self.assertEqual(gettext.c2py('('*20 + 'n' + ')'*20)(1), 1)
404
405 def test_chained_comparison(self):
406 # C doesn't chain comparison as Python so 2 == 2 == 2 gets different results
407 f = gettext.c2py('n == n == n')
408 self.assertEqual(''.join(str(f(x)) for x in range(3)), '010')
409 f = gettext.c2py('1 < n == n')
410 self.assertEqual(''.join(str(f(x)) for x in range(3)), '100')
411 f = gettext.c2py('n == n < 2')
412 self.assertEqual(''.join(str(f(x)) for x in range(3)), '010')
413 f = gettext.c2py('0 < n < 2')
414 self.assertEqual(''.join(str(f(x)) for x in range(3)), '111')
415
416 def test_decimal_number(self):
417 self.assertEqual(gettext.c2py('0123')(1), 123)
418
419 def test_invalid_syntax(self):
420 invalid_expressions = [
421 'x>1', '(n>1', 'n>1)', '42**42**42', '0xa', '1.0', '1e2',
422 'n>0x1', '+n', '-n', 'n()', 'n(1)', '1+', 'nn', 'n n',
423 ]
424 for expr in invalid_expressions:
425 with self.assertRaises(ValueError):
426 gettext.c2py(expr)
427
428 def test_nested_condition_operator(self):
429 self.assertEqual(gettext.c2py('n?1?2:3:4')(0), 4)
430 self.assertEqual(gettext.c2py('n?1?2:3:4')(1), 2)
431 self.assertEqual(gettext.c2py('n?1:3?4:5')(0), 4)
432 self.assertEqual(gettext.c2py('n?1:3?4:5')(1), 1)
433
434 def test_division(self):
435 f = gettext.c2py('2/n*3')
436 self.assertEqual(f(1), 6)
437 self.assertEqual(f(2), 3)
438 self.assertEqual(f(3), 0)
439 self.assertEqual(f(-1), -6)
440 self.assertRaises(ZeroDivisionError, f, 0)
441
442 def test_plural_number(self):
Serhiy Storchaka60ac9892016-11-14 19:22:12 +0200443 f = gettext.c2py('n != 1')
444 self.assertEqual(f(1), 0)
445 self.assertEqual(f(2), 1)
446 self.assertEqual(f(1.0), 0)
447 self.assertEqual(f(2.0), 1)
448 self.assertEqual(f(1.1), 1)
449 self.assertRaises(TypeError, f, '2')
450 self.assertRaises(TypeError, f, b'2')
451 self.assertRaises(TypeError, f, [])
452 self.assertRaises(TypeError, f, object())
Serhiy Storchaka07bcf052016-11-08 21:17:46 +0200453
Martin v. Löwisd8996052002-11-21 21:45:32 +0000454
Andrew Kuchling8b963c52015-04-13 10:38:56 -0400455class GNUTranslationParsingTest(GettextBaseTest):
456 def test_plural_form_error_issue17898(self):
457 with open(MOFILE, 'wb') as fp:
458 fp.write(base64.decodebytes(GNU_MO_DATA_ISSUE_17898))
459 with open(MOFILE, 'rb') as fp:
460 # If this runs cleanly, the bug is fixed.
461 t = gettext.GNUTranslations(fp)
462
Martin v. Löwisd8996052002-11-21 21:45:32 +0000463
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000464class UnicodeTranslationsTest(GettextBaseTest):
465 def setUp(self):
466 GettextBaseTest.setUp(self)
Éric Araujo7fa886d2010-11-06 04:11:59 +0000467 with open(UMOFILE, 'rb') as fp:
Barry Warsawedb155f2003-04-24 18:08:13 +0000468 self.t = gettext.GNUTranslations(fp)
Benjamin Peterson801844d2008-07-14 14:32:15 +0000469 self._ = self.t.gettext
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000470
471 def test_unicode_msgid(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000472 unless = self.assertTrue
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000473 unless(isinstance(self._(''), str))
474 unless(isinstance(self._(''), str))
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000475
476 def test_unicode_msgstr(self):
477 eq = self.assertEqual
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000478 eq(self._('ab\xde'), '\xa4yz')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000479
480
Barry Warsawe960e222003-05-20 17:28:54 +0000481class WeirdMetadataTest(GettextBaseTest):
482 def setUp(self):
483 GettextBaseTest.setUp(self)
Éric Araujo7fa886d2010-11-06 04:11:59 +0000484 with open(MMOFILE, 'rb') as fp:
Barry Warsawe960e222003-05-20 17:28:54 +0000485 try:
486 self.t = gettext.GNUTranslations(fp)
487 except:
488 self.tearDown()
489 raise
Barry Warsawe960e222003-05-20 17:28:54 +0000490
491 def test_weird_metadata(self):
492 info = self.t.info()
Christian Heimes6ae5d7f2007-10-31 18:53:44 +0000493 self.assertEqual(len(info), 9)
Barry Warsawe960e222003-05-20 17:28:54 +0000494 self.assertEqual(info['last-translator'],
495 'John Doe <jdoe@example.com>\nJane Foobar <jfoobar@example.com>')
496
497
Éric Araujo6108bf52010-10-04 23:52:37 +0000498class DummyGNUTranslations(gettext.GNUTranslations):
499 def foo(self):
500 return 'foo'
501
502
503class GettextCacheTestCase(GettextBaseTest):
504 def test_cache(self):
505 self.localedir = os.curdir
506 self.mofile = MOFILE
507
508 self.assertEqual(len(gettext._translations), 0)
509
510 t = gettext.translation('gettext', self.localedir)
511
512 self.assertEqual(len(gettext._translations), 1)
513
514 t = gettext.translation('gettext', self.localedir,
515 class_=DummyGNUTranslations)
516
517 self.assertEqual(len(gettext._translations), 2)
518 self.assertEqual(t.__class__, DummyGNUTranslations)
519
520 # Calling it again doesn't add to the cache
521
522 t = gettext.translation('gettext', self.localedir,
523 class_=DummyGNUTranslations)
524
525 self.assertEqual(len(gettext._translations), 2)
526 self.assertEqual(t.__class__, DummyGNUTranslations)
527
528
Martin Panterd226d302015-11-14 11:47:00 +0000529class MiscTestCase(unittest.TestCase):
530 def test__all__(self):
531 blacklist = {'c2py', 'ENOENT'}
532 support.check__all__(self, gettext, blacklist=blacklist)
533
534
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000535def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000536 support.run_unittest(__name__)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000537
538if __name__ == '__main__':
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000539 test_main()
Martin v. Löwisd8996052002-11-21 21:45:32 +0000540
Barry Warsawff6d8132000-08-25 19:50:38 +0000541
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000542# For reference, here's the .po file used to created the GNU_MO_DATA above.
Martin v. Löwisd8996052002-11-21 21:45:32 +0000543#
544# The original version was automatically generated from the sources with
545# pygettext. Later it was manually modified to add plural forms support.
Barry Warsawff6d8132000-08-25 19:50:38 +0000546
Barry Warsaw64dab462000-08-30 03:32:07 +0000547'''
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000548# Dummy translation for the Python test_gettext.py module.
Barry Warsaw19148732001-08-24 19:11:57 +0000549# Copyright (C) 2001 Python Software Foundation
550# Barry Warsaw <barry@python.org>, 2000.
Barry Warsaw64dab462000-08-30 03:32:07 +0000551#
552msgid ""
553msgstr ""
554"Project-Id-Version: 2.0\n"
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000555"PO-Revision-Date: 2003-04-11 14:32-0400\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000556"Last-Translator: J. David Ibanez <j-david@noos.fr>\n"
Barry Warsaw64dab462000-08-30 03:32:07 +0000557"Language-Team: XX <python-dev@python.org>\n"
558"MIME-Version: 1.0\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000559"Content-Type: text/plain; charset=iso-8859-1\n"
560"Content-Transfer-Encoding: 8bit\n"
Barry Warsaw64dab462000-08-30 03:32:07 +0000561"Generated-By: pygettext.py 1.1\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000562"Plural-Forms: nplurals=2; plural=n!=1;\n"
Barry Warsawff6d8132000-08-25 19:50:38 +0000563
Barry Warsaw64dab462000-08-30 03:32:07 +0000564#: test_gettext.py:19 test_gettext.py:25 test_gettext.py:31 test_gettext.py:37
565#: test_gettext.py:51 test_gettext.py:80 test_gettext.py:86 test_gettext.py:92
566#: test_gettext.py:98
567msgid "nudge nudge"
568msgstr "wink wink"
Barry Warsawff6d8132000-08-25 19:50:38 +0000569
Barry Warsaw64dab462000-08-30 03:32:07 +0000570#: test_gettext.py:16 test_gettext.py:22 test_gettext.py:28 test_gettext.py:34
571#: test_gettext.py:77 test_gettext.py:83 test_gettext.py:89 test_gettext.py:95
572msgid "albatross"
573msgstr ""
Barry Warsawff6d8132000-08-25 19:50:38 +0000574
Barry Warsaw64dab462000-08-30 03:32:07 +0000575#: test_gettext.py:18 test_gettext.py:24 test_gettext.py:30 test_gettext.py:36
576#: test_gettext.py:79 test_gettext.py:85 test_gettext.py:91 test_gettext.py:97
577msgid "Raymond Luxury Yach-t"
578msgstr "Throatwobbler Mangrove"
Barry Warsawff6d8132000-08-25 19:50:38 +0000579
Barry Warsaw64dab462000-08-30 03:32:07 +0000580#: test_gettext.py:17 test_gettext.py:23 test_gettext.py:29 test_gettext.py:35
581#: test_gettext.py:56 test_gettext.py:78 test_gettext.py:84 test_gettext.py:90
582#: test_gettext.py:96
583msgid "mullusk"
584msgstr "bacon"
Barry Warsawff6d8132000-08-25 19:50:38 +0000585
Barry Warsaw64dab462000-08-30 03:32:07 +0000586#: test_gettext.py:40 test_gettext.py:101
587msgid ""
588"This module provides internationalization and localization\n"
589"support for your Python programs by providing an interface to the GNU\n"
590"gettext message catalog library."
591msgstr ""
592"Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba\n"
593"fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH\n"
594"trggrkg zrffntr pngnybt yvoenel."
Martin v. Löwisd8996052002-11-21 21:45:32 +0000595
596# Manually added, as neither pygettext nor xgettext support plural forms
597# in Python.
598msgid "There is %s file"
599msgid_plural "There are %s files"
600msgstr[0] "Hay %s fichero"
601msgstr[1] "Hay %s ficheros"
Barry Warsaw64dab462000-08-30 03:32:07 +0000602'''
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000603
604# Here's the second example po file example, used to generate the UMO_DATA
605# containing utf-8 encoded Unicode strings
606
607'''
608# Dummy translation for the Python test_gettext.py module.
609# Copyright (C) 2001 Python Software Foundation
610# Barry Warsaw <barry@python.org>, 2000.
611#
612msgid ""
613msgstr ""
614"Project-Id-Version: 2.0\n"
615"PO-Revision-Date: 2003-04-11 12:42-0400\n"
616"Last-Translator: Barry A. WArsaw <barry@python.org>\n"
617"Language-Team: XX <python-dev@python.org>\n"
618"MIME-Version: 1.0\n"
619"Content-Type: text/plain; charset=utf-8\n"
620"Content-Transfer-Encoding: 7bit\n"
621"Generated-By: manually\n"
622
623#: nofile:0
624msgid "ab\xc3\x9e"
625msgstr "\xc2\xa4yz"
626'''
Barry Warsawe960e222003-05-20 17:28:54 +0000627
628# Here's the third example po file, used to generate MMO_DATA
629
630'''
631msgid ""
632msgstr ""
633"Project-Id-Version: No Project 0.0\n"
634"POT-Creation-Date: Wed Dec 11 07:44:15 2002\n"
635"PO-Revision-Date: 2002-08-14 01:18:58+00:00\n"
636"Last-Translator: John Doe <jdoe@example.com>\n"
637"Jane Foobar <jfoobar@example.com>\n"
638"Language-Team: xx <xx@example.com>\n"
639"MIME-Version: 1.0\n"
640"Content-Type: text/plain; charset=iso-8859-15\n"
641"Content-Transfer-Encoding: quoted-printable\n"
642"Generated-By: pygettext.py 1.3\n"
643'''
Andrew Kuchling8b963c52015-04-13 10:38:56 -0400644
645#
646# messages.po, used for bug 17898
647#
648
649'''
650# test file for http://bugs.python.org/issue17898
651msgid ""
652msgstr ""
653"Plural-Forms: nplurals=2; plural=(n != 1);\n"
654"#-#-#-#-# messages.po (EdX Studio) #-#-#-#-#\n"
655"Content-Type: text/plain; charset=UTF-8\n"
656'''