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


80

文字列のリストをロケール対応の方法で並べ替えようとしています。他の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

私は何が間違っているのですか?

回答:


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のpythonで、2.7.4にロケールを設定しようとしたときfr_FRfr_FR.UTF-8私のために働くようにそれを設定します。
Zoneur 2013

Conda 4.4.11、Windows7のPython3.6.3の場合、ロケール文字列は他のOSと同じように見えます。
srodriguex 2018

2
このリストはより包括的です:msdn.microsoft.com/en-us/library/cc233982.aspx
Cristian Ciupitu 2018年

2
リンクドキュメントはWServer2018R2私が使用しなければならなかったため、あまりにも最近のように見える'eng_usa''en_US'動作しませんでした)
ブープ

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。これらの値をリストしたドキュメントを知っていますか?
HenriqueBrisola20年

15

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

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

10
これは直接関係がないため、質問では触れませんでしたが、当時書いていたコードはWebサーバーで使用するために設計されました。つまり、ロケールはリクエストごとに変わる可能性があり、必ずしも環境のロケールと同じであるとは限りません。
DNS

2
DNS:ロケールのドキュメントを読んだことがありますか?これは、setlocaleを「多く」と呼ぶのは危険である可能性があり、スレッドセーフではないことを意味します。したがって、おそらく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シェルで再試行してください。

>>> 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.