GNU Info

Info Node: (python2.1-lib.info)Deferred translations

(python2.1-lib.info)Deferred translations


Prev: Changing languages on the fly Up: Internationalizing your programs and modules
Enter node , (file) or (file)node

Deferred translations
.....................

In most coding situations, strings are translated were they are coded.
Occasionally however, you need to mark strings for translation, but
defer actual translation until later.  A classic example is:

     animals = ['mollusk',
                'albatross',
     	   'rat',
     	   'penguin',
     	   'python',
     	   ]
     # ...
     for a in animals:
         print a

Here, you want to mark the strings in the `animals' list as being
translatable, but you don't actually want to translate them until they
are printed.

Here is one way you can handle this situation:

     def _(message): return message
     
     animals = [_('mollusk'),
                _('albatross'),
     	   _('rat'),
     	   _('penguin'),
     	   _('python'),
     	   ]
     
     del _
     
     # ...
     for a in animals:
         print _(a)

This works because the dummy definition of `_()' simply returns the
string unchanged.  And this dummy definition will temporarily override
any definition of `_()' in the built-in namespace (until the `del'
command).  Take care, though if you have a previous definition of `_' in
the local namespace.

Note that the second use of `_()' will not identify "a" as being
translatable to the `pygettext' program, since it is not a string.

Another way to handle this is with the following example:

     def N_(message): return message
     
     animals = [N_('mollusk'),
                N_('albatross'),
     	   N_('rat'),
     	   N_('penguin'),
     	   N_('python'),
     	   ]
     
     # ...
     for a in animals:
         print _(a)

In this case, you are marking translatable strings with the function
`N_()',(1) which won't conflict with any definition of `_()'.  However,
you will need to teach your message extraction program to look for
translatable strings marked with `N_()'.  `pygettext' and `xpot' both
support this through the use of command line switches.

---------- Footnotes ----------

(1) The choice of `N_()' here is totally arbitrary; it could have just
as easily been `MarkThisStringForTranslation()'.


automatically generated by info2www version 1.2.2.9