Previous: , Up: Manipulating PO Files   [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’.

The library is multithread-safe in the following sense: Different threads can safely use the various functions simultaneously on unrelated data objects. For example, if several threads have created separate po_file_t objects, each of them can safely work on its respective po_file_t object, without caring about the other threads.

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 for manipulating PO files, Up: Manipulating PO Files   [Contents][Index]