あなたがプログラムではなくライブラリーを作成する場合、gettext
の使用方法にはわずかな違いしかありません。ここでは前提として、ライブラリーが自分自身の翻訳ドメインとPOTファイルを持つとします(ライブラリーがメインプログラムの翻訳ドメインとPOTファイルを使用する場合は、前のセクションを変更なしに適用できます)。
setlocale (LC_ALL,
"")
を呼び出しません。localeのセットはメインプログラムの責任です。ライブラリーのドキュメントにはこの事実を明記して、ライブラリーを使用するプログラム開発者が認識できるようにする必要があります。
textdomain (PACKAGE)
を呼び出しません。text
domainのセットはメインプログラムの責任です。
setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE);
ライブラリーの場合は以下のコードだけになります
bindtextdomain (PACKAGE, LOCALEDIR);
ライブラリーのAPIにまだ初期化の関数が無いなら、bindtextdomain
呼び出しを含む初期化関数を作成する必要があります。しかし通常、この初期化関数をエクスポートしたりドキュメント化する必要はありません。初期化関数がまだ呼び出されていない場合は、ライブラリーのすべてのエントリーポイントとなる関数から初期化関数を呼び出すだけで十分です。これを満足するような典型的な例は、初期化関数が呼び出し済みかどうかを保持するブール値の静的な変数を使用する方法です:
static bool libfoo_initialized; static void libfoo_initialize (void) { bindtextdomain (PACKAGE, LOCALEDIR); libfoo_initialized = true; } /* This function is part of the exported API. */ struct foo * create_foo (...) { /* Must ensure the initialization is performed. */ if (!libfoo_initialized) libfoo_initialize (); ... } /* This function is part of the exported API. The argument must be non-NULL and have been created through create_foo(). */ int foo_refcount (struct foo *argument) { /* No need to invoke the initialization function here, because create_foo() must already have been called before. */ ... }
#include <libintl.h> #define _(String) gettext (String)
自身の翻訳ドメインを持つライブラリーの場合は、以下のようになります:
#include <libintl.h> #define _(String) dgettext (PACKAGE, String)
別の言い方をすると、gettext
のかわりにdgettext
を使用するということです。同様に、ngettext
が使用される箇所には、dngettext
を使用する必要があります。