From 863b13223efefcaf89b2ae301658c8949edd8547 Mon Sep 17 00:00:00 2001 From: VenishPaneliya <141703684+VenishPaneliya@users.noreply.github.com> Date: Tue, 25 Aug 2026 15:27:00 +0530 Subject: [PATCH] Remove the leftover format placeholder from intword units MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `intword` inserts the unit without any `%` substitution: return f"{negative_prefix}{number} {unit}" so a placeholder left in a translated unit is printed literally. The Bengali, Korean and Vietnamese catalogues still carry `%d` or `%(value)s` on the `thousand`..`googol` units, presumably from an older API: activate("bn_BD"); intword(1_500_000_000) -> '1.5 %d বিলিয়ন' activate("vi_VN"); intword(1_200_000) -> '1.2 %(value)s triệu' Strip the placeholder and the separator after it, leaving the translated words untouched. Only the `intword` power units are changed; placeholders in other messages are substituted normally and are left alone. After this, none of the 36 catalogues emits a placeholder for any of the 12 powers. --- .../locale/bn_BD/LC_MESSAGES/humanize.po | 36 ++++++++--------- .../locale/ko_KR/LC_MESSAGES/humanize.po | 40 +++++++++---------- .../locale/vi_VN/LC_MESSAGES/humanize.po | 40 +++++++++---------- tests/test_i18n.py | 11 +++++ 4 files changed, 69 insertions(+), 58 deletions(-) diff --git a/src/humanize/locale/bn_BD/LC_MESSAGES/humanize.po b/src/humanize/locale/bn_BD/LC_MESSAGES/humanize.po index 71bb5117..25b4684f 100644 --- a/src/humanize/locale/bn_BD/LC_MESSAGES/humanize.po +++ b/src/humanize/locale/bn_BD/LC_MESSAGES/humanize.po @@ -121,57 +121,57 @@ msgstr "তম" #: src/humanize/number.py:178 msgid "thousand" msgid_plural "thousand" -msgstr[0] "%d হাজার" -msgstr[1] "%d হাজার" +msgstr[0] "হাজার" +msgstr[1] "হাজার" #: src/humanize/number.py:179 #, fuzzy msgid "million" msgid_plural "million" -msgstr[0] "%d মিলিয়ন" -msgstr[1] "%d মিলিয়ন" +msgstr[0] "মিলিয়ন" +msgstr[1] "মিলিয়ন" #: src/humanize/number.py:180 msgid "billion" msgid_plural "billion" -msgstr[0] "%d বিলিয়ন" -msgstr[1] "%d বিলিয়ন" +msgstr[0] "বিলিয়ন" +msgstr[1] "বিলিয়ন" #: src/humanize/number.py:181 msgid "trillion" msgid_plural "trillion" -msgstr[0] "%d ট্রিলিয়ন" -msgstr[1] "%d ট্রিলিয়ন" +msgstr[0] "ট্রিলিয়ন" +msgstr[1] "ট্রিলিয়ন" #: src/humanize/number.py:182 msgid "quadrillion" msgid_plural "quadrillion" -msgstr[0] "%d কোয়াড্রিলিয়ন" -msgstr[1] "%d কোয়াড্রিলিয়ন" +msgstr[0] "কোয়াড্রিলিয়ন" +msgstr[1] "কোয়াড্রিলিয়ন" #: src/humanize/number.py:183 msgid "quintillion" msgid_plural "quintillion" -msgstr[0] "%d কুইন্টিলিয়ন" -msgstr[1] "%d কুইন্টিলিয়ন" +msgstr[0] "কুইন্টিলিয়ন" +msgstr[1] "কুইন্টিলিয়ন" #: src/humanize/number.py:184 msgid "sextillion" msgid_plural "sextillion" -msgstr[0] "%d সেক্সটিলিয়ন" -msgstr[1] "%d সেক্সটিলিয়ন" +msgstr[0] "সেক্সটিলিয়ন" +msgstr[1] "সেক্সটিলিয়ন" #: src/humanize/number.py:185 msgid "septillion" msgid_plural "septillion" -msgstr[0] "%d সেপটিলিয়ন" -msgstr[1] "%d সেপটিলিয়ন" +msgstr[0] "সেপটিলিয়ন" +msgstr[1] "সেপটিলিয়ন" #: src/humanize/number.py:186 msgid "octillion" msgid_plural "octillion" -msgstr[0] "%d ওকটিলিয়ন" -msgstr[1] "%d ওকটিলিয়ন" +msgstr[0] "ওকটিলিয়ন" +msgstr[1] "ওকটিলিয়ন" #: src/humanize/number.py:187 msgid "nonillion" diff --git a/src/humanize/locale/ko_KR/LC_MESSAGES/humanize.po b/src/humanize/locale/ko_KR/LC_MESSAGES/humanize.po index 0b6fd946..dc320680 100644 --- a/src/humanize/locale/ko_KR/LC_MESSAGES/humanize.po +++ b/src/humanize/locale/ko_KR/LC_MESSAGES/humanize.po @@ -148,8 +148,8 @@ msgstr[1] "" #: src/humanize/number.py:179 msgid "million" msgid_plural "million" -msgstr[0] "%(value)s million" -msgstr[1] "%(value)s million" +msgstr[0] "million" +msgstr[1] "million" #: src/humanize/number.py:180 msgid "billion" @@ -161,64 +161,64 @@ msgstr[1] "milliard" #, fuzzy msgid "trillion" msgid_plural "trillion" -msgstr[0] "%(value)s billion" -msgstr[1] "%(value)s billion" +msgstr[0] "billion" +msgstr[1] "billion" #: src/humanize/number.py:182 #, fuzzy msgid "quadrillion" msgid_plural "quadrillion" -msgstr[0] "%(value)s quadrillion" -msgstr[1] "%(value)s quadrillion" +msgstr[0] "quadrillion" +msgstr[1] "quadrillion" #: src/humanize/number.py:183 #, fuzzy msgid "quintillion" msgid_plural "quintillion" -msgstr[0] "%(value)s quintillion" -msgstr[1] "%(value)s quintillion" +msgstr[0] "quintillion" +msgstr[1] "quintillion" #: src/humanize/number.py:184 #, fuzzy msgid "sextillion" msgid_plural "sextillion" -msgstr[0] "%(value)s sextillion" -msgstr[1] "%(value)s sextillion" +msgstr[0] "sextillion" +msgstr[1] "sextillion" #: src/humanize/number.py:185 #, fuzzy msgid "septillion" msgid_plural "septillion" -msgstr[0] "%(value)s septillion" -msgstr[1] "%(value)s septillion" +msgstr[0] "septillion" +msgstr[1] "septillion" #: src/humanize/number.py:186 #, fuzzy msgid "octillion" msgid_plural "octillion" -msgstr[0] "%(value)s octillion" -msgstr[1] "%(value)s octillion" +msgstr[0] "octillion" +msgstr[1] "octillion" #: src/humanize/number.py:187 #, fuzzy msgid "nonillion" msgid_plural "nonillion" -msgstr[0] "%(value)s nonillion" -msgstr[1] "%(value)s nonillion" +msgstr[0] "nonillion" +msgstr[1] "nonillion" #: src/humanize/number.py:188 #, fuzzy msgid "decillion" msgid_plural "decillion" -msgstr[0] "%(value)s décillion" -msgstr[1] "%(value)s décillion" +msgstr[0] "décillion" +msgstr[1] "décillion" #: src/humanize/number.py:189 #, fuzzy msgid "googol" msgid_plural "googol" -msgstr[0] "%(value)s gogol" -msgstr[1] "%(value)s gogol" +msgstr[0] "gogol" +msgstr[1] "gogol" #: src/humanize/number.py:301 msgid "zero" diff --git a/src/humanize/locale/vi_VN/LC_MESSAGES/humanize.po b/src/humanize/locale/vi_VN/LC_MESSAGES/humanize.po index 08b0640d..ded2ede1 100644 --- a/src/humanize/locale/vi_VN/LC_MESSAGES/humanize.po +++ b/src/humanize/locale/vi_VN/LC_MESSAGES/humanize.po @@ -128,8 +128,8 @@ msgstr[1] "nghìn" #: src/humanize/number.py:179 msgid "million" msgid_plural "million" -msgstr[0] "%(value)s triệu" -msgstr[1] "%(value)s triệu" +msgstr[0] "triệu" +msgstr[1] "triệu" #: src/humanize/number.py:180 msgid "billion" @@ -140,63 +140,63 @@ msgstr[1] "tỷ" #: src/humanize/number.py:181 msgid "trillion" msgid_plural "trillion" -msgstr[0] "%(value)s nghìn tỷ" -msgstr[1] "%(value)s nghìn tỷ" +msgstr[0] "nghìn tỷ" +msgstr[1] "nghìn tỷ" #: src/humanize/number.py:182 msgid "quadrillion" msgid_plural "quadrillion" -msgstr[0] "%(value)s triệu tỷ" -msgstr[1] "%(value)s triệu tỷ" +msgstr[0] "triệu tỷ" +msgstr[1] "triệu tỷ" #: src/humanize/number.py:183 #, fuzzy msgid "quintillion" msgid_plural "quintillion" -msgstr[0] "%(value)s tỷ tỷ" -msgstr[1] "%(value)s tỷ tỷ" +msgstr[0] "tỷ tỷ" +msgstr[1] "tỷ tỷ" #: src/humanize/number.py:184 #, fuzzy msgid "sextillion" msgid_plural "sextillion" -msgstr[0] "%(value)s sextillion" -msgstr[1] "%(value)s sextillion" +msgstr[0] "sextillion" +msgstr[1] "sextillion" #: src/humanize/number.py:185 #, fuzzy msgid "septillion" msgid_plural "septillion" -msgstr[0] "%(value)s septillion" -msgstr[1] "%(value)s septillion" +msgstr[0] "septillion" +msgstr[1] "septillion" #: src/humanize/number.py:186 #, fuzzy msgid "octillion" msgid_plural "octillion" -msgstr[0] "%(value)s octillion" -msgstr[1] "%(value)s octillion" +msgstr[0] "octillion" +msgstr[1] "octillion" #: src/humanize/number.py:187 #, fuzzy msgid "nonillion" msgid_plural "nonillion" -msgstr[0] "%(value)s nonillion" -msgstr[1] "%(value)s nonillion" +msgstr[0] "nonillion" +msgstr[1] "nonillion" #: src/humanize/number.py:188 #, fuzzy msgid "decillion" msgid_plural "decillion" -msgstr[0] "%(value)s décillion" -msgstr[1] "%(value)s décillion" +msgstr[0] "décillion" +msgstr[1] "décillion" #: src/humanize/number.py:189 #, fuzzy msgid "googol" msgid_plural "googol" -msgstr[0] "%(value)s gogol" -msgstr[1] "%(value)s gogol" +msgstr[0] "gogol" +msgstr[1] "gogol" #: src/humanize/number.py:301 msgid "zero" diff --git a/tests/test_i18n.py b/tests/test_i18n.py index 6ea61a29..7b69d086 100644 --- a/tests/test_i18n.py +++ b/tests/test_i18n.py @@ -334,3 +334,14 @@ def test_none_locale(self) -> None: humanize.i18n.deactivate() assert test_str == humanize.naturaltime(three_seconds) + + +@pytest.mark.parametrize("locale", ["bn_BD", "ko_KR", "vi_VN"]) +def test_intword_unit_has_no_format_placeholder(locale: str) -> None: + """`intword` interpolates the unit verbatim, so it must carry no placeholder.""" + try: + humanize.i18n.activate(locale) + for value in (1_000, 1_000_000, 1_000_000_000, 10**12, 10**15, 10**100): + assert "%" not in humanize.intword(value) + finally: + humanize.i18n.deactivate()