From: Victor Stinner Date: Thu, 24 Feb 2022 13:29:08 +0000 (+0100) Subject: bpo-46659: Enhance LocaleTextCalendar for C locale (GH-31214) X-Git-Tag: v3.11.0a6~109 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4fccf910738d1442852cb900747e6dccb8fe03ef;p=thirdparty%2FPython%2Fcpython.git bpo-46659: Enhance LocaleTextCalendar for C locale (GH-31214) If the LC_TIME locale is "C", use the user preferred locale. --- diff --git a/Doc/library/calendar.rst b/Doc/library/calendar.rst index 86f5b142a6c3..66f59f0e2ced 100644 --- a/Doc/library/calendar.rst +++ b/Doc/library/calendar.rst @@ -289,9 +289,10 @@ interpreted as prescribed by the ISO 8601 standard. Year 0 is 1 BC, year -1 is .. note:: - The :meth:`formatweekday` and :meth:`formatmonthname` methods of these two - classes temporarily change the ``LC_TIME`` locale to the given *locale*. Because - the current locale is a process-wide setting, they are not thread-safe. + The constructor, :meth:`formatweekday` and :meth:`formatmonthname` methods + of these two classes temporarily change the ``LC_TIME`` locale to the given + *locale*. Because the current locale is a process-wide setting, they are + not thread-safe. For simple text calendars this module provides the following functions. diff --git a/Lib/calendar.py b/Lib/calendar.py index 361898dc8161..657396439c91 100644 --- a/Lib/calendar.py +++ b/Lib/calendar.py @@ -548,15 +548,28 @@ class HTMLCalendar(Calendar): class different_locale: def __init__(self, locale): self.locale = locale + self.oldlocale = None def __enter__(self): - self.oldlocale = _locale.getlocale(_locale.LC_TIME) + self.oldlocale = _locale.setlocale(_locale.LC_TIME, None) _locale.setlocale(_locale.LC_TIME, self.locale) def __exit__(self, *args): + if self.oldlocale is None: + return _locale.setlocale(_locale.LC_TIME, self.oldlocale) +def _get_default_locale(): + locale = _locale.setlocale(_locale.LC_TIME, None) + if locale == "C": + with different_locale(""): + # The LC_TIME locale does not seem to be configured: + # get the user preferred locale. + locale = _locale.setlocale(_locale.LC_TIME, None) + return locale + + class LocaleTextCalendar(TextCalendar): """ This class can be passed a locale name in the constructor and will return @@ -566,7 +579,7 @@ class LocaleTextCalendar(TextCalendar): def __init__(self, firstweekday=0, locale=None): TextCalendar.__init__(self, firstweekday) if locale is None: - locale = _locale.getlocale(_locale.LC_TIME) + locale = _get_default_locale() self.locale = locale def formatweekday(self, day, width): @@ -586,7 +599,7 @@ class LocaleHTMLCalendar(HTMLCalendar): def __init__(self, firstweekday=0, locale=None): HTMLCalendar.__init__(self, firstweekday) if locale is None: - locale = _locale.getlocale(_locale.LC_TIME) + locale = _get_default_locale() self.locale = locale def formatweekday(self, day):