manpagez: man pages & more
info gettext
Home | html | info | man

File: gettext.info,  Node: libgettextpo,  Prev: Other tools,  Up: Manipulating

10.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 ‘’, 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.

* Menu:

* 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
* po_flag_iterator_t API::      Flag iteration
* 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);

© manpagez.com 2000-2026
Individual documents may contain additional copyright information.