test_gettext.py revision 7fa886df3622bbedbeb9c2486a8af5f05334a928
19e035921494cb8f101c3bfc22956fa968c6ab41fBarry Warsawimport os
2ff6d8136574e9f4e1b11f75a945af5f8ab44a6fdBarry Warsawimport base64
3a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawimport shutil
49e035921494cb8f101c3bfc22956fa968c6ab41fBarry Warsawimport gettext
5d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwisimport unittest
6a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw
7ee8712cda46338d223509cc5751fd36509ad3860Benjamin Petersonfrom test import support
8a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw
9004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake
10d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis# TODO:
11d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis#  - Add new tests, for example for "dgettext"
12d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis#  - Remove dummy tests, for example testing for single and double quotes
13d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis#    has no sense, it would have if we were testing a parser (i.e. pygettext)
14d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis#  - Tests should have only one assert.
1564dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
1639478e852827a4ca6955151bf004c7a15099a4b1Guido van RossumGNU_MO_DATA = b'''\
17d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis3hIElQAAAAAGAAAAHAAAAEwAAAALAAAAfAAAAAAAAACoAAAAFQAAAKkAAAAjAAAAvwAAAKEAAADj
18d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisAAAABwAAAIUBAAALAAAAjQEAAEUBAACZAQAAFgAAAN8CAAAeAAAA9gIAAKEAAAAVAwAABQAAALcD
19d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisAAAJAAAAvQMAAAEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABQAAAAYAAAACAAAAAFJh
20d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwiseW1vbmQgTHV4dXJ5IFlhY2gtdABUaGVyZSBpcyAlcyBmaWxlAFRoZXJlIGFyZSAlcyBmaWxlcwBU
21d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisaGlzIG1vZHVsZSBwcm92aWRlcyBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgbG9jYWxpemF0aW9u
22d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisCnN1cHBvcnQgZm9yIHlvdXIgUHl0aG9uIHByb2dyYW1zIGJ5IHByb3ZpZGluZyBhbiBpbnRlcmZh
23d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisY2UgdG8gdGhlIEdOVQpnZXR0ZXh0IG1lc3NhZ2UgY2F0YWxvZyBsaWJyYXJ5LgBtdWxsdXNrAG51
24d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisZGdlIG51ZGdlAFByb2plY3QtSWQtVmVyc2lvbjogMi4wClBPLVJldmlzaW9uLURhdGU6IDIwMDAt
25d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisMDgtMjkgMTI6MTktMDQ6MDAKTGFzdC1UcmFuc2xhdG9yOiBKLiBEYXZpZCBJYsOhw7FleiA8ai1k
26d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisYXZpZEBub29zLmZyPgpMYW5ndWFnZS1UZWFtOiBYWCA8cHl0aG9uLWRldkBweXRob24ub3JnPgpN
27d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisSU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9aXNvLTg4
28d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisNTktMQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBub25lCkdlbmVyYXRlZC1CeTogcHlnZXR0
29d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisZXh0LnB5IDEuMQpQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD1uIT0xOwoAVGhyb2F0
30d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwisd29iYmxlciBNYW5ncm92ZQBIYXkgJXMgZmljaGVybwBIYXkgJXMgZmljaGVyb3MAR3V2ZiB6YnFo
31d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwiseXIgY2ViaXZxcmYgdmFncmVhbmd2YmFueXZtbmd2YmEgbmFxIHlicG55dm1uZ3ZiYQpmaGNjYmVn
32d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisIHNiZSBsYmhlIENsZ3ViYSBjZWJ0ZW56ZiBvbCBjZWJpdnF2YXQgbmEgdmFncmVzbnByIGdiIGd1
33d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisciBUQUgKdHJnZ3JrZyB6cmZmbnRyIHBuZ255YnQgeXZvZW5lbC4AYmFjb24Ad2luayB3aW5rAA==
34d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis'''
35d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
3639478e852827a4ca6955151bf004c7a15099a4b1Guido van RossumUMO_DATA = b'''\
37a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw3hIElQAAAAACAAAAHAAAACwAAAAFAAAAPAAAAAAAAABQAAAABAAAAFEAAAAPAQAAVgAAAAQAAABm
38a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry WarsawAQAAAQAAAAIAAAAAAAAAAAAAAAAAAAAAYWLDngBQcm9qZWN0LUlkLVZlcnNpb246IDIuMApQTy1S
39a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry WarsawZXZpc2lvbi1EYXRlOiAyMDAzLTA0LTExIDEyOjQyLTA0MDAKTGFzdC1UcmFuc2xhdG9yOiBCYXJy
40a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry WarsaweSBBLiBXQXJzYXcgPGJhcnJ5QHB5dGhvbi5vcmc+Ckxhbmd1YWdlLVRlYW06IFhYIDxweXRob24t
41a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry WarsawZGV2QHB5dGhvbi5vcmc+Ck1JTUUtVmVyc2lvbjogMS4wCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFp
42a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry WarsawbjsgY2hhcnNldD11dGYtOApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CkdlbmVyYXRl
43a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry WarsawZC1CeTogbWFudWFsbHkKAMKkeXoA
44a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw'''
45d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
4639478e852827a4ca6955151bf004c7a15099a4b1Guido van RossumMMO_DATA = b'''\
47e960e22579838419541357712bbbc3317c219071Barry Warsaw3hIElQAAAAABAAAAHAAAACQAAAADAAAALAAAAAAAAAA4AAAAeAEAADkAAAABAAAAAAAAAAAAAAAA
48e960e22579838419541357712bbbc3317c219071Barry WarsawUHJvamVjdC1JZC1WZXJzaW9uOiBObyBQcm9qZWN0IDAuMApQT1QtQ3JlYXRpb24tRGF0ZTogV2Vk
49e960e22579838419541357712bbbc3317c219071Barry WarsawIERlYyAxMSAwNzo0NDoxNSAyMDAyClBPLVJldmlzaW9uLURhdGU6IDIwMDItMDgtMTQgMDE6MTg6
50e960e22579838419541357712bbbc3317c219071Barry WarsawNTgrMDA6MDAKTGFzdC1UcmFuc2xhdG9yOiBKb2huIERvZSA8amRvZUBleGFtcGxlLmNvbT4KSmFu
51e960e22579838419541357712bbbc3317c219071Barry WarsawZSBGb29iYXIgPGpmb29iYXJAZXhhbXBsZS5jb20+Ckxhbmd1YWdlLVRlYW06IHh4IDx4eEBleGFt
52e960e22579838419541357712bbbc3317c219071Barry WarsawcGxlLmNvbT4KTUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFy
53e960e22579838419541357712bbbc3317c219071Barry Warsawc2V0PWlzby04ODU5LTE1CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IHF1b3RlZC1wcmludGFi
54e960e22579838419541357712bbbc3317c219071Barry WarsawbGUKR2VuZXJhdGVkLUJ5OiBweWdldHRleHQucHkgMS4zCgA=
55e960e22579838419541357712bbbc3317c219071Barry Warsaw'''
56e960e22579838419541357712bbbc3317c219071Barry Warsaw
57d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisLOCALEDIR = os.path.join('xx', 'LC_MESSAGES')
58d899605e30eef8e77f70184eac15fad1bf770586Martin v. LöwisMOFILE = os.path.join(LOCALEDIR, 'gettext.mo')
59a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry WarsawUMOFILE = os.path.join(LOCALEDIR, 'ugettext.mo')
60e960e22579838419541357712bbbc3317c219071Barry WarsawMMOFILE = os.path.join(LOCALEDIR, 'metadata.mo')
61d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
62d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
63a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawclass GettextBaseTest(unittest.TestCase):
64a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw    def setUp(self):
65a0e0cd3013840299a789f05be239d6ecb6387cdfNeal Norwitz        if not os.path.isdir(LOCALEDIR):
66a0e0cd3013840299a789f05be239d6ecb6387cdfNeal Norwitz            os.makedirs(LOCALEDIR)
677fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo        with open(MOFILE, 'wb') as fp:
687fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo            fp.write(base64.decodebytes(GNU_MO_DATA))
697fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo        with open(UMOFILE, 'wb') as fp:
707fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo            fp.write(base64.decodebytes(UMO_DATA))
717fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo        with open(MMOFILE, 'wb') as fp:
727fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo            fp.write(base64.decodebytes(MMO_DATA))
73155374d95d8ecd235d3a3edd92dd6f6a23d59f11Walter Dörwald        self.env = support.EnvironmentVarGuard()
74155374d95d8ecd235d3a3edd92dd6f6a23d59f11Walter Dörwald        self.env['LANGUAGE'] = 'xx'
7537a89334da1fbe5b30f5a03a97b8f8c2a59adc1bÉric Araujo        gettext._translations.clear()
76a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw
77a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw    def tearDown(self):
78155374d95d8ecd235d3a3edd92dd6f6a23d59f11Walter Dörwald        self.env.__exit__()
79155374d95d8ecd235d3a3edd92dd6f6a23d59f11Walter Dörwald        del self.env
804aebbb044942ad17d761491b46ff05b6ab8387c9Brett Cannon        shutil.rmtree(os.path.split(LOCALEDIR)[0])
81d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
82ff6d8136574e9f4e1b11f75a945af5f8ab44a6fdBarry Warsaw
83a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawclass GettextTestCase1(GettextBaseTest):
84d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def setUp(self):
85a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        GettextBaseTest.setUp(self)
86d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        self.localedir = os.curdir
87d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        self.mofile = MOFILE
88d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        gettext.install('gettext', self.localedir)
89ff6d8136574e9f4e1b11f75a945af5f8ab44a6fdBarry Warsaw
90d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_some_translations(self):
91a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
92d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # test some translations
93a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_('albatross'), 'albatross')
94ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(_('mullusk'), 'bacon')
95a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove')
96ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(_(r'nudge nudge'), 'wink wink')
97d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
98d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_double_quotes(self):
99a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
100d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # double quotes
101a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_("albatross"), 'albatross')
102ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(_("mullusk"), 'bacon')
103a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_(r"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove')
104ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(_(r"nudge nudge"), 'wink wink')
105d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
106d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_triple_single_quotes(self):
107a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
108d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # triple single quotes
109a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_('''albatross'''), 'albatross')
110ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(_('''mullusk'''), 'bacon')
111a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_(r'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove')
112ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(_(r'''nudge nudge'''), 'wink wink')
113d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
114d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_triple_double_quotes(self):
115a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
116d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # triple double quotes
117a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_("""albatross"""), 'albatross')
118ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(_("""mullusk"""), 'bacon')
119a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove')
120ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(_(r"""nudge nudge"""), 'wink wink')
121d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
122d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_multiline_strings(self):
123a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
124d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # multiline strings
125a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_('''This module provides internationalization and localization
1269e035921494cb8f101c3bfc22956fa968c6ab41fBarry Warsawsupport for your Python programs by providing an interface to the GNU
127a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawgettext message catalog library.'''),
128a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw           '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
129d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwisfhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
130a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawtrggrkg zrffntr pngnybt yvoenel.''')
131ff6d8136574e9f4e1b11f75a945af5f8ab44a6fdBarry Warsaw
132d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_the_alternative_interface(self):
133a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
134d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # test the alternative interface
1357fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo        with open(self.mofile, 'rb') as fp:
1367fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo            t = gettext.GNUTranslations(fp)
137a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        # Install the translation object
138d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        t.install()
139a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_('nudge nudge'), 'wink wink')
140a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        # Try unicode return type
141801844d6fc8b48cfa969dd2573bd522a2b26f974Benjamin Peterson        t.install()
142a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(_('mullusk'), 'bacon')
143602b9ba6b37c4ac4ed445f8c9e9dccd68d631899Georg Brandl        # Test installation of other methods
1441a3284ed69d545e4ef59869998cb8c29233a45faGeorg Brandl        import builtins
145801844d6fc8b48cfa969dd2573bd522a2b26f974Benjamin Peterson        t.install(names=["gettext", "lgettext"])
146801844d6fc8b48cfa969dd2573bd522a2b26f974Benjamin Peterson        eq(_, t.gettext)
147801844d6fc8b48cfa969dd2573bd522a2b26f974Benjamin Peterson        eq(builtins.gettext, t.gettext)
148602b9ba6b37c4ac4ed445f8c9e9dccd68d631899Georg Brandl        eq(lgettext, t.lgettext)
1491a3284ed69d545e4ef59869998cb8c29233a45faGeorg Brandl        del builtins.gettext
1501a3284ed69d545e4ef59869998cb8c29233a45faGeorg Brandl        del builtins.lgettext
151d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
152ff6d8136574e9f4e1b11f75a945af5f8ab44a6fdBarry Warsaw
153a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawclass GettextTestCase2(GettextBaseTest):
154d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def setUp(self):
155a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        GettextBaseTest.setUp(self)
156d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        self.localedir = os.curdir
157a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        # Set up the bindings
158d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        gettext.bindtextdomain('gettext', self.localedir)
159d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        gettext.textdomain('gettext')
160a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        # For convenience
161d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        self._ = gettext.gettext
16264dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
163d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_bindtextdomain(self):
164a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        self.assertEqual(gettext.bindtextdomain('gettext'), self.localedir)
16564dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
166d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_textdomain(self):
167a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        self.assertEqual(gettext.textdomain(), 'gettext')
16864dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
169d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_some_translations(self):
170a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
171d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # test some translations
172a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(self._('albatross'), 'albatross')
173ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(self._('mullusk'), 'bacon')
174a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(self._(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove')
175ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(self._(r'nudge nudge'), 'wink wink')
17664dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
177d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_double_quotes(self):
178a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
179d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # double quotes
180a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(self._("albatross"), 'albatross')
181ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(self._("mullusk"), 'bacon')
182a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(self._(r"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove')
183ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(self._(r"nudge nudge"), 'wink wink')
184d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
185d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_triple_single_quotes(self):
186a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
187d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # triple single quotes
188a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(self._('''albatross'''), 'albatross')
189ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(self._('''mullusk'''), 'bacon')
190a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(self._(r'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove')
191ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(self._(r'''nudge nudge'''), 'wink wink')
192d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
193d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_triple_double_quotes(self):
194a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
195d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # triple double quotes
196a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(self._("""albatross"""), 'albatross')
197ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(self._("""mullusk"""), 'bacon')
198a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(self._(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove')
199ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(self._(r"""nudge nudge"""), 'wink wink')
200d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
201d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_multiline_strings(self):
202a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
203d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # multiline strings
204a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(self._('''This module provides internationalization and localization
20564dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawsupport for your Python programs by providing an interface to the GNU
206a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawgettext message catalog library.'''),
207a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw           '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
208d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwisfhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
209a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawtrggrkg zrffntr pngnybt yvoenel.''')
21064dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
21164dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
212a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawclass PluralFormsTestCase(GettextBaseTest):
213d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def setUp(self):
214a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        GettextBaseTest.setUp(self)
215d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        self.mofile = MOFILE
216ff6d8136574e9f4e1b11f75a945af5f8ab44a6fdBarry Warsaw
217d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_plural_forms1(self):
218a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
219d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        x = gettext.ngettext('There is %s file', 'There are %s files', 1)
220a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(x, 'Hay %s fichero')
221d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        x = gettext.ngettext('There is %s file', 'There are %s files', 2)
222a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(x, 'Hay %s ficheros')
223ff6d8136574e9f4e1b11f75a945af5f8ab44a6fdBarry Warsaw
224d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_plural_forms2(self):
225a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
2267fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo        with open(self.mofile, 'rb') as fp:
2277fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo            t = gettext.GNUTranslations(fp)
228d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        x = t.ngettext('There is %s file', 'There are %s files', 1)
229a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(x, 'Hay %s fichero')
230d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        x = t.ngettext('There is %s file', 'There are %s files', 2)
231a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(x, 'Hay %s ficheros')
232d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
233d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_hu(self):
234a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
235d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        f = gettext.c2py('0')
236d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        s = ''.join([ str(f(x)) for x in range(200) ])
237a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(s, "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
238d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
239d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_de(self):
240a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
241d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        f = gettext.c2py('n != 1')
242d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        s = ''.join([ str(f(x)) for x in range(200) ])
243a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(s, "10111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
244d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
245d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_fr(self):
246a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
247d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        f = gettext.c2py('n>1')
248d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        s = ''.join([ str(f(x)) for x in range(200) ])
249a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(s, "00111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
250ff6d8136574e9f4e1b11f75a945af5f8ab44a6fdBarry Warsaw
251d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_gd(self):
252a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
253d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        f = gettext.c2py('n==1 ? 0 : n==2 ? 1 : 2')
254d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        s = ''.join([ str(f(x)) for x in range(200) ])
255a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
256d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
257d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_gd2(self):
258a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
259d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # Tests the combination of parentheses and "?:"
260d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        f = gettext.c2py('n==1 ? 0 : (n==2 ? 1 : 2)')
261d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        s = ''.join([ str(f(x)) for x in range(200) ])
262a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
263d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
264d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_lt(self):
265a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
266d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2')
267d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        s = ''.join([ str(f(x)) for x in range(200) ])
268a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(s, "20111111112222222222201111111120111111112011111111201111111120111111112011111111201111111120111111112011111111222222222220111111112011111111201111111120111111112011111111201111111120111111112011111111")
269d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
270d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_ru(self):
271a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
272d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2')
273d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        s = ''.join([ str(f(x)) for x in range(200) ])
274a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(s, "20111222222222222222201112222220111222222011122222201112222220111222222011122222201112222220111222222011122222222222222220111222222011122222201112222220111222222011122222201112222220111222222011122222")
275d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
276d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_pl(self):
277a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
278d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        f = gettext.c2py('n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2')
279d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        s = ''.join([ str(f(x)) for x in range(200) ])
280a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(s, "20111222222222222222221112222222111222222211122222221112222222111222222211122222221112222222111222222211122222222222222222111222222211122222221112222222111222222211122222221112222222111222222211122222")
281d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
282d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_sl(self):
283a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
284d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        f = gettext.c2py('n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3')
285d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        s = ''.join([ str(f(x)) for x in range(200) ])
286a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq(s, "30122333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333012233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333")
287d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
288d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis    def test_security(self):
289a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        raises = self.assertRaises
290d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis        # Test for a dangerous expression
291a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        raises(ValueError, gettext.c2py, "os.chmod('/etc/passwd',0777)")
292a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw
293a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw
294a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawclass UnicodeTranslationsTest(GettextBaseTest):
295a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw    def setUp(self):
296a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        GettextBaseTest.setUp(self)
2977fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo        with open(UMOFILE, 'rb') as fp:
298edb155fda199f7fa481d0020e911a6eec0705dfaBarry Warsaw            self.t = gettext.GNUTranslations(fp)
299801844d6fc8b48cfa969dd2573bd522a2b26f974Benjamin Peterson        self._ = self.t.gettext
300d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
301a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw    def test_unicode_msgid(self):
302c9c0f201fed21efcf669dbbf5f923eaf0eeb1db9Benjamin Peterson        unless = self.assertTrue
303ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        unless(isinstance(self._(''), str))
304ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        unless(isinstance(self._(''), str))
305d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
306a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw    def test_unicode_msgstr(self):
307a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw        eq = self.assertEqual
308ef87d6ed94780fe00250a551031023aeb2898365Guido van Rossum        eq(self._('ab\xde'), '\xa4yz')
309d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
310d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
311e960e22579838419541357712bbbc3317c219071Barry Warsawclass WeirdMetadataTest(GettextBaseTest):
312e960e22579838419541357712bbbc3317c219071Barry Warsaw    def setUp(self):
313e960e22579838419541357712bbbc3317c219071Barry Warsaw        GettextBaseTest.setUp(self)
3147fa886df3622bbedbeb9c2486a8af5f05334a928Éric Araujo        with open(MMOFILE, 'rb') as fp:
315e960e22579838419541357712bbbc3317c219071Barry Warsaw            try:
316e960e22579838419541357712bbbc3317c219071Barry Warsaw                self.t = gettext.GNUTranslations(fp)
317e960e22579838419541357712bbbc3317c219071Barry Warsaw            except:
318e960e22579838419541357712bbbc3317c219071Barry Warsaw                self.tearDown()
319e960e22579838419541357712bbbc3317c219071Barry Warsaw                raise
320e960e22579838419541357712bbbc3317c219071Barry Warsaw
321e960e22579838419541357712bbbc3317c219071Barry Warsaw    def test_weird_metadata(self):
322e960e22579838419541357712bbbc3317c219071Barry Warsaw        info = self.t.info()
3236ae5d7f2a132aa9690bfb59b8eebcc1fb7c792c8Christian Heimes        self.assertEqual(len(info), 9)
324e960e22579838419541357712bbbc3317c219071Barry Warsaw        self.assertEqual(info['last-translator'],
325e960e22579838419541357712bbbc3317c219071Barry Warsaw           'John Doe <jdoe@example.com>\nJane Foobar <jfoobar@example.com>')
326e960e22579838419541357712bbbc3317c219071Barry Warsaw
327e960e22579838419541357712bbbc3317c219071Barry Warsaw
3286108bf5ed002925f2092deb025f336d8c2024299Éric Araujoclass DummyGNUTranslations(gettext.GNUTranslations):
3296108bf5ed002925f2092deb025f336d8c2024299Éric Araujo    def foo(self):
3306108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        return 'foo'
3316108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
3326108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
3336108bf5ed002925f2092deb025f336d8c2024299Éric Araujoclass GettextCacheTestCase(GettextBaseTest):
3346108bf5ed002925f2092deb025f336d8c2024299Éric Araujo    def test_cache(self):
3356108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        self.localedir = os.curdir
3366108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        self.mofile = MOFILE
3376108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
3386108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        self.assertEqual(len(gettext._translations), 0)
3396108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
3406108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        t = gettext.translation('gettext', self.localedir)
3416108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
3426108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        self.assertEqual(len(gettext._translations), 1)
3436108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
3446108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        t = gettext.translation('gettext', self.localedir,
3456108bf5ed002925f2092deb025f336d8c2024299Éric Araujo                                class_=DummyGNUTranslations)
3466108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
3476108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        self.assertEqual(len(gettext._translations), 2)
3486108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        self.assertEqual(t.__class__, DummyGNUTranslations)
3496108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
3506108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        # Calling it again doesn't add to the cache
3516108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
3526108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        t = gettext.translation('gettext', self.localedir,
3536108bf5ed002925f2092deb025f336d8c2024299Éric Araujo                                class_=DummyGNUTranslations)
3546108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
3556108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        self.assertEqual(len(gettext._translations), 2)
3566108bf5ed002925f2092deb025f336d8c2024299Éric Araujo        self.assertEqual(t.__class__, DummyGNUTranslations)
3576108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
3586108bf5ed002925f2092deb025f336d8c2024299Éric Araujo
359a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawdef test_main():
360ee8712cda46338d223509cc5751fd36509ad3860Benjamin Peterson    support.run_unittest(__name__)
361004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake
362a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawif __name__ == '__main__':
363a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw    test_main()
364a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw
365a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw
366a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw# For reference, here's the .po file used to created the GNU_MO_DATA above.
367d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis#
368d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis# The original version was automatically generated from the sources with
369d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis# pygettext. Later it was manually modified to add plural forms support.
37064dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
37164dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw'''
372a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw# Dummy translation for the Python test_gettext.py module.
373191487351abb5d2b7daf9d839ca2b3a3c7fdc07bBarry Warsaw# Copyright (C) 2001 Python Software Foundation
374191487351abb5d2b7daf9d839ca2b3a3c7fdc07bBarry Warsaw# Barry Warsaw <barry@python.org>, 2000.
37564dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#
37664dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgid ""
37764dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgstr ""
37864dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw"Project-Id-Version: 2.0\n"
379a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw"PO-Revision-Date: 2003-04-11 14:32-0400\n"
380d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis"Last-Translator: J. David Ibanez <j-david@noos.fr>\n"
38164dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw"Language-Team: XX <python-dev@python.org>\n"
38264dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw"MIME-Version: 1.0\n"
383d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis"Content-Type: text/plain; charset=iso-8859-1\n"
384d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis"Content-Transfer-Encoding: 8bit\n"
38564dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw"Generated-By: pygettext.py 1.1\n"
386d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis"Plural-Forms: nplurals=2; plural=n!=1;\n"
38764dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
38864dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:19 test_gettext.py:25 test_gettext.py:31 test_gettext.py:37
38964dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:51 test_gettext.py:80 test_gettext.py:86 test_gettext.py:92
39064dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:98
39164dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgid "nudge nudge"
39264dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgstr "wink wink"
39364dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
39464dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:16 test_gettext.py:22 test_gettext.py:28 test_gettext.py:34
39564dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:77 test_gettext.py:83 test_gettext.py:89 test_gettext.py:95
39664dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgid "albatross"
39764dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgstr ""
39864dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
39964dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:18 test_gettext.py:24 test_gettext.py:30 test_gettext.py:36
40064dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:79 test_gettext.py:85 test_gettext.py:91 test_gettext.py:97
40164dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgid "Raymond Luxury Yach-t"
40264dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgstr "Throatwobbler Mangrove"
40364dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
40464dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:17 test_gettext.py:23 test_gettext.py:29 test_gettext.py:35
40564dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:56 test_gettext.py:78 test_gettext.py:84 test_gettext.py:90
40664dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:96
40764dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgid "mullusk"
40864dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgstr "bacon"
40964dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw
41064dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw#: test_gettext.py:40 test_gettext.py:101
41164dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgid ""
41264dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw"This module provides internationalization and localization\n"
41364dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw"support for your Python programs by providing an interface to the GNU\n"
41464dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw"gettext message catalog library."
41564dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsawmsgstr ""
41664dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw"Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba\n"
41764dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw"fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH\n"
41864dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw"trggrkg zrffntr pngnybt yvoenel."
419d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis
420d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis# Manually added, as neither pygettext nor xgettext support plural forms
421d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwis# in Python.
422d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwismsgid "There is %s file"
423d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwismsgid_plural "There are %s files"
424d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwismsgstr[0] "Hay %s fichero"
425d899605e30eef8e77f70184eac15fad1bf770586Martin v. Löwismsgstr[1] "Hay %s ficheros"
42664dab4602e17878e816ae1d3f48b2f589ceebdfbBarry Warsaw'''
427a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw
428a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw# Here's the second example po file example, used to generate the UMO_DATA
429a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw# containing utf-8 encoded Unicode strings
430a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw
431a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw'''
432a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw# Dummy translation for the Python test_gettext.py module.
433a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw# Copyright (C) 2001 Python Software Foundation
434a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw# Barry Warsaw <barry@python.org>, 2000.
435a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw#
436a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawmsgid ""
437a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawmsgstr ""
438a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw"Project-Id-Version: 2.0\n"
439a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw"PO-Revision-Date: 2003-04-11 12:42-0400\n"
440a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw"Last-Translator: Barry A. WArsaw <barry@python.org>\n"
441a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw"Language-Team: XX <python-dev@python.org>\n"
442a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw"MIME-Version: 1.0\n"
443a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw"Content-Type: text/plain; charset=utf-8\n"
444a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw"Content-Transfer-Encoding: 7bit\n"
445a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw"Generated-By: manually\n"
446a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw
447a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw#: nofile:0
448a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawmsgid "ab\xc3\x9e"
449a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsawmsgstr "\xc2\xa4yz"
450a1ce93f87cb221be9a7466c2f9d2b7dc494f458dBarry Warsaw'''
451e960e22579838419541357712bbbc3317c219071Barry Warsaw
452e960e22579838419541357712bbbc3317c219071Barry Warsaw# Here's the third example po file, used to generate MMO_DATA
453e960e22579838419541357712bbbc3317c219071Barry Warsaw
454e960e22579838419541357712bbbc3317c219071Barry Warsaw'''
455e960e22579838419541357712bbbc3317c219071Barry Warsawmsgid ""
456e960e22579838419541357712bbbc3317c219071Barry Warsawmsgstr ""
457e960e22579838419541357712bbbc3317c219071Barry Warsaw"Project-Id-Version: No Project 0.0\n"
458e960e22579838419541357712bbbc3317c219071Barry Warsaw"POT-Creation-Date: Wed Dec 11 07:44:15 2002\n"
459e960e22579838419541357712bbbc3317c219071Barry Warsaw"PO-Revision-Date: 2002-08-14 01:18:58+00:00\n"
460e960e22579838419541357712bbbc3317c219071Barry Warsaw"Last-Translator: John Doe <jdoe@example.com>\n"
461e960e22579838419541357712bbbc3317c219071Barry Warsaw"Jane Foobar <jfoobar@example.com>\n"
462e960e22579838419541357712bbbc3317c219071Barry Warsaw"Language-Team: xx <xx@example.com>\n"
463e960e22579838419541357712bbbc3317c219071Barry Warsaw"MIME-Version: 1.0\n"
464e960e22579838419541357712bbbc3317c219071Barry Warsaw"Content-Type: text/plain; charset=iso-8859-15\n"
465e960e22579838419541357712bbbc3317c219071Barry Warsaw"Content-Transfer-Encoding: quoted-printable\n"
466e960e22579838419541357712bbbc3317c219071Barry Warsaw"Generated-By: pygettext.py 1.3\n"
467e960e22579838419541357712bbbc3317c219071Barry Warsaw'''
468