ロケールを意識した方法で文字列のリストをソートしようとしています。他の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
何が間違っていますか?
明示的なロケールを渡さない setlocaleにすべきです、それは間違っています。環境から調べてみましょう。空の文字列を渡す必要があります
import locale
locale.setlocale(locale.LC_ALL, '')
Windowsでこれを行う唯一の方法です(ドイツ語ロケールの例):
import locale
locale.setlocale(category=locale.LC_ALL,
locale="German") # Not locale="de_DE"
私はこれが何年も前に尋ねられたことを知っていますが、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)
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')
(これはイタリア語のロケール用で、必要なものでした)
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