Next: , Previous: , Up: gettext   [Contents][Index]


11.2.2 あいまいざの解決

ほとんどのアプリケーションでは、単一のドメイン名でうまく動作するかもしれませんが、複数のドメインから翻訳を取得する必要があるアプリケーションも存在します。textdomainを呼び出すことにより異なるドメインに切り替えることもできますが、これは不便だし低速です。起こり得る状況としては、この文書を記述しているときに提出された議論(一般的に使われる関数のすべてのエラーメッセージは、errorというドメインに分離するべきである)のケースがあります。これには翻訳が1度で済むという意味があります。他のケースとしてはライブラリーのメッセージの場合で、これらがアプリケーションの現在のドメインからは独立している必要があります。

これらの理由により、文字列を取得するために、さらに2つの関数が用意されています:

char *dgettext (const char *domain_name, const char *msgid);
char *dcgettext (const char *domain_name, const char *msgid,
                 int category);

これらの関数は、どちらも1番目に追加の引数があります。これにはtextdomainと同じ引数を与えます。dcgettextの3番目の引数により、LC_MESSAGES以外の、他のlocale categoryを使うことができます(実際のところ、わたしにはこれがどんなときに便利なのか、わかりませんが)。domain_nameNULLのとき、またはcategoryに未知のものが指定された場合、結果は未定義となります。Solarisの関数ファミリーの2番目の実装にはでは、1つは含まれているのに、この関数は含まれていないことも触れておくべきでしょう

多重定義が発生する2番目の理由は、複数のドメインが同じ名前を共有するかもしれないという事実に起因します。これは必要なメッセージカタログがどこにあるか指定することで解決します。

char *bindtextdomain (const char *domain_name,
                      const char *dir_name);

この関数を呼び出すことにより、指定されたドメインとディレクトリーのファイルがバインドされます(ファイルがどのように決定されるかは以下で説明します)。特に、システムの既定の位置にあるファイルのかわりに、指定された位置のファイルを使ってtextdomainを呼び出したいときに使用します。dir_nameパラメーターにNULLポインターを与えると、domain_nameにバインドされている値が戻されます。domain_name自身がNULLの場合は何も行われず、NULLポインターが戻されます。他の関数と同様に、戻された値を変更することはできません!

dir_nameに相対パスを指定することは、トラブルの原因になることを覚えておくことは重要です。プログラムがchdirコマンドを呼び出すことにより、カレントディレクトリーに関連づいた相対パスは、再計算されます。相対パスの使用により、常に非依存性と信頼性が無効にされます。