mirror of https://github.com/python/cpython
gh-88434: Emit deprecation warnings for non-integer numbers in gettext if translation not found (GH-110574)
This commit is contained in:
parent
45cfabb842
commit
38bd2c520a
|
@ -363,6 +363,10 @@ Deprecated
|
||||||
It was not documented and only supported in the C implementation.
|
It was not documented and only supported in the C implementation.
|
||||||
(Contributed by Serhiy Storchaka in :gh:`89902`.)
|
(Contributed by Serhiy Storchaka in :gh:`89902`.)
|
||||||
|
|
||||||
|
* Emit deprecation warning for non-integer numbers in :mod:`gettext` functions
|
||||||
|
and methods that consider plural forms even if the translation was not found.
|
||||||
|
(Contributed by Serhiy Storchaka in :gh:`88434`.)
|
||||||
|
|
||||||
|
|
||||||
Pending Removal in Python 3.14
|
Pending Removal in Python 3.14
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
|
@ -171,6 +171,13 @@ def _as_int(n):
|
||||||
except TypeError:
|
except TypeError:
|
||||||
raise TypeError('Plural value must be an integer, got %s' %
|
raise TypeError('Plural value must be an integer, got %s' %
|
||||||
(n.__class__.__name__,)) from None
|
(n.__class__.__name__,)) from None
|
||||||
|
return _as_int2(n)
|
||||||
|
|
||||||
|
def _as_int2(n):
|
||||||
|
try:
|
||||||
|
return operator.index(n)
|
||||||
|
except TypeError:
|
||||||
|
pass
|
||||||
|
|
||||||
import warnings
|
import warnings
|
||||||
frame = sys._getframe(1)
|
frame = sys._getframe(1)
|
||||||
|
@ -288,6 +295,7 @@ class NullTranslations:
|
||||||
def ngettext(self, msgid1, msgid2, n):
|
def ngettext(self, msgid1, msgid2, n):
|
||||||
if self._fallback:
|
if self._fallback:
|
||||||
return self._fallback.ngettext(msgid1, msgid2, n)
|
return self._fallback.ngettext(msgid1, msgid2, n)
|
||||||
|
n = _as_int2(n)
|
||||||
if n == 1:
|
if n == 1:
|
||||||
return msgid1
|
return msgid1
|
||||||
else:
|
else:
|
||||||
|
@ -301,6 +309,7 @@ class NullTranslations:
|
||||||
def npgettext(self, context, msgid1, msgid2, n):
|
def npgettext(self, context, msgid1, msgid2, n):
|
||||||
if self._fallback:
|
if self._fallback:
|
||||||
return self._fallback.npgettext(context, msgid1, msgid2, n)
|
return self._fallback.npgettext(context, msgid1, msgid2, n)
|
||||||
|
n = _as_int2(n)
|
||||||
if n == 1:
|
if n == 1:
|
||||||
return msgid1
|
return msgid1
|
||||||
else:
|
else:
|
||||||
|
@ -587,6 +596,7 @@ def dngettext(domain, msgid1, msgid2, n):
|
||||||
try:
|
try:
|
||||||
t = translation(domain, _localedirs.get(domain, None))
|
t = translation(domain, _localedirs.get(domain, None))
|
||||||
except OSError:
|
except OSError:
|
||||||
|
n = _as_int2(n)
|
||||||
if n == 1:
|
if n == 1:
|
||||||
return msgid1
|
return msgid1
|
||||||
else:
|
else:
|
||||||
|
@ -606,6 +616,7 @@ def dnpgettext(domain, context, msgid1, msgid2, n):
|
||||||
try:
|
try:
|
||||||
t = translation(domain, _localedirs.get(domain, None))
|
t = translation(domain, _localedirs.get(domain, None))
|
||||||
except OSError:
|
except OSError:
|
||||||
|
n = _as_int2(n)
|
||||||
if n == 1:
|
if n == 1:
|
||||||
return msgid1
|
return msgid1
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -332,22 +332,24 @@ class PluralFormsTests:
|
||||||
x = gettext(singular)
|
x = gettext(singular)
|
||||||
self.assertEqual(x, tsingular)
|
self.assertEqual(x, tsingular)
|
||||||
|
|
||||||
|
lineno = self._test_plural_forms.__code__.co_firstlineno + 12
|
||||||
|
with self.assertWarns(DeprecationWarning) as cm:
|
||||||
|
x = ngettext(singular, plural, 1.0)
|
||||||
|
self.assertEqual(cm.filename, __file__)
|
||||||
|
self.assertEqual(cm.lineno, lineno)
|
||||||
|
self.assertEqual(x, tsingular)
|
||||||
|
with self.assertWarns(DeprecationWarning) as cm:
|
||||||
|
x = ngettext(singular, plural, 1.1)
|
||||||
|
self.assertEqual(cm.filename, __file__)
|
||||||
|
self.assertEqual(cm.lineno, lineno + 5)
|
||||||
|
self.assertEqual(x, tplural)
|
||||||
|
|
||||||
if numbers_only:
|
if numbers_only:
|
||||||
lineno = self._test_plural_forms.__code__.co_firstlineno + 9
|
|
||||||
with self.assertWarns(DeprecationWarning) as cm:
|
|
||||||
x = ngettext(singular, plural, 1.0)
|
|
||||||
self.assertEqual(cm.filename, __file__)
|
|
||||||
self.assertEqual(cm.lineno, lineno + 4)
|
|
||||||
self.assertEqual(x, tsingular)
|
|
||||||
with self.assertWarns(DeprecationWarning) as cm:
|
|
||||||
x = ngettext(singular, plural, 1.1)
|
|
||||||
self.assertEqual(cm.filename, __file__)
|
|
||||||
self.assertEqual(cm.lineno, lineno + 9)
|
|
||||||
self.assertEqual(x, tplural)
|
|
||||||
with self.assertRaises(TypeError):
|
with self.assertRaises(TypeError):
|
||||||
ngettext(singular, plural, None)
|
ngettext(singular, plural, None)
|
||||||
else:
|
else:
|
||||||
x = ngettext(singular, plural, None)
|
with self.assertWarns(DeprecationWarning) as cm:
|
||||||
|
x = ngettext(singular, plural, None)
|
||||||
self.assertEqual(x, tplural)
|
self.assertEqual(x, tplural)
|
||||||
|
|
||||||
def test_plural_forms(self):
|
def test_plural_forms(self):
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Emit deprecation warning for non-integer numbers in :mod:`gettext` functions
|
||||||
|
and methods that consider plural forms even if the translation was not
|
||||||
|
found.
|
Loading…
Reference in New Issue