【问题标题】:What is the correct way to set Python's locale on Windows?在 Windows 上设置 Python 语言环境的正确方法是什么?
【发布时间】:2010-10-31 15:45:36
【问题描述】:

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

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

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

我做错了什么?

【问题讨论】:

    标签: python windows localization internationalization


    【解决方案1】:

    看来您使用的是 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 有一个language stringscountry/region strings 的列表

    【讨论】:

    • FWIW,在尝试将语言环境设置为 fr_FR 时,我在 Ubuntu 13.04Linux 3.8.0-19 和 python 2.7.4 下遇到了问题。将其设置为 fr_FR.UTF-8 对我有用。
    • 对于 Conda 4.4.11、Windows 7 中的 Python 3.6.3,区域设置字符串似乎与其他操作系统相同。
    • 链接的文档对于 WServer2018R2 来说似乎太新了,我不得不使用 'eng_usa''en_US' 不起作用)
    【解决方案2】:

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

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

    【讨论】:

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

    来自 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
    

    【讨论】:

      【解决方案4】:

      Ubuntu

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

      从 shell 尝试:

      $> 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')
      

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

      【讨论】:

      • 这个问题专门针对 Windows
      【解决方案5】:

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

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

      【讨论】:

      • 这是唯一能真正回答问题的答案。
      • 这对我有帮助,但我不得不将 German 更改为 Portuguese_Brazil.1252。你知道列出这些值的文档吗?
      【解决方案6】:

      我知道几年前就有人问过这个问题,但我想我会尝试在 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)

      【讨论】:

        猜你喜欢
        • 2023-04-02
        • 2022-11-13
        • 1970-01-01
        • 2011-04-04
        • 1970-01-01
        • 2020-01-24
        • 2013-07-01
        • 1970-01-01
        • 2019-08-27
        相关资源
        最近更新 更多