Previous: , Up: Sources   [Contents][Index]


4.10 ライブラリーソースの準備

あなたがプログラムではなくライブラリーを作成する場合、gettextの使用方法にはわずかな違いしかありません。ここでは前提として、ライブラリーが自分自身の翻訳ドメインとPOTファイルを持つとします(ライブラリーがメインプログラムの翻訳ドメインとPOTファイルを使用する場合は、前のセクションを変更なしに適用できます)。

  1. ライブラリーのコードでは、setlocale (LC_ALL, "")を呼び出しません。localeのセットはメインプログラムの責任です。ライブラリーのドキュメントにはこの事実を明記して、ライブラリーを使用するプログラム開発者が認識できるようにする必要があります。
  2. ライブラリーのコードでは、textdomain (PACKAGE)を呼び出しません。text domainのセットはメインプログラムの責任です。
  3. プログラムのための初期化は以下のようなコードでした
      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.  */
      ...
    }
    
  4. プログラムでは通常、各ソースファイル中で、以下のように‘_’マクロを定義しました
    #include <libintl.h>
    #define _(String) gettext (String)
    

    自身の翻訳ドメインを持つライブラリーの場合は、以下のようになります:

    #include <libintl.h>
    #define _(String) dgettext (PACKAGE, String)
    

    別の言い方をすると、gettextのかわりにdgettextを使用するということです。同様に、ngettextが使用される箇所には、dngettextを使用する必要があります。