]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-88434: Emit deprecation warnings for non-integer numbers in gettext if translation...
authorSerhiy Storchaka <storchaka@gmail.com>
Sat, 14 Oct 2023 06:07:02 +0000 (09:07 +0300)
committerGitHub <noreply@github.com>
Sat, 14 Oct 2023 06:07:02 +0000 (09:07 +0300)
Doc/whatsnew/3.13.rst
Lib/gettext.py
Lib/test/test_gettext.py
Misc/NEWS.d/next/Library/2023-10-08-18-38-09.gh-issue-88434.2Q_IkG.rst [new file with mode: 0644]

index eb49e015fd0dcc1f3ad29d6e87992ed95d1d78ec..f43ebc4bd5f95118f5f4bea5e26b2fd4e46585bd 100644 (file)
@@ -363,6 +363,10 @@ Deprecated
   It was not documented and only supported in the C implementation.
   (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
 ------------------------------
index e84765bfdf064981b9cd598af319ba8a55857c10..62cff81b7b3d496f798222ec1ca64cbb9c9a2273 100644 (file)
@@ -171,6 +171,13 @@ def _as_int(n):
     except TypeError:
         raise TypeError('Plural value must be an integer, got %s' %
                         (n.__class__.__name__,)) from None
+    return _as_int2(n)
+
+def _as_int2(n):
+    try:
+        return operator.index(n)
+    except TypeError:
+        pass
 
     import warnings
     frame = sys._getframe(1)
@@ -288,6 +295,7 @@ class NullTranslations:
     def ngettext(self, msgid1, msgid2, n):
         if self._fallback:
             return self._fallback.ngettext(msgid1, msgid2, n)
+        n = _as_int2(n)
         if n == 1:
             return msgid1
         else:
@@ -301,6 +309,7 @@ class NullTranslations:
     def npgettext(self, context, msgid1, msgid2, n):
         if self._fallback:
             return self._fallback.npgettext(context, msgid1, msgid2, n)
+        n = _as_int2(n)
         if n == 1:
             return msgid1
         else:
@@ -587,6 +596,7 @@ def dngettext(domain, msgid1, msgid2, n):
     try:
         t = translation(domain, _localedirs.get(domain, None))
     except OSError:
+        n = _as_int2(n)
         if n == 1:
             return msgid1
         else:
@@ -606,6 +616,7 @@ def dnpgettext(domain, context, msgid1, msgid2, n):
     try:
         t = translation(domain, _localedirs.get(domain, None))
     except OSError:
+        n = _as_int2(n)
         if n == 1:
             return msgid1
         else:
index dd33b9b88f6768771a7b3da9be056b137ed6911c..b2fe3e28c3bec7fa11e0404afc5980f0976f2b5b 100644 (file)
@@ -332,22 +332,24 @@ class PluralFormsTests:
         x = gettext(singular)
         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:
-            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):
                 ngettext(singular, plural, None)
         else:
-            x = ngettext(singular, plural, None)
+            with self.assertWarns(DeprecationWarning) as cm:
+                x = ngettext(singular, plural, None)
             self.assertEqual(x, tplural)
 
     def test_plural_forms(self):
diff --git a/Misc/NEWS.d/next/Library/2023-10-08-18-38-09.gh-issue-88434.2Q_IkG.rst b/Misc/NEWS.d/next/Library/2023-10-08-18-38-09.gh-issue-88434.2Q_IkG.rst
new file mode 100644 (file)
index 0000000..9722be2
--- /dev/null
@@ -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.