https://github.com/python/cpython/commit/3143ceeb1deea9d5722f14ad4b62cf6ea26d983c
commit: 3143ceeb1deea9d5722f14ad4b62cf6ea26d983c
branch: main
author: Scott Noyes <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2025-08-20T19:55:50+03:00
summary:

gh-137481: Fix abbreviation of day names in TextCalendar (GH-137482)

Use the length of the longest day name in the current locale, rather
than a constant 9, to decide if the names should be abbreviated.

files:
A Misc/NEWS.d/next/Library/2025-08-06-16-54-22.gh-issue-137481.eSTkK0.rst
M Lib/calendar.py
M Lib/test/test_calendar.py

diff --git a/Lib/calendar.py b/Lib/calendar.py
index fd6c561a9d39b8..678c7be5aac094 100644
--- a/Lib/calendar.py
+++ b/Lib/calendar.py
@@ -378,7 +378,7 @@ def formatweekday(self, day, width):
         """
         Returns a formatted week day name.
         """
-        if width >= 9:
+        if width >= max(map(len, day_name)):
             names = day_name
         else:
             names = day_abbr
diff --git a/Lib/test/test_calendar.py b/Lib/test/test_calendar.py
index 589a21baf7bd61..410063e01582f9 100644
--- a/Lib/test/test_calendar.py
+++ b/Lib/test/test_calendar.py
@@ -696,6 +696,52 @@ def test_locale_calendar_formatweekday(self):
         except locale.Error:
             raise unittest.SkipTest('cannot set the en_US locale')
 
+    # These locales have weekday names all shorter than English's longest
+    # 'Wednesday'. They should not be abbreviated unnecessarily
+    @support.run_with_locales("LC_ALL",
+            'Chinese', 'zh_CN.UTF-8',
+            'French', 'fr_FR.UTF-8',
+            'Norwegian', 'nb_NO.UTF-8',
+            'Malay', 'ms_MY.UTF8'
+    )
+    def test_locale_calendar_short_weekday_names(self):
+        names = (datetime.date(2001, 1, i+1).strftime('%A') for i in range(7))
+        max_length = max(map(len, names))
+        if max_length >= 9:
+            self.skipTest('weekday names are too long')
+
+        def get_weekday_names(width):
+            return calendar.TextCalendar().formatweekheader(width).split()
+
+        # Weekday names should not be abbreviated if the width is sufficient
+        self.assertEqual(
+            get_weekday_names(max_length),
+            get_weekday_names(max_length + 10)
+        )
+
+        # Any width shorter than necessary should produce abbreviations
+        self.assertNotEqual(
+            get_weekday_names(max_length),
+            get_weekday_names(max_length - 1)
+        )
+
+    # These locales have a weekday name longer than 'Wednesday'
+    # They should be properly abbreviated rather than truncated
+    @support.run_with_locales("LC_ALL",
+            'Portuguese', 'pt_PT.UTF-8',
+            'German',  'de_DE.UTF-8',
+            'Russian', 'ru_RU.UTF-8',
+    )
+    def test_locale_calendar_long_weekday_names(self):
+        names = (datetime.date(2001, 1, i+1).strftime('%A') for i in range(7))
+        max_length = max(map(len, names))
+        if max_length <= 9:
+            self.skipTest('weekday names are too short')
+
+        def get_weekday_names(width):
+            return calendar.TextCalendar().formatweekheader(width).split()
+        self.assertEqual(get_weekday_names(4), get_weekday_names(9))
+
     def test_locale_calendar_formatmonthname(self):
         try:
             # formatmonthname uses the same month names regardless of the 
width argument.
diff --git 
a/Misc/NEWS.d/next/Library/2025-08-06-16-54-22.gh-issue-137481.eSTkK0.rst 
b/Misc/NEWS.d/next/Library/2025-08-06-16-54-22.gh-issue-137481.eSTkK0.rst
new file mode 100644
index 00000000000000..57d8d0521e39aa
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-08-06-16-54-22.gh-issue-137481.eSTkK0.rst
@@ -0,0 +1,2 @@
+Calendar uses the lengths of the locale's weekdays to decide if the width
+requires abbreviation.

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to