Next: Temp Programmers, Previous: Using libintl.a, Up: Programmers [Contents][Index]
gettext
を根底から理解する注意: このセクションの文書は時代遅れになっているので、改訂する必要があります。
ソースコードを読むことは、GNU
gettext
の機能を完全に活用するための助けになるでしょう。しかし、(時として込み入った内容の)コードを読むために時間
費やすことを望まない人々のために、幾つかのコメントを挙げておきます:
対話的なプログラムにおいては、使用する言語を実行時に尋ねたほうが有用であることがあります。これを理解するためには、gettext
関数が使用する言語をどのように決定しているのかを知る必要があります。ここに示す方法はGNUによるgettext
関数の実装においてのみ正しいものです。
dcgettext関数は呼出しごとに、環境変数の中で最高のプライオリティを持つものを探し出して使用します。プライオリティは以下のリストで示されます。プライオリティは下にいくにつれて低くなります。
その後、検索された値を用いてパスが設定され、可能であれば翻訳ファイルがロー ドされます。
「今」とは、LANGUAGE
が変更されたときです。上で説明した過程に従い、この変数の新しい値はdcgettext
関数が呼び出された時点で決定されます。これは(おそらく)異なったメッセージカタログがロードされることを意味します。即ち、使用する言語が変更されるのです。
しかし、これは一つの小さなフックに過ぎません。 gcc
2.7.0以上のコードでは幾分の最適化が図られています。この最適化は通常、dcgettext
関数の呼び出しによって新しいカタログがロードされる前に行われます。しかし、もしdcgettextが呼び出されなければ、プログラムもまたLANGUAGE
変数の値が変更されたことを知ることができないでしょう(Optimized gettextを参照してください)。この解決方法は非常に簡単です。以下のコードを言語変更関数の前に 置けばよいのです。
/* Change language. */ setenv ("LANGUAGE", "fr", 1); /* Make change known. */ { extern int _nl_msg_cat_cntr; ++_nl_msg_cat_cntr; }
変数_nl_msg_cat_cntr
はloadmsgcat.c中で定義されています。あなたはこれが何のためのものなのか知る必要はありません。しかし、これは、あるgettext
実装がGNU
gettextなのか、それとも非GNUシステムのネイティブのgettext実装なのかを決定するために使用できます。