2

翻訳する必要があるテキスト フィードバックを含むライブラリをコーディングしています。

_config.pyアプリのどこにでもインポートするモジュールに次の行を追加します。

import gettext, os, sys
pathname = os.path.dirname(sys.argv[0])
localdir = os.path.abspath(pathname) + "/locale"
gettext.install("messages", localdir)

*.moファイルがあり、翻訳が必要なすべての文字列に関数./locale/lang_LANG/LC_MESSAGESを適用します。_()

ここで、ユーザー (おそらくプログラマー) が独自のメッセージを作成できる機能を追加しました。私は彼に基礎となる実装を気にさせたくないので、次のような簡単なものにできるようにしてほしい:

lib_object.message = "My message"

プロパティを使用してきれいにしましたが、ユーザーが自分のコード (私のコードを使用するコード) を変換する必要があり、次のようなことをした場合はどうなるでしょうか。

import gettext, os, sys
pathname = os.path.dirname(sys.argv[0])
localdir = os.path.abspath(pathname) + "/locale"
gettext.install("user_app", localdir)

lib_object.message = _("My message")

それって問題ですか ?ユーザーに迷惑をかけずにトラブルを回避するにはどうすればよいですか?

4

2 に答える 2

2

クラス ベースの gettext API を使用して、メッセージ カタログを分離できます。これは、 python gettext documentationで推奨されているものでもあります。

欠点は、あなたまたは他の開発者が gettext メソッドを使用するか_()、特定の gettext クラスにバインドされたローカル スコープでメソッドを定義する必要があることです。独自の文字列カタログを持つクラスの例:

import gettext

class MyClass(object):
    def __init__(self, locale_for_instance):
        self.lang = gettext.translation("appname", localedir, \
                                         locale=locale_for_instance)

    def some_method(self, arg):
        return self.lang.gettext("You called some method")

    def other_method(self, arg): # does the same thing
        _ = self.lang.gettext
        return _("You called some method")

デコレーターに追加するためのコードを貼り付けることができる_()ので、それを必要とするすべてのメソッドには次のようなプレフィックスが付けられます@with_local_gettext

(注、私は上記の可能性をテストしていませんが、うまく動作するはずです(tm))

目標がユーザーに迷惑をかけないことである場合 (そして彼はあまり良くない場合)、コードでクラスベースのアプローチを使用し、ユーザーにグローバルアプローチを使用させることができると思います。

于 2008-12-29T19:29:16.570 に答える
2

gettext.install() は 1 回しか実行できません。一般に、ライブラリの作業には役に立ちません。 gettext.install() は、それを呼び出すモジュールがプログラム全体を担当している場合にのみ正しいことを行います。これは、ロードするカタログが 1 つしか提供されないためです。ライブラリコードは、Mailman が行うことと同様のことを行う必要があります: このモジュールの正しい引数を渡す gettext() 用の独自のラッパーを用意し、それを使用する各モジュールでそれを '_' としてインポートします。

于 2008-10-29T09:43:07.527 に答える