2011-01-18 3 views
0

私はpy2appでパッケージ化したシンプルなwxPythonアプリケーションを書いて、実行するために他の人に与えることができる自己内蔵のダブルクリック可能な.appバンドルにしました。Mac OS X上のpy2appパッケージ化されたPythonアプリケーションで、システムのデフォルト言語/ロケールを取得するにはどうすればよいですか?

私のアプリでは、ロケール固有の設定を使用しています(具体的には、テキスト形式の日付を解析する必要があります)ので、ユーザーは使用するロケールを指定できるようになり、locale.getdefaultlocale()

私はPythonコードを直接(システムにインストールされていないPythonでパッケージ化されていない)実行してテストしたところ、py2appでパッケージ化し、 "dist/fooを開く"という結果の自己完結型アプリケーションをテストしました。アプリ "とそれは正常に働いた。それから、私は他の人にそれを与え、彼らはすぐに例外を投げたと非難した。 Finderとloで私の.appをダブルクリックしようとしましたが、locale.getdefaultlocale()は実際にはNoneを返しています(例外は、私がそのオブジェクトに対してメソッド呼び出しを行った結果です)。

私は、環境とlocale.getdefaultlocale()の値をダンプし、同じ3つの環境で実行した簡単なテストアプリケーションを作成しました。結果: - ターミナルから "python envdump.py"を直接呼び出す:私の完全な環境をダンプする - py2appでパッケージを開き、 "open dist/envdump.app"としてターミナルから呼び出す:自分の完全な環境をダンプする - 同じdist /環境変数Finder:envdump.appはFinder:環境からはるかに制限されています.LANGが設定されていないため、locale.getdefaultlocale()は(None、None)を返します。

ファインダーで設定した環境変数の完全なリストは、次のとおりです。ARGVZERO、Apple_PubSub_Socket_Render、COMMAND_MODE、DISPLAY、EXECUTABLEPAT、HOME、LOGNAME、PATH、PYTHONPATH、RESOURCEPATH、SHELL、SSH_AUTH_SOCK、TMPDIR、USER、__ CF_USER_TEXT_ENCODING。

私のコードでLANG/locale.getdefaultlocale()の不足を許容しやすくすることはできますが、何とかその情報を取得したいと思います。

+0

多分システムのデフォルトはありません - 私のターミナルウィンドウでLANGが設定されているという事実は、わかっていない特定のTerminal.appの動作です(デフォルトではこの方法で変更できます)。 http://hintsforums.macworld.com/showthread.php?t=93754を参照してください。 – metamatt

答えて

1

起動したアプリケーション(ダブルクリックなど)の環境変数の値は、ターミナルウィンドウシェルで実行した場合と同じではありません。 ~/.MacOSX/environment.plistを作成して指定する方法があります。詳細はhereを参照してください。しかし、それはおそらくあなたがしたいことではありません。アプリのデフォルトを作成する必要がある場合は、hereのようにアプリのplistに追加することができます。

+0

ありがとうございます。最初のリンクは本当に私がやりたいことではありませんが、そのメカニズムが利用可能であることを知ることはかなり面白いです。 – metamatt

+1

OS Xの 'locale'の意味ではデフォルトの' LANG'が存在しません。ユーザの好みの言語を取得したい場合は、ここで説明する標準のAppleインターフェースを使用する必要があります: http://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPInternational/Articles/ChoosingLocalizations.htmlおそらく、Cコードの一部またはPyObjCの使用を意味します。 –

+0

あなたの追加のコメントで、それは完全に私の質問に答える、そして今私は状況を理解する。私は、OS XのUIレベルのものはLANGに関連しておらず、実際にはCore Foundationが関わっていると認識していたはずです。私はデフォルトでLANGをデフォルトに設定することによってターミナルを捨ててしまいました。それは本当にTerminal.appのときにシステム全体の動作だと思っていました。 – metamatt