diff --git a/babel/messages/extract.py b/babel/messages/extract.py index a8f15469d..3c196f0e0 100644 --- a/babel/messages/extract.py +++ b/babel/messages/extract.py @@ -88,9 +88,11 @@ def tell(self) -> int: ... 'ungettext': (1, 2), 'dgettext': (2,), 'dngettext': (2, 3), + 'dpgettext': ((2, 'c'), 3), 'N_': None, 'pgettext': ((1, 'c'), 2), 'npgettext': ((1, 'c'), 2, 3), + 'dnpgettext': ((2, 'c'), 3, 4), } DEFAULT_MAPPING: list[tuple[str, str]] = [('**.py', 'python')] diff --git a/tests/messages/frontend/test_frontend.py b/tests/messages/frontend/test_frontend.py index a77d5d679..17a7dbbd8 100644 --- a/tests/messages/frontend/test_frontend.py +++ b/tests/messages/frontend/test_frontend.py @@ -218,6 +218,7 @@ def test_extract_keyword_args_384(split, arg_name): ) assert isinstance(cmdinst, ExtractMessages) assert set(cmdinst.keywords.keys()) == {'_', 'dgettext', 'dngettext', + 'dnpgettext', 'dpgettext', 'gettext', 'gettext_lazy', 'gettext_noop', 'N_', 'ngettext', 'ngettext_lazy', 'npgettext', diff --git a/tests/messages/test_extract_python.py b/tests/messages/test_extract_python.py index aa13124fb..86f15b1c6 100644 --- a/tests/messages/test_extract_python.py +++ b/tests/messages/test_extract_python.py @@ -145,6 +145,27 @@ def test_multiline(): ] +def test_dpgettext(): + buf = BytesIO(b"""\ +msg1 = dpgettext('dev', 'Strings', + 'pylon') +msg2 = dpgettext('dev', 'Strings', 'elvis') +""") + messages = list(extract.extract_python(buf, ('dpgettext',), [], {})) + assert messages == [ + (1, 'dpgettext', ('dev', 'Strings', 'pylon'), []), + (3, 'dpgettext', ('dev', 'Strings', 'elvis'), []), + ] + buf = BytesIO(b"""\ +msg = dpgettext('dev', 'Strings', 'pylon', # TRANSLATORS: shouldn't be + ) # TRANSLATORS: seeing this +""") + messages = list(extract.extract_python(buf, ('dpgettext',),['TRANSLATORS:'], {})) + assert messages == [ + (1, 'dpgettext', ('dev', 'Strings', 'pylon', None), []), + ] + + def test_npgettext(): buf = BytesIO(b"""\ msg1 = npgettext('Strings','pylon', @@ -170,6 +191,30 @@ def test_npgettext(): ] +def test_dnpgettext(): + buf = BytesIO(b"""\ +msg1 = dnpgettext('dev', 'Strings','pylon', + 'pylons', count) +msg2 = dnpgettext('dev', 'Strings','elvis', + 'elvises', + count) +""") + messages = list(extract.extract_python(buf, ('dnpgettext',), [], {})) + assert messages == [ + (1, 'dnpgettext', ('dev', 'Strings', 'pylon', 'pylons', None), []), + (3, 'dnpgettext', ('dev', 'Strings', 'elvis', 'elvises', None), []), + ] + buf = BytesIO(b"""\ +msg = dnpgettext('dev', 'Strings', 'pylon', # TRANSLATORS: shouldn't be + 'pylons', # TRANSLATORS: seeing this + count) +""") + messages = list(extract.extract_python(buf, ('dnpgettext',),['TRANSLATORS:'], {})) + assert messages == [ + (1, 'dnpgettext', ('dev', 'Strings', 'pylon', 'pylons', None), []), + ] + + def test_triple_quoted_strings(): buf = BytesIO(b"""\ msg1 = _('''pylons''')