【问题标题】:Setting Python locale doesn't work设置 Python 语言环境不起作用
【发布时间】:2016-04-08 12:07:33
【问题描述】:

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

我已经尝试过本主题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 个选项。第一个返回一个奇怪的结果:

~/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'

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


编辑2:

是的,在 Python 中调用 locale.setlocale() 不会影响未来的 Python 进程。改为配置环境变量,请参阅如何在 Ubuntu 中设置所有区域设置。

好的!所以这就是为什么它没有工作。我假设我已经为 Python 中的任何未来使用设置了语言环境,例如环境变量,但仅适用于 Python。

我有一个创建文件的 bash 脚本,这个 Python 脚本应该在一段时间后删除它(学习编码,当我编写 Bash 脚本时不知道 Python)。 Bash 的“日期”方法似乎以某种方式获取了语言环境。我会继续看看我可以为 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=

【问题讨论】:

  • 这很奇怪 - 你运行的是什么版本的 Python (python -V)?您的环境设置了什么(通过env 命令)?
  • python3 -V 返回Python 3.4.3+。使用env 返回LANGUAGE=nl:en
  • 您可能想做sudo dpkg-reconfigure locales 并重新生成您的语言环境。即使您更改了语言环境,我仍然无法重现您在工作日中使用英语的特定问题。
  • 什么是locale.getlocale(locale.LC_TIME)?
  • 尝试将您的问题限制在一个问题上(您的代码中可能存在多个问题,但如果每个单独的问题都在单独的问题中处理,这对未来的读者更有用)。既然您了解locale.setlocale() 不会影响系统上的其他进程,那么您当前的问题是什么?你明白需要call setlocale() to use non-C locale in the current process吗?

标签: python datetime locale


【解决方案1】:

似乎什么都没有保存。假设您设置了一次区域设置然后系统会记住这一点,我错了吗

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

Bash 的“日期”方法似乎以某种方式获取了语言环境。

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'

【讨论】:

    猜你喜欢
    • 2012-01-18
    • 2013-01-10
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2014-01-17
    相关资源
    最近更新 更多