2012-03-22 5 views
4

私は翻訳された文字列の束を利用するPythonアプリケーションを構築しています。ディレクトリ構造のハウジングは、文字列は次のようになります言った:Pythonとgettext

/locales 
    default.pot # reference English strings live here 
    /es_ES 
     /LC_MESSAGES 
      default.po #Spanish strings 
    /de_DE 
     /LC_MESSAGES 
      default.po #German strings 

これらdefault.poのファイルは、PHPアプリケーションによって生成されたが、私の知る限り、彼らはgettext実装で動作するために必要な一般的な標準に準拠しています。

私はgettextのを使用してPythonでこれらの文字列を利用しようとすると、次がダウンした(この例では、localesディレクトリ内から実行されました:

>>> import os; os.listdir('.') 
['.svn', 'de_DE', 'default.pot', 'eng', 'es_ES', 'fr_FR', 'ja_JP', 'ko_KR', 'pl_PL', 'pt_BR', 'ru_RU'] 
>>> import os.path 
>>> os.path.exists('./es_ES/LC_MESSAGES/default.po') 
True 
>>> import gettext 
>>> ldir = 'es_ES/LC_MESSAGES/' 
>>> t = gettext.translation('default',ldir) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/gettext.py", line 469, in translation 
IOError: [Errno 2] No translation file found for domain: 'default' 
>>> 

私は私がここで間違ってやっているかわからないんだけど(このライブラリとその文脈で「ドメイン」の概念と経験不足を超えて)。

私は、単純な間違っているのでしょうか?それとも私はこのがらくたがどのように働くか?

感謝の私の理解では根本的な欠陥を持っています!

+0

私はモジュールが.moので終わるファイルを探しているとされていない理解していればの.po – deinonychusaur

答えて

6

私はこれで非常にさびたんだけど、過去の経験やhttp://docs.python.org/library/gettextに基づいて、私はここに行方不明2つの主なものを参照することができます

  1. はLDIRは(は/ usr /ロケールデータを含むベースディレクトリに設定する必要があります共有/ロケールは古典的なシステムの場所です)。 gettextのは、.poファイルが自分で読むことができませんLDIR/lang_COUNTRY/catalog.mo
  2. を検索します、あなたはバイナリファイルを.moファイルに変換する必要があります。通常はmsgfmtを使用してください(これはMacで "brew install gettext"を実行するのが最も簡単な方法です)。

簡単な例:

$ find /tmp/locales -type f 
/tmp/locales/de_DE/LC_MESSAGES/default.mo 
/tmp/locales/de_DE/LC_MESSAGES/default.po 
/tmp/locales/default.pot 
/tmp/locales/en_IE/LC_MESSAGES/default.mo 
/tmp/locales/en_IE/LC_MESSAGES/default.po 

$ ~/Library/homebrew/Cellar/gettext/0.18.1.1/bin/msgfmt \ 
-o locales/en_IE/LC_MESSAGES/default.mo \ 
locales/en_IE/LC_MESSAGES/default.po 

$ cat /tmp/app.py 
import gettext 
t = gettext.translation('default', "/tmp/locales") 
_ = t.ugettext 

print _("Hello World") 

$ locale 
LANG="en_IE.UTF-8" 
LC_COLLATE="en_IE.UTF-8" 
LC_CTYPE="en_IE.UTF-8" 
LC_MESSAGES="en_IE.UTF-8" 
LC_MONETARY="en_IE.UTF-8" 
LC_NUMERIC="en_IE.UTF-8" 
LC_TIME="en_IE.UTF-8" 
LC_ALL= 

$ python app.py 
How's the craic? 

$ LC_MESSAGES=de_DE python app.py 
Guten Tag