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


9.12 POファイルを処理するプログラムを独自に記述する

msgattrib’や‘msgcat’などの組み合わせによる処理では十分でない場合のために、一連のC関数がライブラリにより提供されています。これを使うことにより、あなたのプログラムからPOファイルを処理できるようになります。ライブラリーを使う場合は、POファイルをパースするルーチンを自分で記述する必要はありません。かわりにPOファイル内の各メッセージに対応するメモリーへのポインターを取得することができます。現時点では、POファイルへ書き込むための関数は提供されていません。

関数はヘッダーファイル‘<gettext-po.h>’で宣言されており、‘libgettextpo’というライブラリーで定義されています。

Data Type: po_file_t

POファイルのコンテンツをメモリーに読み込んだ後に、それらを参照するためのポインター型です。

Data Type: po_message_iterator_t

一連のメッセージを生成するiteratorを参照するためのポインター型です。

Data Type: po_message_t

POファイルのメッセージ(翻訳を含む)を参照するためのポインター型です。

Function: po_file_t po_file_read (const char *filename)

関数po_file_readは、引数としてファイル名を受け取り、そのPOファイルをメモリー内に読み込みます。戻り値はPOファイル内のコンテンツへのハンドルで、そのハンドルはpo_file_freeが呼び出されるまで有効です。エラーが発生したときの戻り値はNULLで、errnoがセットされます。

Function: void po_file_free (po_file_t file)

関数po_file_freeは、メモリー内のPOファイルのコンテンツを解放します。iteratorを通じて暗黙にアクセス可能なすべてのメッセージも解放されます。

Function: const char * const * po_file_domains (po_file_t file)

関数po_file_domainsは、メッセージを所有するPOファイルのdomainを戻します。戻り値はNULLで終端された配列で、この配列はfileのハンドルが有効な間は有効です。‘domain’指定を持たないPOファイルの場合は、デフォルトのドメインである"messages"という名前のドメインだけが戻されます。

Function: po_message_iterator_t po_message_iterator (po_file_t file, const char *domain)

po_message_iteratorは、与えられたdomainに属するfileのメッセージを生成するiteratorを戻します。domainNULLのときは、かわりにデフォルトのdomainが使用されます。関数po_next_messageを繰り返し呼び出すと、メッセージをリストすることができます。

Function: void po_message_iterator_free (po_message_iterator_t iterator)

関数po_message_iterator_freeは、関数po_message_iteratorにより割り当てられたiteratorを開放します。

Function: po_message_t po_next_message (po_message_iterator_t iterator)

関数po_next_messageは、iteratorから次のメッセージを戻すとともにiteratorを1つ進めます。メッセージリストの終端に達すると、NULLが戻されます。

以下はpo_message_tのメンバーを戻す関数です。fileハンドルが有効な間は、呼び出しによる結果も有効です。

Function: const char * po_message_msgid (po_message_t message)

関数po_message_msgidは、メッセージのmsgid(未翻訳のEnglish文字列)を戻します。この結果は、非NULLであることが保証されています。

Function: const char * po_message_msgid_plural (po_message_t message)

関数po_message_msgid_pluralは、pluralをもつメッセージのmsgid_plural(未翻訳のEnglish plural文字列)を戻します。メッセージがpluralをもたない場合には、NULLが戻されます。

Function: const char * po_message_msgstr (po_message_t message)

関数po_message_msgstrは、メッセージのmsgstr(翻訳済み)を戻します。未翻訳のメッセージの場合は、空文字列が戻されます。

Function: const char * po_message_msgstr_plural (po_message_t message, int index)

関数po_message_msgstr_pluralは、pluralをもつメッセージのmsgstr[index]を戻します。indexが範囲外のとき、またはメッセージがpluralをもたない場合はNULLが戻されます。

以下は、これらの関数がどのように使用されるかを示す例です。

const char *filename = …;
po_file_t file = po_file_read (filename);

if (file == NULL)
  error (EXIT_FAILURE, errno, "couldn't open the PO file %s", filename);
{
  const char * const *domains = po_file_domains (file);
  const char * const *domainp;

  for (domainp = domains; *domainp; domainp++)
    {
      const char *domain = *domainp;
      po_message_iterator_t iterator = po_message_iterator (file, domain);

      for (;;)
        {
          po_message_t *message = po_next_message (iterator);

          if (message == NULL)
            break;
          {
            const char *msgid = po_message_msgid (message);
            const char *msgstr = po_message_msgstr (message);

            …
          }
        }
      po_message_iterator_free (iterator);
    }
}
po_file_free (file);