OSXでのlocale.getlocale()の問題
-
06-07-2019 - |
質問
多くのことを行うためにシステムロケールを取得する必要があり、最終的にはgettextを使用してアプリを翻訳したいと思います。 LinuxとOSXの両方で配布しますが、OSX Snow Leopardで問題が発生しました。
$ python
Python 2.5.2 (r252:60911, Jan 4 2009, 17:40:26)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'sv_SE.UTF-8'
>>> locale.getlocale()
('sv_SE', 'UTF8')
$ python
Python 2.6.1 (r261:67515, Jul 7 2009, 23:51:51)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'C'
>>> locale.getlocale()
(None, None)
両方のシステムはスウェーデン語を使用しています。 Linuxでは、環境変数LANGはすでに「sv_SE.UTF-8」に設定されています。その変数をOSXのpythonに渡すと(代わりに LANG =" sv_SE.UTF-8" python
)、ロケールが適切に検出されます。しかし、 locale.getlocale()
はオペレーティングシステムが持っているどんな言語でも取得できるべきではありませんか?ユーザーに LANG
、 LC_ALL
、または環境変数を強制的に設定させたくありません。
locale
コマンドの出力:
$ locale
LANG=
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=
解決
OSXで奇数(Smow Leopard 10.6.1)が表示される
$ python
Python 2.6.1 (r261:67515, Jul 7 2009, 23:51:51)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getlocale()
(None, None)
>>> locale.setlocale(locale.LC_ALL, '')
'en_GB.UTF-8'
>>> locale.getlocale()
('en_GB', 'UTF8')
編集:
基本的には、実行時に環境に設定されている内容(LANG、LANGUAGE、LC_ALLのいずれか)に依存します。シェル環境にLANG = en_GB.UTF-8がありました
他のヒント
間違いなく恐ろしいハックですが、これを挿入しました:
import platform
# ...
# XXX horrendous OS X invalid locale hack
if platform.system() == 'Darwin':
import locale
if locale.getlocale()[0] is None:
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
mine のプログラムの初期段階。その後、自分に関係のあるすべてのOSで、変更されていないシェル環境を使用してプログラムを実行できます(私のプログラムは、とにかく後で処理で使用される言語を把握します)。
環境変数 LC_ALL
を変更することでロケールを変更できるようです。
$ export LC_ALL=C
$ python
Python 2.5.1 (r251:54863, Feb 6 2009, 19:02:12)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getlocale()
(None, None)
>>> locale.setlocale(locale.LC_ALL, "")
'C'
>>> locale.getlocale()
(None, None)
$ export LC_ALL=en_GB.UTF-8
$ python
Python 2.5.1 (r251:54863, Feb 6 2009, 19:02:12)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getlocale()
(None, None)
>>> locale.setlocale(locale.LC_ALL, "")
'en_GB.UTF-8'
>>> locale.getlocale()
('en_GB', 'UTF8')
こちらから:〜/ .profile
またはを追加または編集してみてください〜/ .bash_profile
ファイルを使用して、新しいセッションの開始時にロケール設定を正しくエクスポートします。
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
古い質問ですが、これは他の人に役立つ可能性があります。これは、2016年3月現在、Python 2または3のいずれでも未解決のPythonバグです。 https://bugs.python.org/issue18378 。
要約すると、PythonはGNUに似たロケールを想定し、BSD環境(OS Xと同様)のような(POSIX的に正しい)分岐を妨げます。また、UTF8ロケールはLinuxではなくBSDに存在するため、問題があります。
ソリューションまたはデバッグの場合:ローカル環境変数はTerminal.appで設定できます([設定]-[プロファイル]-[詳細]-[国際]を参照してください。iTermなどでも同様です)。そのため、ターミナルウィンドウではロケール環境変数が設定されていますが、パッケージ化されたアプリケーションの実行時には設定されていない変数が見つかります。
場合によっては(Python 2.7および3.5のSphinxが" ValueError:unknown locale:UTF-8"のためにOS Xで死ぬ)、環境設定変数を設定するための設定チェックボックスを無効にすることが解決策です。
しかし、他のプログラムで問題を引き起こす可能性があります:ロケール変数が設定されていない場合、bash 4.3(MacPortsから)はすべてのプロンプトで" warning:setlocale:LC_CTYPE:cannot locale locale():not such fileまたはディレクトリ" ...
したがって、バグがPythonにあることを考えると、回避策はおそらくpythonプログラム(@Jacob Oscarsonの答えのように)またはpythonの呼び出し(ロケール変数を適切な値に設定すること)で行う必要があります。