设置 Python 语言环境无效

Setting Python locale doesn't work

所以我一直在尝试设置 Python 语言环境。我想这样做是因为我想使用本地语言的工作日名称(使用 strftime('%A'))。但是目前工作日是用英文打印的,尽管我尝试了几种设置语言环境的方法。我 运行 在 RPi2 上与 Ubuntu Mate 一起使用。

我已经尝试过本主题中的解决方案What is the correct way to set Python's locale on Windows?

我尝试将语言环境明确设置为 nl_NL.utf8:

$> locale -a
$> python3
>>> import locale
>>> locale.setlocale(locale.LC_ALL,'nl_NL.utf-8')

我也试过设置一个空字符串,这是最后一个答案中的建议:

>>> locale.setlocale(locale.LC_ALL, '')

在我尝试的两种情况下

>>> locale.getlocale()

我明白了nl_NL.utf8

但我仍然得到英文的工作日!除了上述主题外,在 internetz 上找不到太多关于此的信息,我无法解决此问题。


编辑:

我已经尝试了所有 3 个选项。第一个 return 是一个奇怪的结果:

~/Documenten$ python3
Python 3.4.3+ (default, Oct 14 2015, 16:03:50) 
[GCC 5.2.1 20151010] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getlocale(locale.LC_TIME)
(None, None)
>>> locale.setlocale(locale.LC_TIME, 'nl_NL.utf-8')
'nl_NL.utf-8'
>>> locale.getlocale(locale.LC_TIME)
('nl_NL', 'UTF-8')
>>> exit()
jeffrey@jeffrey-desktop:~/Documenten$ python3
Python 3.4.3+ (default, Oct 14 2015, 16:03:50) 
[GCC 5.2.1 20151010] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getlocale(locale.LC_TIME)
(None, None)

好像什么都没有保存。假设您设置一次语言环境然后系统会记住它,我错了吗?第二个选项:

~/Documenten$ python3
Python 3.4.3+ (default, Oct 14 2015, 16:03:50) 
[GCC 5.2.1 20151010] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import calendar
>>> calendar.day_name[2]
'Wednesday'
>>> import locale
>>> locale.nl_langinfo(locale.DAY_2)
'Monday'

即使我试图获得一个荷兰语工作日名称,我仍然在 return 中得到一个英文名称。除此之外,此方法从星期日而不是星期一开始计数。我做错了什么吗?第三个建议让我得到了我的工作日名称,谢谢!但我仍然想知道为什么第一个不起作用?我在自己的设备上使用此脚本,并希望使用正确的全局语言环境。


编辑2:

yes, calling locale.setlocale() in Python does not affect future python processes. Configure environment variables instead, see How to set all locale settings in Ubuntu.

好的!所以这就是它不起作用的原因。我假设我已经为 Python 中的任何未来使用设置了语言环境,就像环境变量一样,但仅适用于 Python.

我有一个 bash 创建文件的脚本,这个 Python 脚本应该在一段时间后删除它(学习编码,我写 [= 时不知道 Python 61=] 脚本)。 Bash 的 "date" 方法似乎以某种方式获取语言环境。我会继续看看我可以为 Python 修复什么。这是我在键入 $ locale:

时看到的内容
LANG=nl_NL.UTF-8
LANGUAGE=nl:en
LC_CTYPE="nl_NL.UTF-8"
LC_NUMERIC="nl_NL.UTF-8"
LC_TIME="nl_NL.UTF-8"
LC_COLLATE="nl_NL.UTF-8"
LC_MONETARY="nl_NL.UTF-8"
LC_MESSAGES="nl_NL.UTF-8"
LC_PAPER="nl_NL.UTF-8"
LC_NAME="nl_NL.UTF-8"
LC_ADDRESS="nl_NL.UTF-8"
LC_TELEPHONE="nl_NL.UTF-8"
LC_MEASUREMENT="nl_NL.UTF-8"
LC_IDENTIFICATION="nl_NL.UTF-8"
LC_ALL=

It seems like nothing is saved. Am I wrong in assuming you set your locale once and then the system will remember this

是的,在 Python 中调用 locale.setlocale() 不会影响以后的 python 进程。请改为配置环境变量,请参阅 How to set all locale settings in Ubuntu

Bash's "date" method seems to pick up the locale some way or the other.

date 在开始时调用 setlocale(LC_ALL, "") 即,您需要 call setlocale() at least once per process to enable $LANG locale instead of C locale.


setlocale(LC_ALL, '') 首先根据 $LANG 变量设置语言环境,而不是 $LANGUAGE (它是相关但不同的:"The GNU gettext search path contains 'LC_ALL', 'LC_CTYPE', 'LANG' and 'LANGUAGE', in that order.")。

设置LC_TIME类别就足够了(在Ubuntu上):

>>> import locale
>>> import time
>>> time.strftime('%A')
'Tuesday'
>>> locale.getlocale(locale.LC_TIME)
('en_US', 'UTF-8')
>>> locale.setlocale(locale.LC_TIME, 'ru_RU.UTF-8')
'ru_RU.UTF-8'
>>> time.strftime('%A')
'Вторник'
>>> locale.getlocale(locale.LC_TIME)
('ru_RU', 'UTF-8')

如果setlocale()没有引发locale.Error: unsupported locale setting那么相应的语言环境类别设置成功。

您还可以在知道其位置的情况下获取工作日名称(在更改语言环境的同一 python 会话中):

>>> import calendar
>>> calendar.day_name[1]
'Вторник'
>>> locale.nl_langinfo(locale.DAY_3)
'Вторник'

在不修改全局状态的情况下在给定语言环境中打印工作日的可移植方法是 use babel module:

>>> from datetime import date
>>> from babel.dates import format_date # $ pip install babel
>>> format_date(date.today(), format='EEEE', locale='en')
'Tuesday'
>>> format_date(date.today(), format='EEEE', locale='ru')
'вторник'
>>> format_date(date.today(), format='EEEE', locale='nl')
'dinsdag'