]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-46659: Enhance LocaleTextCalendar for C locale (GH-31214)
authorVictor Stinner <vstinner@python.org>
Thu, 24 Feb 2022 13:29:08 +0000 (14:29 +0100)
committerGitHub <noreply@github.com>
Thu, 24 Feb 2022 13:29:08 +0000 (14:29 +0100)
If the LC_TIME locale is "C", use the user preferred locale.

Doc/library/calendar.rst
Lib/calendar.py

index 86f5b142a6c349af55ce3d6a0cf1b997b9c5cc4b..66f59f0e2ced27515193bc6231467b7ce527145c 100644 (file)
@@ -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.
index 361898dc8161edb165a62014a83675eff7de9594..657396439c91fcbb1b9b54cc744706a464a10169 100644 (file)
@@ -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):