diff options
author | Victor Stinner <vstinner@python.org> | 2022-02-24 13:29:08 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-24 13:29:08 (GMT) |
commit | 4fccf910738d1442852cb900747e6dccb8fe03ef (patch) | |
tree | 55d6f9d4fc4f1960cba7daa3d27a77af0c5200eb | |
parent | ae3adbeaedb0536292f4542a0d42063410ae150f (diff) | |
download | cpython-4fccf910738d1442852cb900747e6dccb8fe03ef.zip cpython-4fccf910738d1442852cb900747e6dccb8fe03ef.tar.gz cpython-4fccf910738d1442852cb900747e6dccb8fe03ef.tar.bz2 |
bpo-46659: Enhance LocaleTextCalendar for C locale (GH-31214)
If the LC_TIME locale is "C", use the user preferred locale.
-rw-r--r-- | Doc/library/calendar.rst | 7 | ||||
-rw-r--r-- | Lib/calendar.py | 19 |
2 files changed, 20 insertions, 6 deletions
diff --git a/Doc/library/calendar.rst b/Doc/library/calendar.rst index 86f5b14..66f59f0 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 361898d..6573964 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): |