web-dev-qa-db-ja.com

WindowsでPythonのロケールを設定する正しい方法は何ですか?

ロケールを意識した方法で文字列のリストをソートしようとしています。他のi18n関連タスクにBabelライブラリを使用しましたが、ソートはサポートしていません。 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

何が間違っていますか?

75
DNS

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には、 言語文字列 および 国/地域文字列 のリストがあります

101
Schnouki

明示的なロケールを渡さない setlocaleにすべきです、それは間違っています。環境から調べてみましょう。空の文字列を渡す必要があります

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

Windowsでこれを行う唯一の方法です(ドイツ語ロケールの例):

import locale

locale.setlocale(category=locale.LC_ALL,
                 locale="German")  # Not locale="de_DE"
11
Boštjan Mejak

私はこれが何年も前に尋ねられたことを知っていますが、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)

6
DelphiGeekGuy

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

(これはイタリア語のロケール用で、必要なものでした)

6
linello

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

システム上でロケールがnot installedの場合、同じエラーが発生します。したがって、システムにロケールインストール済みがあることを確認してください。

$ locale -a # to list the currently installed locales
$ (Sudo) locale-gen de_DE.UTF-8 # to install new locale
3