Previous: Colorizing, Up: Manipulating [Contents][Index]
‘msgattrib’や‘msgcat’などの組み合わせによる処理では十分でない場合のために、一連のC関数がライブラリにより提供されています。これを使うことにより、あなたのプログラムからPOファイルを処理できるようになります。ライブラリーを使う場合は、POファイルをパースするルーチンを自分で記述する必要はありません。かわりにPOファイル内の各メッセージに対応するメモリーへのポインターを取得することができます。現時点では、POファイルへ書き込むための関数は提供されていません。
関数はヘッダーファイル‘<gettext-po.h>’で宣言されており、‘libgettextpo’というライブラリーで定義されています。
POファイルのコンテンツをメモリーに読み込んだ後に、それらを参照するためのポインター型です。
一連のメッセージを生成するiteratorを参照するためのポインター型です。
POファイルのメッセージ(翻訳を含む)を参照するためのポインター型です。
関数po_file_readは、引数としてファイル名を受け取り、そのPOファイルをメモリー内に読み込みます。戻り値はPOファイル内のコンテンツへのハンドルで、そのハンドルはpo_file_freeが呼び出されるまで有効です。エラーが発生したときの戻り値はNULLで、errnoがセットされます。
関数po_file_freeは、メモリー内のPOファイルのコンテンツを解放します。iteratorを通じて暗黙にアクセス可能なすべてのメッセージも解放されます。
関数po_file_domainsは、メッセージを所有するPOファイルのdomainを戻します。戻り値はNULLで終端された配列で、この配列はfileのハンドルが有効な間は有効です。‘domain’指定を持たないPOファイルの場合は、デフォルトのドメインである"messages"という名前のドメインだけが戻されます。
po_message_iteratorは、与えられたdomainに属するfileのメッセージを生成するiteratorを戻します。domainがNULLのときは、かわりにデフォルトのdomainが使用されます。関数po_next_messageを繰り返し呼び出すと、メッセージをリストすることができます。
関数po_message_iterator_freeは、関数po_message_iteratorにより割り当てられたiteratorを開放します。
関数po_next_messageは、iteratorから次のメッセージを戻すとともにiteratorを1つ進めます。メッセージリストの終端に達すると、NULLが戻されます。
以下はpo_message_tのメンバーを戻す関数です。fileハンドルが有効な間は、呼び出しによる結果も有効です。
関数po_message_msgidは、メッセージのmsgid(未翻訳のEnglish文字列)を戻します。この結果は、非NULLであることが保証されています。
関数po_message_msgid_pluralは、pluralをもつメッセージのmsgid_plural(未翻訳のEnglish
plural文字列)を戻します。メッセージがpluralをもたない場合には、NULLが戻されます。
関数po_message_msgstrは、メッセージのmsgstr(翻訳済み)を戻します。未翻訳のメッセージの場合は、空文字列が戻されます。
関数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);