在Windows上设置Python语言环境的正确方法是什么?


80

我试图以一种可识别语言环境的方式对字符串列表进行排序。我已经将Babel库用于其他与i18n相关的任务,但是它不支持排序。Python的locale模块提供了一种strcoll功能,但是需要将进程的语言环境设置为我要使用的语言环境。有点痛苦,但我可以忍受。

问题是我似乎无法实际设置语言环境。该文件locale模块给出了这样的例子:

import locale
locale.setlocale(locale.LC_ALL, 'de_DE')

当我运行它时,我得到了:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python26\Lib\locale.py", line 494, in setlocale
locale.Error: unsupported locale setting

我究竟做错了什么?

Answers:


109

看来您使用的是Windows。那里的区域设置字符串不同。仔细看一下文档:

locale.setlocale(locale.LC_ALL, 'de_DE') # use German locale; name might vary with platform

在Windows上,我认为应该是这样的:

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

MSDN包含语言字符串国家(地区)字符串的列表


5
FWIW,我有问题下Ubuntu 13.04Linux 3.8.0-19与蟒蛇2.7.4试图设置语言环境时fr_FR。设置它fr_FR.UTF-8为我工作。
Zoneur 2013年

对于Windows 7的Conda 4.4.11中的Python 3.6.3,语言环境字符串似乎与其他OS相同。
srodriguex


2
链接的文档似乎对于我不得不使用的WServer2018R2来说太新了'eng_usa''en_US'不起作用)
Boop

17

这是使用它的唯一正确方法,并提供了德语语言环境的示例:

import locale

locale.setlocale(category=locale.LC_ALL,
                 locale="German"  # Note: do not use "de_DE" as it doesn't work)

1
这是实际回答问题的唯一答案。
ImportanceOfBeingErnest

这对我有所帮助,但是我不得不更改GermanPortuguese_Brazil.1252。您知道列出这些值的文档吗?
Henrique Brisola

14

您不应将显式语言环境传递给setlocale,这是错误的。让它从环境中找出来。您必须将一个空字符串传递给它

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

10
我没有在问题中提到这一点,因为它没有直接关系,但是我当时编写的代码是为在Web服务器上使用而设计的。换句话说,语言环境可能会随每个请求而变化,并且不一定与环境的语言环境相同。
DNS

2
DNS:您阅读过语言环境文档吗?这意味着将setlocale称为“ much”可能很危险,并且它不是线程安全的。因此,也许除了setlocale之外还有其他解决方案。例如,Gettext可以加载不同的目录并在运行时进行切换。但我不知道您使用的语言环境是什么。
u0b34a0f6ae 2009年

除非您的用户不在您的本地计算机上
Gabriel

8

的Ubuntu

在Ubuntu上,您可能会遇到此问题,因为您的系统上没有安装该本地程序。

从外壳尝试:

$> locale -a

并检查是否找到您感兴趣的语言环境。否则,您必须安装它:

$> sudo apt-get install language-pack-XXX

其中XXX是您的语言(在我的情况下为“ xxx = it”,意大利语语言环境),然后运行dpkg-reconfigure

$> sudo dpkg-reconfigure locales

之后,在您的python shell中再试一次:

>>> import locale
>>> locale.setlocale(locale.LC_ALL,'it_IT.UTF-8')

(这是针对意大利语言环境的,这是我所需要的)


13
这个问题专门询问Windows
Christoph

7

我知道这是几年前问过的,但是我想我会尝试在Windows上使用Python 3.6添加发现的内容:

import locale
for x in locale.windows_locale.values():
    print(x.replace('_','-'))

我尝试了一些,这似乎也是找出Windows上可用功能的一种方法。

提提您:由于某些原因,这与当前稳定版本的Python的strptime()不兼容

然后您只需设置语言环境:

locale.setlocale(locale.LC_ALL, any_item_of_the_printed_strings)


4

从locale.setlocale文档:

locale.setlocale(category, locale=None):
    """
    Set the locale for the given category.  The locale can be
    a string, an iterable of two strings (language code and encoding),
    or None.
    """"

在Linux(尤其是Ubuntu)下,您可以使用

locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')

要么

locale.setlocale(locale.LC_ALL, ('de', 'utf-8'))

如果系统上未安装语言环境,则会出现相同的错误。因此,请确保您在系统上安装了语言环境:

$ locale -a # to list the currently installed locales
$ (sudo) locale-gen de_DE.UTF-8 # to install new locale
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.