Python语言环境错误:不支持的语言环境设置
为什么在python中这样做会导致下面的错误:
>>> import locale >>> print str( locale.getlocale() ) (None, None) >>> locale.setlocale(locale.LC_ALL, 'de_DE') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.7/locale.py", line 531, in setlocale return _setlocale(category, locale) locale.Error: unsupported locale setting
这也适用于其他语言环境如fr或nl。 我使用Ubuntu 11.04。
更新:做以下没有产生任何东西:
dpkg-reconfigure locales perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = (unset), LC_CTYPE = "UTF-8", LANG = (unset) are supported and installed on your system. perl: warning: Falling back to the standard locale ("C"). locale: Cannot set LC_CTYPE to default locale: No such file or directory locale: Cannot set LC_ALL to default locale: No such file or directory
运行以下命令
export LC_ALL="en_US.UTF-8" export LC_CTYPE="en_US.UTF-8" sudo dpkg-reconfigure locales
这将解决这个问题。 (我无法解决与其他解决scheme的问题,这对我来说很有用)
您可能没有任何可用的de_DE
语言环境。
您可以使用locale -a
命令查看可用语言环境的列表。 例如,在我的机器上:
$ locale -a C C.UTF-8 en_AG en_AG.utf8 en_AU.utf8 en_BW.utf8 en_CA.utf8 en_DK.utf8 en_GB.utf8 en_HK.utf8 en_IE.utf8 en_IN en_IN.utf8 en_NG en_NG.utf8 en_NZ.utf8 en_PH.utf8 en_SG.utf8 en_US.utf8 en_ZA.utf8 en_ZM en_ZM.utf8 en_ZW.utf8 it_CH.utf8 it_IT.utf8 POSIX
请注意,如果要将语言环境设置为it_IT
还必须指定.utf8
:
>>> import locale >>> locale.setlocale(locale.LC_ALL, 'it_IT') # error! Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.7/locale.py", line 539, in setlocale return _setlocale(category, locale) locale.Error: unsupported locale setting >>> locale.setlocale(locale.LC_ALL, 'it_IT.utf8') 'it_IT.utf8'
要安装新的语言环境,请使用:
sudo apt-get install language-pack-id
其中id
是语言代码(取自这里 )
安装完语言环境之后,您应该遵循Julien Palard的build议,并重新configuration语言环境:
sudo dpkg-reconfigure locales
由于这个链接 ,它通过input这个命令来解决:
导出LC_ALL = C
更长久的解决scheme是填充缺less的值,在命令: locale
显示的输出中
locale
输出是:
$ locale LANG=en_US.utf8 LANGUAGE= LC_CTYPE="en_US.utf8" LC_NUMERIC=es_ES.utf8 LC_TIME=es_ES.utf8 LC_COLLATE="en_US.utf8" LC_MONETARY=es_ES.utf8 LC_MESSAGES="en_US.utf8" LC_PAPER=es_ES.utf8 LC_NAME="en_US.utf8" LC_ADDRESS="en_US.utf8" LC_TELEPHONE="en_US.utf8" LC_MEASUREMENT=es_ES.utf8 LC_IDENTIFICATION="en_US.utf8" LC_ALL=
填写缺失值编辑〜/ .bashrc:
$ vim ~/.bashrc
在上面的命令后添加下面几行(假设你想让en_US.UTF-8成为你的语言):
export LANGUAGE="en_US.UTF-8" export LC_ALL="en_US.UTF-8"
如果这个文件是ReadOnly,你将需要按照GeekyBoy提到的步骤。 Beco博士在超级用户给出的答案中有关于保存只读文件的详细信息。
保存文件后做:
$ source ~/.bashrc
现在你不会再面临同样的问题了。
上面的答案之一提供了解决scheme:
export LC_ALL="en_US.UTF-8" export LC_CTYPE="en_US.UTF-8" sudo dpkg-reconfigure locales
上面的解决scheme的问题是它必须在Linuxshell上完成。 但是,如果您提供的代码在客户机上工作,那么这是一个糟糕的做法。 我也尝试使用os.system()执行上述命令,但仍然无法正常工作。
解决scheme,为我工作是
locale.setlocale(locale.LC_ALL,'en_US.UTF-8')
如果您在Debian(或Debian分支)上,则可以使用以下方法添加区域设置:
dpkg-reconfigure locales
在Arch Linux上,我可以通过运行sudo locale-gen
来解决这个问题
为了logging,我有同样的问题,但没有解决scheme的工作。 我升级了我的电脑并迁移了我的电脑。 我有一个混合的语言环境英语和西class牙语:
$ locale LANG=en_US.utf8 LANGUAGE= LC_CTYPE="en_US.utf8" LC_NUMERIC=es_ES.utf8 LC_TIME=es_ES.utf8 LC_COLLATE="en_US.utf8" LC_MONETARY=es_ES.utf8 LC_MESSAGES="en_US.utf8" LC_PAPER=es_ES.utf8 LC_NAME="en_US.utf8" LC_ADDRESS="en_US.utf8" LC_TELEPHONE="en_US.utf8" LC_MEASUREMENT=es_ES.utf8 LC_IDENTIFICATION="en_US.utf8" LC_ALL=
但是,在我的新的Debian安装,我只是select英语作为语言环境。 最后的工作是重新configurationlocales包来添加和生成西class牙语。
$ grep -v "#" /etc/locale.gen en_US.UTF-8 UTF-8 es_ES.UTF-8 UTF-8
- 运行此命令
locale
以获取使用的语言环境。 如:
LANG =的en_US.UTF-8
LANGUAGE = EN_US:恩
LC_CTYPE = zh_CN.UTF-8
LC_NUMERIC = “的en_US.UTF-8”
LC_TIME = “的en_US.UTF-8”
LC_COLLATE = “的en_US.UTF-8”
LC_MONETARY = “的en_US.UTF-8”
LC_MESSAGES = “的en_US.UTF-8”
LC_PAPER = “的en_US.UTF-8”
LC_NAME = “的en_US.UTF-8”
LC_ADDRESS = “的en_US.UTF-8”
LC_TELEPHONE = “的en_US.UTF-8”
LC_MEASUREMENT = “的en_US.UTF-8”
LC_IDENTIFICATION = “的en_US.UTF-8”
LC_ALL =
- 在
/etc/locale-gen
文件的第一步中search列出的语言环境列表。 取消对使用的评论 - 运行
locale-gen
生成新添加的语言环境
如果您刚刚添加了新的区域设置,则会发生此错误。 您需要重新启动python交互式shell( quit(
)和python
)才能访问它。
在试图让python 吐出特定语言环境中的名字时,我在这里login了同样的问题。
在追求答案时,我发现事情有点神秘。
我发现,Python代码。
import locale print locale.getdefaultlocale() >> ('en_DK', 'UTF-8')
确实locale.setlocale(locale.LC_TIME, 'en_DK.UTF-8')
作品
在这里使用技巧,我进一步testing,看看什么是可用的Python代码
import locale loc_list = [(a,b) for a,b in locale.locale_alias.items() ] loc_size = len(loc_list) print loc_size,'entries' for loc in loc_list: try: locale.setlocale(locale.LC_TIME, loc[1]) print 'SUCCES set {:12} ({})'.format(loc[1],loc[0]) except: pass
这产生了
858 entries SUCCES set en_US.UTF-8 (univ) SUCCES set C (c.ascii) SUCCES set C (c.en) SUCCES set C (posix-utf2) SUCCES set C (c) SUCCES set C (c_c) SUCCES set C (c_c.c) SUCCES set en_IE.UTF-8 (en_ie.utf8@euro) SUCCES set en_US.UTF-8 (universal.utf8@ucs4) SUCCES set C (posix) SUCCES set C (english_united-states.437) SUCCES set en_US.UTF-8 (universal)
其中只有以上是工作! 但是en_DK.UTF-8
不在这个列表中,尽pipe它起作用了! 什么?? 而蟒生成的区域列表确实包含大量的组合,我正在寻找的DA和DK,但又没有UTF-8的DA / DK …
我在一个Linux的发行版(基于Debian的),这里的locale
说,除了其他LC_TIME="en_DK.UTF-8"
,这是我知道的作品,但不是我需要的语言环境。
locale -a
说
C C.UTF-8 en_DK.utf8 en_US.utf8 POSIX
所以肯定需要安装其他语言环境 ,我通过编辑/etc/locale.gen
,取消注释所需的行da_DK.UTF-8 UTF-8
并运行命令locale-gen
现在locale.setlocale(locale.LC_TIME, 'da_DK.UTF-8')
也可以工作,我可以得到我的本地化date和月份名称。
我的意见:
Python:locale.locale_alias在find可用的语言环境方面并不是很有用!
Linux:获取本地化列表并安装新的区域设置非常简单。 有很多的帮助可用。
Windows:我一直在调查一下,但没有结论。 虽然有post可以find答案,但是我并没有感受到追求它的冲动。
在我看来,在python {,3}中设置本地语言环境的最简单的方法是:
>>> import locale >>> locale.setlocale(locale.LC_ALL, '') 'de_DE.UTF-8'
然后,如果你在一个体面的Linux发行版,并且应该在其他操作系统的二进制发行版上工作(或者这是一个错误,恕我直言),locale意识到的东西就可以工作。
>>> import datetime as dt >>> print(dt.date.today().strftime("%A %d. %B %Y")) Sonntag 11. Dezember 2016