mirror of https://github.com/python/cpython.git
gh-85012: Properly reset msgctxt when compiling messages with msgfmt (GH-130525)
Add also human-readable snapshots for tests.
This commit is contained in:
parent
c5abded099
commit
7ea6e88eb4
|
@ -0,0 +1 @@
|
|||
[]
|
|
@ -0,0 +1,58 @@
|
|||
[
|
||||
[
|
||||
"",
|
||||
"Project-Id-Version: PACKAGE VERSION\nPOT-Creation-Date: 2024-10-26 18:06+0200\nPO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\nLast-Translator: FULL NAME <EMAIL@ADDRESS>\nLanguage-Team: LANGUAGE <LL@li.org>\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit\n"
|
||||
],
|
||||
[
|
||||
"\n newlines \n",
|
||||
"\n translated \n"
|
||||
],
|
||||
[
|
||||
"\"escapes\"",
|
||||
"\"translated\""
|
||||
],
|
||||
[
|
||||
"Multilinestring",
|
||||
"Multilinetranslation"
|
||||
],
|
||||
[
|
||||
"abc\u0004foo",
|
||||
"bar"
|
||||
],
|
||||
[
|
||||
"bar",
|
||||
"baz"
|
||||
],
|
||||
[
|
||||
"xyz\u0004foo",
|
||||
"bar"
|
||||
],
|
||||
[
|
||||
[
|
||||
"One email sent.",
|
||||
0
|
||||
],
|
||||
"One email sent."
|
||||
],
|
||||
[
|
||||
[
|
||||
"One email sent.",
|
||||
1
|
||||
],
|
||||
"%d emails sent."
|
||||
],
|
||||
[
|
||||
[
|
||||
"abc\u0004One email sent.",
|
||||
0
|
||||
],
|
||||
"One email sent."
|
||||
],
|
||||
[
|
||||
[
|
||||
"abc\u0004One email sent.",
|
||||
1
|
||||
],
|
||||
"%d emails sent."
|
||||
]
|
||||
]
|
Binary file not shown.
|
@ -1,5 +1,6 @@
|
|||
"""Tests for the Tools/i18n/msgfmt.py tool."""
|
||||
|
||||
import json
|
||||
import sys
|
||||
import unittest
|
||||
from gettext import GNUTranslations
|
||||
|
@ -39,6 +40,28 @@ def test_compilation(self):
|
|||
|
||||
self.assertDictEqual(actual._catalog, expected._catalog)
|
||||
|
||||
def test_translations(self):
|
||||
with open(data_dir / 'general.mo', 'rb') as f:
|
||||
t = GNUTranslations(f)
|
||||
|
||||
self.assertEqual(t.gettext('foo'), 'foo')
|
||||
self.assertEqual(t.gettext('bar'), 'baz')
|
||||
self.assertEqual(t.pgettext('abc', 'foo'), 'bar')
|
||||
self.assertEqual(t.pgettext('xyz', 'foo'), 'bar')
|
||||
self.assertEqual(t.gettext('Multilinestring'), 'Multilinetranslation')
|
||||
self.assertEqual(t.gettext('"escapes"'), '"translated"')
|
||||
self.assertEqual(t.gettext('\n newlines \n'), '\n translated \n')
|
||||
self.assertEqual(t.ngettext('One email sent.', '%d emails sent.', 1),
|
||||
'One email sent.')
|
||||
self.assertEqual(t.ngettext('One email sent.', '%d emails sent.', 2),
|
||||
'%d emails sent.')
|
||||
self.assertEqual(t.npgettext('abc', 'One email sent.',
|
||||
'%d emails sent.', 1),
|
||||
'One email sent.')
|
||||
self.assertEqual(t.npgettext('abc', 'One email sent.',
|
||||
'%d emails sent.', 2),
|
||||
'%d emails sent.')
|
||||
|
||||
def test_po_with_bom(self):
|
||||
with temp_cwd():
|
||||
Path('bom.po').write_bytes(b'\xef\xbb\xbfmsgid "Python"\nmsgstr "Pioton"\n')
|
||||
|
@ -125,6 +148,16 @@ def update_catalog_snapshots():
|
|||
for po_file in data_dir.glob('*.po'):
|
||||
mo_file = po_file.with_suffix('.mo')
|
||||
compile_messages(po_file, mo_file)
|
||||
# Create a human-readable JSON file which is
|
||||
# easier to review than the binary .mo file.
|
||||
with open(mo_file, 'rb') as f:
|
||||
translations = GNUTranslations(f)
|
||||
catalog_file = po_file.with_suffix('.json')
|
||||
with open(catalog_file, 'w') as f:
|
||||
data = translations._catalog.items()
|
||||
data = sorted(data, key=lambda x: (isinstance(x[0], tuple), x[0]))
|
||||
json.dump(data, f, indent=4)
|
||||
f.write('\n')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Correctly reset ``msgctxt`` when compiling messages in :program:`msgfmt`.
|
|
@ -159,6 +159,7 @@ def make(filename, outfile):
|
|||
elif l.startswith('msgid') and not l.startswith('msgid_plural'):
|
||||
if section == STR:
|
||||
add(msgctxt, msgid, msgstr, fuzzy)
|
||||
msgctxt = None
|
||||
if not msgid:
|
||||
# See whether there is an encoding declaration
|
||||
p = HeaderParser()
|
||||
|
|
Loading…
Reference in New Issue