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

DNS*_*DNS 76 python windows localization internationalization

我正在尝试以区域设置感知的方式对字符串列表进行排序.我已经将Babel库用于其他与i18n相关的任务,但它不支持排序.Python的locale模块提供了一个strcoll函数,但需要将进程的语言环境设置为我想要使用的语言环境.有点痛,但我可以忍受它.

问题是我似乎无法实际设置区域设置.该文件locale模块给出了这样的例子:

import locale
locale.setlocale(locale.LC_ALL, 'de_DE')
Run Code Online (Sandbox Code Playgroud)

当我运行时,我得到了这个:

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
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Sch*_*uki 104

看来你正在使用Windows.区域设置字符串在那里是不同的.更准确地看一下doc:

locale.setlocale(locale.LC_ALL, 'de_DE') # use German locale; name might vary with platform
Run Code Online (Sandbox Code Playgroud)

在Windows上,我认为它会是这样的:

locale.setlocale(locale.LC_ALL, 'deu_deu')
Run Code Online (Sandbox Code Playgroud)

MSDN具有语言字符串国家/地区字符串的列表

  • FWIW,当我试图将语言环境设置为`fr_FR`时,我在"Ubuntu 13.04","Linux 3.8.0-19"和python"2.7.4"下遇到了问题.将它设置为`fr_FR.UTF-8`对我有用. (4认同)
  • 该列表更全面:https://msdn.microsoft.com/zh-cn/library/cc233982.aspx (2认同)
  • 链接的文档对于 WServer2018R2 来说似乎太新了,我不得不使用 `'eng_usa'`(`'en_US'` 不起作用) (2认同)

u0b*_*6ae 13

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

import locale
locale.setlocale(locale.LC_ALL, '')
Run Code Online (Sandbox Code Playgroud)

  • 我没有在问题中提到这个,因为它没有直接关系,但我当时编写的代码是为在Web服务器上使用而设计的.换句话说,语言环境可能随每个请求而变化,并且不一定与环境的语言环境相同. (7认同)
  • DNS:您是否阅读过语言环境的文档?这意味着调用setlocale"很多"可能是危险的,并且它不是线程安全的.所以也许除了setlocale之外的其他东西就是解决方案.例如,Gettext可以加载不同的目录并在运行时切换; 但我不知道你使用的是什么语言环境. (2认同)

Boš*_*jak 11

这是在Windows上执行此操作的唯一方法(德语区域设置的示例):

import locale

locale.setlocale(category=locale.LC_ALL,
                 locale="German")  # Not locale="de_DE"
Run Code Online (Sandbox Code Playgroud)


lin*_*llo 7

Ubuntu的

在Ubuntu上,您可能遇到此问题,因为您的系统上没有安装本地.

从shell尝试:

$> locale -a
Run Code Online (Sandbox Code Playgroud)

并检查您是否找到了您感兴趣的区域设置.否则您必须安装它:

$> sudo apt-get install language-pack-XXX
Run Code Online (Sandbox Code Playgroud)

XXX是你的语言(在我的情况下是"xxx = it",意大利语语言环境)然后运行dpkg-reconfigure:

$> sudo dpkg-reconfigure locales
Run Code Online (Sandbox Code Playgroud)

之后再次尝试在python shell中:

>>> import locale
>>> locale.setlocale(locale.LC_ALL,'it_IT.UTF-8')
Run Code Online (Sandbox Code Playgroud)

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

  • 这个问题专门询问Windows (10认同)

Del*_*Guy 6

我知道这已经在几年前被问过,但我想我会尝试在Windows上使用Python 3.6添加我发现的东西:

import locale
for x in locale.windows_locale.values():
    print(x.replace('_','-'))
Run Code Online (Sandbox Code Playgroud)

我尝试了一些,这似乎也是一种查找,Windows上可用的方法.

很高兴知道:由于某些原因,这与当前稳定版本的Python的strptime()不兼容

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

locale.setlocale(locale.LC_ALL, any_item_of_the_printed_strings)


小智 5

来自 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.
    """"
Run Code Online (Sandbox Code Playgroud)

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

locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')
Run Code Online (Sandbox Code Playgroud)

或者

locale.setlocale(locale.LC_ALL, ('de', 'utf-8'))
Run Code Online (Sandbox Code Playgroud)

如果系统上未安装语言环境,您将收到相同的错误。因此,请确保您的系统上安装了语言环境:

$ locale -a # to list the currently installed locales
$ (sudo) locale-gen de_DE.UTF-8 # to install new locale
Run Code Online (Sandbox Code Playgroud)