2012-01-15 12 views
4

要するに、私は同じ時間に同じ言語の多くの.moファイルをPythonで使用できますか?gettext変換に複数の.moファイルを同時に使用するにはどうすればよいですか?

私のpythonアプリケーションでは、I18Nにgettextを使用する必要があります。このアプリは、プラグインシステムの種類を使用しています。つまり、プラグインをダウンロードして適切なディレクトリに置くことができ、他のPythonパッケージと同様に動作します。メインのアプリケーションには、./locale/en/LC_MESSAGES/main.moという名前で使用されている.moファイルが保存されています。また、プラグインnr 1には同じディレクトリにplugin1.moというファイル.moがあります。

私はmain.mo I18Nメッセージをロードするためにこれを使用します。

gettext.install('main', './locale', unicode=False) 

がどのように私はすべてのプラグインは、彼らがあるべき姿を翻訳しているように、あまりにも他の人をインストールすることができますか?私が考え

ソリューション:

は、私は、各パッケージの名前空間にgettext.install()べきでしょうか?しかし、これは先に定義した_()を上書きし、メインアプリケーションの将来の翻訳を混乱させるでしょう。

.moファイルを2つ組み合わせる方法はありますか(新しいプラグインがインストールされている場合など)。

実行時に1つのGNUTranslationオブジェクトに結合できますか?または、グローバル名前空間に追加されたデフォルトの_()メソッドをオーバーライドしますか?それでは、どうすればそのオプションを使うことができますか?アプリケーションがインストールされるすべてのプラグインを認識することが想定されていないので、すでにそのmain.moファイルに翻訳されたすべてのメッセージを持つことはできません。代わりに_('Hello World')の は、私が_('plugin1', 'Hello World in plug-in 1')

注意を使用します。

答えて

1

プラグインごとに異なるドメインを使用する必要があります。競合を避けるために、ドメインはパッケージ名にすることができます。

プラグインのドメインを使用してプラグインの外に何かを翻訳する必要があるのはなぜか分かりませんが、本当に必要な場合は、その都度ドメインの曖昧さを解消する必要があります。抽出ツールはで国際化対応のメッセージを見つけることができるように、唯一の大会

from my.plugin import MessageFactory as _my_plugin 

してください、ノート、アンダーれる:

各プラグインは、それが容易にプラグインのドメインにバインドされた独自の「undescore」、だ提供することができますプログラム。プラグインのメッセージはそれぞれのパッケージにアンダースコアを付けてください(別々のパッケージに入れてください)。他のすべての場所では、これらのファクトリを別の名前で呼び出すことができ、メインプログラムの翻訳ドメインには下線を引いています。

.moファイルについてはあまりよく分かりませんが、すべての.poファイルを1つの.moファイルにコンパイルできます。しかし、プラグインが独立した非協力的な作者によって書かれていると、msgidの競合が発生する可能性があります。

UPDATE:

プラグインがメインのアプリと同じパッケージ内にある場合には、彼らのために、個々の翻訳ドメインを使用することには意味が(これはあなたのケースではありません)がありません。プラグインが別個のパッケージにある場合、それらのパッケージに対して個別に抽出する必要があります。どちらの場合も、変数_に問題はありません。何らかの理由でメインアプリケーションがコード内でプラグインの翻訳を望んでいる場合は、その答えと同じように_の別の名前を使用します。もちろん、抽出ツールはアンダースコア以外は何も識別しません。

つまり、プラグインは翻訳自体を気にする必要があります。メインアプリケーションは、プラグインAPIの一部としてプラグイン固有の変換機能を使用できます。 po/mo-fileへの文字列の抽出や手作業による追加も、主なアプリにとっては重要なことではありません。プラグイン作成者が翻訳を提供するまでです。 APP-グローバル -

+0

だから、私はメインのアプリケーション以外のために_ショートカットを使用していない、とプラグインでは、私が使用すると言っています。 'plugin_translation = gettext.translation( 'plugins.plugin1'、locale_dir) plugin_translation( '翻訳対象のテキスト') ' これはドキュメントに示唆されているようですが、抽出ツールによってi18n対応のメッセージとして識別されますまたはそれを識別するためにモジュールの名前空間でその変数_を呼び出さなければなりませんか? – jadkik94

2

gettext.install()はビルトイン(PY3におけるモジュール__builtin__又はbuiltins)にinalterable唯一_インストール。このように、柔軟性はありません。
注:Pythonの名前解決の順序は次のとおりです:locals> module-globals> builtins。

したがって、gettext.translation()(クラスベースのAPI)またはgettext.GNUTranslations()(カスタム.moパススキームなど)は、複数の翻訳を別々にまたは混合スタイルで同時に使用するために明示的に使用されます。

いくつかのオプション:

  • 経由t = gettext.translation(...); _ = t.ugettextあなたは、単に各モジュール、グローバル名前空間に_として別々の翻訳を入れることができます - 現実の世界でおそらくより自動化された方法。おそらくおそらく、主な翻訳は依然として(main_t.install()を介して)ビルトインに入る可能性があります。 t.install(); t.add_fallback(t_plugin1); t.add_fallback(t_plugin1);...;を介したグローバル

  • ミックスすべてすべて/多くの翻訳のがOKであるか、あなたが望むものである、あなたは可能性があり、いくつかのチェーンの翻訳 - とそうでない場合は、アプリケーション・グローバルなアプローチを維持します。

  • _以外のgettextキーワードを使用することができます。xgettext -k other_keywordオプションを使用してフィードできます。しかし、私は長いとモジュール固有の名前が嫌だ。
    (しかし、個人的に私は_上で、一般的にキーワードIを好む、と私はまたI % "some text"の代わりに、_("some text")またはI("some text")のようなオペレータのスキームを有効に効果的に経由I = t; t.__call__ = t.__mod__ = t.ugettext;プラスpygettext.pyの小さなパッチは、このパターンは、より快適です。対話的なPythonのプロンプトでgettext'edモジュールを使用すると、対話形式のlast-result-anaphor(sys.displayhook)を使用して、Pythonの_の重大な/醜い名前の衝突を避けることができます。_も ​​"予約されていません。_, _, x, y, z, _ = some_tupleのような式の中の未使用の値のプレースホルダです。
    すべてgettextはラスですえー、単純なモジュール&メカニズム、そして物事はPythonで簡単にカスタマイズ可能です)