matthjes
matthjes

Reputation: 729

Python does not use locale from environment

I have a python program (jrnl) that should print the day of the week as text in German. However, it always prints the English name.

Here is the output of locale:

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME=de_DE.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=

You can see that LC_TIME is set to de_DE.UTF-8. But when I start python this locale is not set:

>>> import locale
>>> locale.getlocale(locale.LC_TIME)
(None, None)

So my week day is shown in English:

>>> from time import gmtime, strftime
>>> strftime("%A, %d %b %Y %H:%M:%S +0000", gmtime())
'Monday, 15 Jan 2018 20:22:30 +0000'

What do I have to do for python to use the system locale?

Upvotes: 7

Views: 1768

Answers (1)

Martijn Pieters
Martijn Pieters

Reputation: 1121456

From the locale module background documentation:

Initially, when a program is started, the locale is the C locale, no matter what the user’s preferred locale is.

You need to explicitly set the locale using locale.setlocale(); use the empty string to indicate that the user configuration needs to be used:

locale.setlocale(locale.LC_TIME, '')

This is standard behaviour; the underlying C-level locale system explicitly starts in the C locale regardless of environment variables, as you can't assume that the current program actually wants or needs to honour user settings.

Upvotes: 10

Related Questions