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);