GNU gettext utilities: libgettextpo
Previous: Other tools, Up: Manipulating [Contents][Index]
9.13 Writing your own programs that process PO files
For the tasks for which a combination of ‘msgattrib’, ‘msgcat’ etc. is not sufficient, a set of C functions is provided in a library, to make it possible to process PO files in your own programs. When you use this library, you don’t need to write routines to parse the PO file; instead, you retrieve a pointer in memory to each of messages contained in the PO file. Functions for writing those memory structures to a file after working with them are provided too.
The functions are declared in the header file ‘<gettext-po.h>’, and are defined in a library called ‘libgettextpo’.
| • Error Handling: | Error handling functions | |
| • po_file_t API: | File management | |
| • po_message_iterator_t API: | Message iteration | |
| • po_message_t API: | The basic units of the file | |
| • PO Header Entry API: | Meta information of the file | |
| • po_filepos_t API: | References to the sources | |
| • Format Type API: | Supported format types | |
| • Checking API: | Enforcing constraints |
The following example shows code how these functions can be used. Error handling code is omitted, as its implementation is delegated to the user provided functions.
struct po_xerror_handler handler =
{
.xerror = …,
.xerror2 = …
};
const char *filename = …;
/* Read the file into memory. */
po_file_t file = po_file_read (filename, &handler);
{
const char * const *domains = po_file_domains (file);
const char * const *domainp;
/* Iterate the domains contained in the file. */
for (domainp = domains; *domainp; domainp++)
{
po_message_t *message;
const char *domain = *domainp;
po_message_iterator_t iterator = po_message_iterator (file, domain);
/* Iterate each message inside the domain. */
while ((message = po_next_message (iterator)) != NULL)
{
/* Read data from the message … */
const char *msgid = po_message_msgid (message);
const char *msgstr = po_message_msgstr (message);
…
/* Modify its contents … */
if (perform_some_tests (msgid, msgstr))
po_message_set_fuzzy (message, 1);
…
}
/* Always release returned po_message_iterator_t. */
po_message_iterator_free (iterator);
}
/* Write back the result. */
po_file_t result = po_file_write (file, filename, &handler);
}
/* Always release the returned po_file_t. */
po_file_free (file);
Previous: Other tools, Up: Manipulating [Contents][Index]