From a3c5b31855f1bf3c4a4151d3fb7f412932825318 Mon Sep 17 00:00:00 2001 From: liugedragon <106804815+liugedragon@users.noreply.github.com> Date: Mon, 9 Nov 2026 11:58:05 +0800 Subject: [PATCH] Fix compatibility checks for scientific float placeholders --- babel/messages/checkers.py | 2 +- tests/messages/test_checkers.py | 35 +++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/babel/messages/checkers.py b/babel/messages/checkers.py index cf0fbcd39..fb5f5193f 100644 --- a/babel/messages/checkers.py +++ b/babel/messages/checkers.py @@ -20,7 +20,7 @@ _string_format_compatibilities = [ {'i', 'd', 'u'}, {'x', 'X'}, - {'f', 'F', 'g', 'G'}, + {'e', 'E', 'f', 'F', 'g', 'G'}, ] diff --git a/tests/messages/test_checkers.py b/tests/messages/test_checkers.py index 01194e467..890e1cc1b 100644 --- a/tests/messages/test_checkers.py +++ b/tests/messages/test_checkers.py @@ -467,3 +467,38 @@ def test__validate_format_invalid(msgid, msgstr, error): ) def test__validate_format_valid(msgid, msgstr): _validate_format(msgid, msgstr) + + +@pytest.mark.parametrize('source_conversion', 'eEfFgG') +@pytest.mark.parametrize('target_conversion', 'eEfFgG') +@pytest.mark.parametrize('named', [False, True]) +def test_python_format_float_conversion_compatibility( + source_conversion, target_conversion, named, +): + placeholder = '%(value)' if named else '%' + msgid = f'Value: {placeholder}{source_conversion}' + msgstr = f'Wert: {placeholder}{target_conversion}' + arguments = {'value': 1.234} if named else 1.234 + + assert isinstance(msgid % arguments, str) + assert isinstance(msgstr % arguments, str) + python_format(None, Message(msgid, msgstr)) + + +@pytest.mark.parametrize('source_conversion', 'eE') +@pytest.mark.parametrize('target_conversion', 'sdx') +@pytest.mark.parametrize('named', [False, True]) +def test_python_format_float_conversion_rejects_non_float( + source_conversion, target_conversion, named, +): + placeholder = '%(value)' if named else '%' + with pytest.raises(TranslationError, match='incompatible format'): + _validate_format( + f'{placeholder}{source_conversion}', f'{placeholder}{target_conversion}', + ) + + +def test_python_format_float_conversion_plural(): + catalog = Catalog(locale='en') + catalog.add(('%e item', '%e items'), ('%E article', '%g articles')) + assert list(catalog.check()) == []