2

多くのことを行うためにシステムロケールを取得する必要があります。最終的には、gettextを使用してアプリを翻訳したいと思います。LinuxとOSXの両方で配布しますが、OSXSnowLeopardで問題が発生しました。

$ 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=
4

6 に答える 6

4

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

編集:

Apple pythonメーリングリストでこれを見つけました

基本的には、実行時に環境に何が設定されているか (LANG、LANGUAGE、LC_ALL のいずれか) によって異なります。私のシェル環境には LANG=en_GB.UTF-8 がありました。

于 2009-10-27T10:29:16.663 に答える
3

確かに恐ろしいハックですが、これを挿入しました:

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

のプログラムの早い段階で。その後、私に関連するすべてのOSで変更されていないシェル環境を使用してプログラムを実行できました(私のプログラムは、後で処理中に使用される言語を見つけ出します)。

于 2012-01-11T12:27:27.347 に答える
3

環境変数を変更することでロケールを変更できるようです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')
于 2009-10-27T13:59:08.423 に答える
1

古い質問ですが、これは他の人を助けるかもしれませ.

要約すると、Python は GNU のようなロケールを想定し、BSD 環境 (OS X の場合と同様) のような (POSIX 的に正しい) 分岐を回避します。また、UTF8 ロケールは Linux ではなく BSD に存在するため、問題が発生します。

ソリューションまたはデバッグに関しては、ローカル環境変数は Terminal.app で設定できます (Preferences - Profiles - Advanced - International を参照してください。iTerm などについても同様です)。そのため、ターミナル ウィンドウでは設定されているロケール環境変数を見つけることができますが、パッケージ化されたアプリケーションの実行時には設定されていない変数を見つけることができます。

場合によっては (「ValueError: unknown locale: UTF-8」が原因で OS X で Python 2.7 および 3.5 の Sphinx が停止するなど)、環境設定チェックボックスを無効にしてロケール環境変数を設定することが解決策です。

しかし、それは他のプログラムで問題を引き起こす可能性があります: ロケール変数が設定されていない場合、bash 4.3 (MacPorts から) はすべてのプロンプトで「警告: setlocale: LC_CTYPE: ロケールを変更できません (): そのようなファイルまたはディレクトリはありません」と文句を言います.. .

したがって、バグがPythonにあることを考えると、回避策はおそらくpythonプログラム(@Jacob Oscarsonの回答のように)またはpython呼び出し(ロケール変数を適切な値に設定することにより)で行う必要があります。

于 2016-03-01T12:29:34.780 に答える