From 3143ceeb1deea9d5722f14ad4b62cf6ea26d983c Mon Sep 17 00:00:00 2001 From: Scott Noyes Date: Wed, 20 Aug 2025 12:55:50 -0400 Subject: [PATCH] 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. --- Lib/calendar.py | 2 +- Lib/test/test_calendar.py | 46 +++++++++++++++++++ ...-08-06-16-54-22.gh-issue-137481.eSTkK0.rst | 2 + 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-08-06-16-54-22.gh-issue-137481.eSTkK0.rst diff --git a/Lib/calendar.py b/Lib/calendar.py index fd6c561a9d39..678c7be5aac0 100644 --- a/Lib/calendar.py +++ b/Lib/calendar.py @@ -378,7 +378,7 @@ class TextCalendar(Calendar): """ 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 589a21baf7bd..410063e01582 100644 --- a/Lib/test/test_calendar.py +++ b/Lib/test/test_calendar.py @@ -696,6 +696,52 @@ class CalendarTestCase(unittest.TestCase): 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 000000000000..57d8d0521e39 --- /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. -- 2.47.3