symbian-qemu-0.9.1-12/python-2.6.1/Doc/library/gettext.rst
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 
       
     2 :mod:`gettext` --- Multilingual internationalization services
       
     3 =============================================================
       
     4 
       
     5 .. module:: gettext
       
     6    :synopsis: Multilingual internationalization services.
       
     7 .. moduleauthor:: Barry A. Warsaw <barry@zope.com>
       
     8 .. sectionauthor:: Barry A. Warsaw <barry@zope.com>
       
     9 
       
    10 
       
    11 The :mod:`gettext` module provides internationalization (I18N) and localization
       
    12 (L10N) services for your Python modules and applications. It supports both the
       
    13 GNU ``gettext`` message catalog API and a higher level, class-based API that may
       
    14 be more appropriate for Python files.  The interface described below allows you
       
    15 to write your module and application messages in one natural language, and
       
    16 provide a catalog of translated messages for running under different natural
       
    17 languages.
       
    18 
       
    19 Some hints on localizing your Python modules and applications are also given.
       
    20 
       
    21 
       
    22 GNU :program:`gettext` API
       
    23 --------------------------
       
    24 
       
    25 The :mod:`gettext` module defines the following API, which is very similar to
       
    26 the GNU :program:`gettext` API.  If you use this API you will affect the
       
    27 translation of your entire application globally.  Often this is what you want if
       
    28 your application is monolingual, with the choice of language dependent on the
       
    29 locale of your user.  If you are localizing a Python module, or if your
       
    30 application needs to switch languages on the fly, you probably want to use the
       
    31 class-based API instead.
       
    32 
       
    33 
       
    34 .. function:: bindtextdomain(domain[, localedir])
       
    35 
       
    36    Bind the *domain* to the locale directory *localedir*.  More concretely,
       
    37    :mod:`gettext` will look for binary :file:`.mo` files for the given domain using
       
    38    the path (on Unix): :file:`localedir/language/LC_MESSAGES/domain.mo`, where
       
    39    *languages* is searched for in the environment variables :envvar:`LANGUAGE`,
       
    40    :envvar:`LC_ALL`, :envvar:`LC_MESSAGES`, and :envvar:`LANG` respectively.
       
    41 
       
    42    If *localedir* is omitted or ``None``, then the current binding for *domain* is
       
    43    returned. [#]_
       
    44 
       
    45 
       
    46 .. function:: bind_textdomain_codeset(domain[, codeset])
       
    47 
       
    48    Bind the *domain* to *codeset*, changing the encoding of strings returned by the
       
    49    :func:`gettext` family of functions. If *codeset* is omitted, then the current
       
    50    binding is returned.
       
    51 
       
    52    .. versionadded:: 2.4
       
    53 
       
    54 
       
    55 .. function:: textdomain([domain])
       
    56 
       
    57    Change or query the current global domain.  If *domain* is ``None``, then the
       
    58    current global domain is returned, otherwise the global domain is set to
       
    59    *domain*, which is returned.
       
    60 
       
    61 
       
    62 .. function:: gettext(message)
       
    63 
       
    64    Return the localized translation of *message*, based on the current global
       
    65    domain, language, and locale directory.  This function is usually aliased as
       
    66    :func:`_` in the local namespace (see examples below).
       
    67 
       
    68 
       
    69 .. function:: lgettext(message)
       
    70 
       
    71    Equivalent to :func:`gettext`, but the translation is returned in the preferred
       
    72    system encoding, if no other encoding was explicitly set with
       
    73    :func:`bind_textdomain_codeset`.
       
    74 
       
    75    .. versionadded:: 2.4
       
    76 
       
    77 
       
    78 .. function:: dgettext(domain, message)
       
    79 
       
    80    Like :func:`gettext`, but look the message up in the specified *domain*.
       
    81 
       
    82 
       
    83 .. function:: ldgettext(domain, message)
       
    84 
       
    85    Equivalent to :func:`dgettext`, but the translation is returned in the preferred
       
    86    system encoding, if no other encoding was explicitly set with
       
    87    :func:`bind_textdomain_codeset`.
       
    88 
       
    89    .. versionadded:: 2.4
       
    90 
       
    91 
       
    92 .. function:: ngettext(singular, plural, n)
       
    93 
       
    94    Like :func:`gettext`, but consider plural forms. If a translation is found,
       
    95    apply the plural formula to *n*, and return the resulting message (some
       
    96    languages have more than two plural forms). If no translation is found, return
       
    97    *singular* if *n* is 1; return *plural* otherwise.
       
    98 
       
    99    The Plural formula is taken from the catalog header. It is a C or Python
       
   100    expression that has a free variable *n*; the expression evaluates to the index
       
   101    of the plural in the catalog. See the GNU gettext documentation for the precise
       
   102    syntax to be used in :file:`.po` files and the formulas for a variety of
       
   103    languages.
       
   104 
       
   105    .. versionadded:: 2.3
       
   106 
       
   107 
       
   108 .. function:: lngettext(singular, plural, n)
       
   109 
       
   110    Equivalent to :func:`ngettext`, but the translation is returned in the preferred
       
   111    system encoding, if no other encoding was explicitly set with
       
   112    :func:`bind_textdomain_codeset`.
       
   113 
       
   114    .. versionadded:: 2.4
       
   115 
       
   116 
       
   117 .. function:: dngettext(domain, singular, plural, n)
       
   118 
       
   119    Like :func:`ngettext`, but look the message up in the specified *domain*.
       
   120 
       
   121    .. versionadded:: 2.3
       
   122 
       
   123 
       
   124 .. function:: ldngettext(domain, singular, plural, n)
       
   125 
       
   126    Equivalent to :func:`dngettext`, but the translation is returned in the
       
   127    preferred system encoding, if no other encoding was explicitly set with
       
   128    :func:`bind_textdomain_codeset`.
       
   129 
       
   130    .. versionadded:: 2.4
       
   131 
       
   132 Note that GNU :program:`gettext` also defines a :func:`dcgettext` method, but
       
   133 this was deemed not useful and so it is currently unimplemented.
       
   134 
       
   135 Here's an example of typical usage for this API::
       
   136 
       
   137    import gettext
       
   138    gettext.bindtextdomain('myapplication', '/path/to/my/language/directory')
       
   139    gettext.textdomain('myapplication')
       
   140    _ = gettext.gettext
       
   141    # ...
       
   142    print _('This is a translatable string.')
       
   143 
       
   144 
       
   145 Class-based API
       
   146 ---------------
       
   147 
       
   148 The class-based API of the :mod:`gettext` module gives you more flexibility and
       
   149 greater convenience than the GNU :program:`gettext` API.  It is the recommended
       
   150 way of localizing your Python applications and modules.  :mod:`gettext` defines
       
   151 a "translations" class which implements the parsing of GNU :file:`.mo` format
       
   152 files, and has methods for returning either standard 8-bit strings or Unicode
       
   153 strings. Instances of this "translations" class can also install themselves  in
       
   154 the built-in namespace as the function :func:`_`.
       
   155 
       
   156 
       
   157 .. function:: find(domain[, localedir[,  languages[, all]]])
       
   158 
       
   159    This function implements the standard :file:`.mo` file search algorithm.  It
       
   160    takes a *domain*, identical to what :func:`textdomain` takes.  Optional
       
   161    *localedir* is as in :func:`bindtextdomain`  Optional *languages* is a list of
       
   162    strings, where each string is a language code.
       
   163 
       
   164    If *localedir* is not given, then the default system locale directory is used.
       
   165    [#]_  If *languages* is not given, then the following environment variables are
       
   166    searched: :envvar:`LANGUAGE`, :envvar:`LC_ALL`, :envvar:`LC_MESSAGES`, and
       
   167    :envvar:`LANG`.  The first one returning a non-empty value is used for the
       
   168    *languages* variable. The environment variables should contain a colon separated
       
   169    list of languages, which will be split on the colon to produce the expected list
       
   170    of language code strings.
       
   171 
       
   172    :func:`find` then expands and normalizes the languages, and then iterates
       
   173    through them, searching for an existing file built of these components:
       
   174 
       
   175    :file:`localedir/language/LC_MESSAGES/domain.mo`
       
   176 
       
   177    The first such file name that exists is returned by :func:`find`. If no such
       
   178    file is found, then ``None`` is returned. If *all* is given, it returns a list
       
   179    of all file names, in the order in which they appear in the languages list or
       
   180    the environment variables.
       
   181 
       
   182 
       
   183 .. function:: translation(domain[, localedir[, languages[, class_[, fallback[, codeset]]]]])
       
   184 
       
   185    Return a :class:`Translations` instance based on the *domain*, *localedir*, and
       
   186    *languages*, which are first passed to :func:`find` to get a list of the
       
   187    associated :file:`.mo` file paths.  Instances with identical :file:`.mo` file
       
   188    names are cached.  The actual class instantiated is either *class_* if provided,
       
   189    otherwise :class:`GNUTranslations`.  The class's constructor must take a single
       
   190    file object argument. If provided, *codeset* will change the charset used to
       
   191    encode translated strings.
       
   192 
       
   193    If multiple files are found, later files are used as fallbacks for earlier ones.
       
   194    To allow setting the fallback, :func:`copy.copy` is used to clone each
       
   195    translation object from the cache; the actual instance data is still shared with
       
   196    the cache.
       
   197 
       
   198    If no :file:`.mo` file is found, this function raises :exc:`IOError` if
       
   199    *fallback* is false (which is the default), and returns a
       
   200    :class:`NullTranslations` instance if *fallback* is true.
       
   201 
       
   202    .. versionchanged:: 2.4
       
   203       Added the *codeset* parameter.
       
   204 
       
   205 
       
   206 .. function:: install(domain[, localedir[, unicode [, codeset[, names]]]])
       
   207 
       
   208    This installs the function :func:`_` in Python's builtin namespace, based on
       
   209    *domain*, *localedir*, and *codeset* which are passed to the function
       
   210    :func:`translation`.  The *unicode* flag is passed to the resulting translation
       
   211    object's :meth:`install` method.
       
   212 
       
   213    For the *names* parameter, please see the description of the translation
       
   214    object's :meth:`install` method.
       
   215 
       
   216    As seen below, you usually mark the strings in your application that are
       
   217    candidates for translation, by wrapping them in a call to the :func:`_`
       
   218    function, like this::
       
   219 
       
   220       print _('This string will be translated.')
       
   221 
       
   222    For convenience, you want the :func:`_` function to be installed in Python's
       
   223    builtin namespace, so it is easily accessible in all modules of your
       
   224    application.
       
   225 
       
   226    .. versionchanged:: 2.4
       
   227       Added the *codeset* parameter.
       
   228 
       
   229    .. versionchanged:: 2.5
       
   230       Added the *names* parameter.
       
   231 
       
   232 
       
   233 The :class:`NullTranslations` class
       
   234 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       
   235 
       
   236 Translation classes are what actually implement the translation of original
       
   237 source file message strings to translated message strings. The base class used
       
   238 by all translation classes is :class:`NullTranslations`; this provides the basic
       
   239 interface you can use to write your own specialized translation classes.  Here
       
   240 are the methods of :class:`NullTranslations`:
       
   241 
       
   242 
       
   243 .. class:: NullTranslations([fp])
       
   244 
       
   245    Takes an optional file object *fp*, which is ignored by the base class.
       
   246    Initializes "protected" instance variables *_info* and *_charset* which are set
       
   247    by derived classes, as well as *_fallback*, which is set through
       
   248    :meth:`add_fallback`.  It then calls ``self._parse(fp)`` if *fp* is not
       
   249    ``None``.
       
   250 
       
   251 
       
   252    .. method:: _parse(fp)
       
   253 
       
   254       No-op'd in the base class, this method takes file object *fp*, and reads
       
   255       the data from the file, initializing its message catalog.  If you have an
       
   256       unsupported message catalog file format, you should override this method
       
   257       to parse your format.
       
   258 
       
   259 
       
   260    .. method:: add_fallback(fallback)
       
   261 
       
   262       Add *fallback* as the fallback object for the current translation
       
   263       object. A translation object should consult the fallback if it cannot provide a
       
   264       translation for a given message.
       
   265 
       
   266 
       
   267    .. method:: gettext(message)
       
   268 
       
   269       If a fallback has been set, forward :meth:`gettext` to the
       
   270       fallback. Otherwise, return the translated message.  Overridden in derived
       
   271       classes.
       
   272 
       
   273 
       
   274    .. method:: lgettext(message)
       
   275 
       
   276       If a fallback has been set, forward :meth:`lgettext` to the
       
   277       fallback. Otherwise, return the translated message.  Overridden in derived
       
   278       classes.
       
   279 
       
   280       .. versionadded:: 2.4
       
   281 
       
   282 
       
   283    .. method:: ugettext(message)
       
   284 
       
   285       If a fallback has been set, forward :meth:`ugettext` to the
       
   286       fallback. Otherwise, return the translated message as a Unicode
       
   287       string. Overridden in derived classes.
       
   288 
       
   289 
       
   290    .. method:: ngettext(singular, plural, n)
       
   291 
       
   292       If a fallback has been set, forward :meth:`ngettext` to the
       
   293       fallback. Otherwise, return the translated message.  Overridden in derived
       
   294       classes.
       
   295 
       
   296       .. versionadded:: 2.3
       
   297 
       
   298 
       
   299    .. method:: lngettext(singular, plural, n)
       
   300 
       
   301       If a fallback has been set, forward :meth:`ngettext` to the
       
   302       fallback. Otherwise, return the translated message.  Overridden in derived
       
   303       classes.
       
   304 
       
   305       .. versionadded:: 2.4
       
   306 
       
   307 
       
   308    .. method:: ungettext(singular, plural, n)
       
   309 
       
   310       If a fallback has been set, forward :meth:`ungettext` to the fallback.
       
   311       Otherwise, return the translated message as a Unicode string. Overridden
       
   312       in derived classes.
       
   313 
       
   314       .. versionadded:: 2.3
       
   315 
       
   316 
       
   317    .. method:: info()
       
   318 
       
   319       Return the "protected" :attr:`_info` variable.
       
   320 
       
   321 
       
   322    .. method:: charset()
       
   323 
       
   324       Return the "protected" :attr:`_charset` variable.
       
   325 
       
   326 
       
   327    .. method:: output_charset()
       
   328 
       
   329       Return the "protected" :attr:`_output_charset` variable, which defines the
       
   330       encoding used to return translated messages.
       
   331 
       
   332       .. versionadded:: 2.4
       
   333 
       
   334 
       
   335    .. method:: set_output_charset(charset)
       
   336 
       
   337       Change the "protected" :attr:`_output_charset` variable, which defines the
       
   338       encoding used to return translated messages.
       
   339 
       
   340       .. versionadded:: 2.4
       
   341 
       
   342 
       
   343    .. method:: install([unicode [, names]])
       
   344 
       
   345       If the *unicode* flag is false, this method installs :meth:`self.gettext`
       
   346       into the built-in namespace, binding it to ``_``.  If *unicode* is true,
       
   347       it binds :meth:`self.ugettext` instead.  By default, *unicode* is false.
       
   348 
       
   349       If the *names* parameter is given, it must be a sequence containing the
       
   350       names of functions you want to install in the builtin namespace in
       
   351       addition to :func:`_`.  Supported names are ``'gettext'`` (bound to
       
   352       :meth:`self.gettext` or :meth:`self.ugettext` according to the *unicode*
       
   353       flag), ``'ngettext'`` (bound to :meth:`self.ngettext` or
       
   354       :meth:`self.ungettext` according to the *unicode* flag), ``'lgettext'``
       
   355       and ``'lngettext'``.
       
   356 
       
   357       Note that this is only one way, albeit the most convenient way, to make
       
   358       the :func:`_` function available to your application.  Because it affects
       
   359       the entire application globally, and specifically the built-in namespace,
       
   360       localized modules should never install :func:`_`. Instead, they should use
       
   361       this code to make :func:`_` available to their module::
       
   362 
       
   363          import gettext
       
   364          t = gettext.translation('mymodule', ...)
       
   365          _ = t.gettext
       
   366 
       
   367       This puts :func:`_` only in the module's global namespace and so only
       
   368       affects calls within this module.
       
   369 
       
   370       .. versionchanged:: 2.5
       
   371          Added the *names* parameter.
       
   372 
       
   373 
       
   374 The :class:`GNUTranslations` class
       
   375 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       
   376 
       
   377 The :mod:`gettext` module provides one additional class derived from
       
   378 :class:`NullTranslations`: :class:`GNUTranslations`.  This class overrides
       
   379 :meth:`_parse` to enable reading GNU :program:`gettext` format :file:`.mo` files
       
   380 in both big-endian and little-endian format. It also coerces both message ids
       
   381 and message strings to Unicode.
       
   382 
       
   383 :class:`GNUTranslations` parses optional meta-data out of the translation
       
   384 catalog.  It is convention with GNU :program:`gettext` to include meta-data as
       
   385 the translation for the empty string.  This meta-data is in :rfc:`822`\ -style
       
   386 ``key: value`` pairs, and should contain the ``Project-Id-Version`` key.  If the
       
   387 key ``Content-Type`` is found, then the ``charset`` property is used to
       
   388 initialize the "protected" :attr:`_charset` instance variable, defaulting to
       
   389 ``None`` if not found.  If the charset encoding is specified, then all message
       
   390 ids and message strings read from the catalog are converted to Unicode using
       
   391 this encoding.  The :meth:`ugettext` method always returns a Unicode, while the
       
   392 :meth:`gettext` returns an encoded 8-bit string.  For the message id arguments
       
   393 of both methods, either Unicode strings or 8-bit strings containing only
       
   394 US-ASCII characters are acceptable.  Note that the Unicode version of the
       
   395 methods (i.e. :meth:`ugettext` and :meth:`ungettext`) are the recommended
       
   396 interface to use for internationalized Python programs.
       
   397 
       
   398 The entire set of key/value pairs are placed into a dictionary and set as the
       
   399 "protected" :attr:`_info` instance variable.
       
   400 
       
   401 If the :file:`.mo` file's magic number is invalid, or if other problems occur
       
   402 while reading the file, instantiating a :class:`GNUTranslations` class can raise
       
   403 :exc:`IOError`.
       
   404 
       
   405 The following methods are overridden from the base class implementation:
       
   406 
       
   407 
       
   408 .. method:: GNUTranslations.gettext(message)
       
   409 
       
   410    Look up the *message* id in the catalog and return the corresponding message
       
   411    string, as an 8-bit string encoded with the catalog's charset encoding, if
       
   412    known.  If there is no entry in the catalog for the *message* id, and a fallback
       
   413    has been set, the look up is forwarded to the fallback's :meth:`gettext` method.
       
   414    Otherwise, the *message* id is returned.
       
   415 
       
   416 
       
   417 .. method:: GNUTranslations.lgettext(message)
       
   418 
       
   419    Equivalent to :meth:`gettext`, but the translation is returned in the preferred
       
   420    system encoding, if no other encoding was explicitly set with
       
   421    :meth:`set_output_charset`.
       
   422 
       
   423    .. versionadded:: 2.4
       
   424 
       
   425 
       
   426 .. method:: GNUTranslations.ugettext(message)
       
   427 
       
   428    Look up the *message* id in the catalog and return the corresponding message
       
   429    string, as a Unicode string.  If there is no entry in the catalog for the
       
   430    *message* id, and a fallback has been set, the look up is forwarded to the
       
   431    fallback's :meth:`ugettext` method.  Otherwise, the *message* id is returned.
       
   432 
       
   433 
       
   434 .. method:: GNUTranslations.ngettext(singular, plural, n)
       
   435 
       
   436    Do a plural-forms lookup of a message id.  *singular* is used as the message id
       
   437    for purposes of lookup in the catalog, while *n* is used to determine which
       
   438    plural form to use.  The returned message string is an 8-bit string encoded with
       
   439    the catalog's charset encoding, if known.
       
   440 
       
   441    If the message id is not found in the catalog, and a fallback is specified, the
       
   442    request is forwarded to the fallback's :meth:`ngettext` method.  Otherwise, when
       
   443    *n* is 1 *singular* is returned, and *plural* is returned in all other cases.
       
   444 
       
   445    .. versionadded:: 2.3
       
   446 
       
   447 
       
   448 .. method:: GNUTranslations.lngettext(singular, plural, n)
       
   449 
       
   450    Equivalent to :meth:`gettext`, but the translation is returned in the preferred
       
   451    system encoding, if no other encoding was explicitly set with
       
   452    :meth:`set_output_charset`.
       
   453 
       
   454    .. versionadded:: 2.4
       
   455 
       
   456 
       
   457 .. method:: GNUTranslations.ungettext(singular, plural, n)
       
   458 
       
   459    Do a plural-forms lookup of a message id.  *singular* is used as the message id
       
   460    for purposes of lookup in the catalog, while *n* is used to determine which
       
   461    plural form to use.  The returned message string is a Unicode string.
       
   462 
       
   463    If the message id is not found in the catalog, and a fallback is specified, the
       
   464    request is forwarded to the fallback's :meth:`ungettext` method.  Otherwise,
       
   465    when *n* is 1 *singular* is returned, and *plural* is returned in all other
       
   466    cases.
       
   467 
       
   468    Here is an example::
       
   469 
       
   470       n = len(os.listdir('.'))
       
   471       cat = GNUTranslations(somefile)
       
   472       message = cat.ungettext(
       
   473           'There is %(num)d file in this directory',
       
   474           'There are %(num)d files in this directory',
       
   475           n) % {'num': n}
       
   476 
       
   477    .. versionadded:: 2.3
       
   478 
       
   479 
       
   480 Solaris message catalog support
       
   481 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       
   482 
       
   483 The Solaris operating system defines its own binary :file:`.mo` file format, but
       
   484 since no documentation can be found on this format, it is not supported at this
       
   485 time.
       
   486 
       
   487 
       
   488 The Catalog constructor
       
   489 ^^^^^^^^^^^^^^^^^^^^^^^
       
   490 
       
   491 .. index:: single: GNOME
       
   492 
       
   493 GNOME uses a version of the :mod:`gettext` module by James Henstridge, but this
       
   494 version has a slightly different API.  Its documented usage was::
       
   495 
       
   496    import gettext
       
   497    cat = gettext.Catalog(domain, localedir)
       
   498    _ = cat.gettext
       
   499    print _('hello world')
       
   500 
       
   501 For compatibility with this older module, the function :func:`Catalog` is an
       
   502 alias for the :func:`translation` function described above.
       
   503 
       
   504 One difference between this module and Henstridge's: his catalog objects
       
   505 supported access through a mapping API, but this appears to be unused and so is
       
   506 not currently supported.
       
   507 
       
   508 
       
   509 Internationalizing your programs and modules
       
   510 --------------------------------------------
       
   511 
       
   512 Internationalization (I18N) refers to the operation by which a program is made
       
   513 aware of multiple languages.  Localization (L10N) refers to the adaptation of
       
   514 your program, once internationalized, to the local language and cultural habits.
       
   515 In order to provide multilingual messages for your Python programs, you need to
       
   516 take the following steps:
       
   517 
       
   518 #. prepare your program or module by specially marking translatable strings
       
   519 
       
   520 #. run a suite of tools over your marked files to generate raw messages catalogs
       
   521 
       
   522 #. create language specific translations of the message catalogs
       
   523 
       
   524 #. use the :mod:`gettext` module so that message strings are properly translated
       
   525 
       
   526 In order to prepare your code for I18N, you need to look at all the strings in
       
   527 your files.  Any string that needs to be translated should be marked by wrapping
       
   528 it in ``_('...')`` --- that is, a call to the function :func:`_`.  For example::
       
   529 
       
   530    filename = 'mylog.txt'
       
   531    message = _('writing a log message')
       
   532    fp = open(filename, 'w')
       
   533    fp.write(message)
       
   534    fp.close()
       
   535 
       
   536 In this example, the string ``'writing a log message'`` is marked as a candidate
       
   537 for translation, while the strings ``'mylog.txt'`` and ``'w'`` are not.
       
   538 
       
   539 The Python distribution comes with two tools which help you generate the message
       
   540 catalogs once you've prepared your source code.  These may or may not be
       
   541 available from a binary distribution, but they can be found in a source
       
   542 distribution, in the :file:`Tools/i18n` directory.
       
   543 
       
   544 The :program:`pygettext` [#]_ program scans all your Python source code looking
       
   545 for the strings you previously marked as translatable.  It is similar to the GNU
       
   546 :program:`gettext` program except that it understands all the intricacies of
       
   547 Python source code, but knows nothing about C or C++ source code.  You don't
       
   548 need GNU ``gettext`` unless you're also going to be translating C code (such as
       
   549 C extension modules).
       
   550 
       
   551 :program:`pygettext` generates textual Uniforum-style human readable message
       
   552 catalog :file:`.pot` files, essentially structured human readable files which
       
   553 contain every marked string in the source code, along with a placeholder for the
       
   554 translation strings. :program:`pygettext` is a command line script that supports
       
   555 a similar command line interface as :program:`xgettext`; for details on its use,
       
   556 run::
       
   557 
       
   558    pygettext.py --help
       
   559 
       
   560 Copies of these :file:`.pot` files are then handed over to the individual human
       
   561 translators who write language-specific versions for every supported natural
       
   562 language.  They send you back the filled in language-specific versions as a
       
   563 :file:`.po` file.  Using the :program:`msgfmt.py` [#]_ program (in the
       
   564 :file:`Tools/i18n` directory), you take the :file:`.po` files from your
       
   565 translators and generate the machine-readable :file:`.mo` binary catalog files.
       
   566 The :file:`.mo` files are what the :mod:`gettext` module uses for the actual
       
   567 translation processing during run-time.
       
   568 
       
   569 How you use the :mod:`gettext` module in your code depends on whether you are
       
   570 internationalizing a single module or your entire application. The next two
       
   571 sections will discuss each case.
       
   572 
       
   573 
       
   574 Localizing your module
       
   575 ^^^^^^^^^^^^^^^^^^^^^^
       
   576 
       
   577 If you are localizing your module, you must take care not to make global
       
   578 changes, e.g. to the built-in namespace.  You should not use the GNU ``gettext``
       
   579 API but instead the class-based API.
       
   580 
       
   581 Let's say your module is called "spam" and the module's various natural language
       
   582 translation :file:`.mo` files reside in :file:`/usr/share/locale` in GNU
       
   583 :program:`gettext` format.  Here's what you would put at the top of your
       
   584 module::
       
   585 
       
   586    import gettext
       
   587    t = gettext.translation('spam', '/usr/share/locale')
       
   588    _ = t.lgettext
       
   589 
       
   590 If your translators were providing you with Unicode strings in their :file:`.po`
       
   591 files, you'd instead do::
       
   592 
       
   593    import gettext
       
   594    t = gettext.translation('spam', '/usr/share/locale')
       
   595    _ = t.ugettext
       
   596 
       
   597 
       
   598 Localizing your application
       
   599 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
       
   600 
       
   601 If you are localizing your application, you can install the :func:`_` function
       
   602 globally into the built-in namespace, usually in the main driver file of your
       
   603 application.  This will let all your application-specific files just use
       
   604 ``_('...')`` without having to explicitly install it in each file.
       
   605 
       
   606 In the simple case then, you need only add the following bit of code to the main
       
   607 driver file of your application::
       
   608 
       
   609    import gettext
       
   610    gettext.install('myapplication')
       
   611 
       
   612 If you need to set the locale directory or the *unicode* flag, you can pass
       
   613 these into the :func:`install` function::
       
   614 
       
   615    import gettext
       
   616    gettext.install('myapplication', '/usr/share/locale', unicode=1)
       
   617 
       
   618 
       
   619 Changing languages on the fly
       
   620 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       
   621 
       
   622 If your program needs to support many languages at the same time, you may want
       
   623 to create multiple translation instances and then switch between them
       
   624 explicitly, like so::
       
   625 
       
   626    import gettext
       
   627 
       
   628    lang1 = gettext.translation('myapplication', languages=['en'])
       
   629    lang2 = gettext.translation('myapplication', languages=['fr'])
       
   630    lang3 = gettext.translation('myapplication', languages=['de'])
       
   631 
       
   632    # start by using language1
       
   633    lang1.install()
       
   634 
       
   635    # ... time goes by, user selects language 2
       
   636    lang2.install()
       
   637 
       
   638    # ... more time goes by, user selects language 3
       
   639    lang3.install()
       
   640 
       
   641 
       
   642 Deferred translations
       
   643 ^^^^^^^^^^^^^^^^^^^^^
       
   644 
       
   645 In most coding situations, strings are translated where they are coded.
       
   646 Occasionally however, you need to mark strings for translation, but defer actual
       
   647 translation until later.  A classic example is::
       
   648 
       
   649    animals = ['mollusk',
       
   650               'albatross',
       
   651    	   'rat',
       
   652    	   'penguin',
       
   653    	   'python',
       
   654    	   ]
       
   655    # ...
       
   656    for a in animals:
       
   657        print a
       
   658 
       
   659 Here, you want to mark the strings in the ``animals`` list as being
       
   660 translatable, but you don't actually want to translate them until they are
       
   661 printed.
       
   662 
       
   663 Here is one way you can handle this situation::
       
   664 
       
   665    def _(message): return message
       
   666 
       
   667    animals = [_('mollusk'),
       
   668               _('albatross'),
       
   669    	   _('rat'),
       
   670    	   _('penguin'),
       
   671    	   _('python'),
       
   672    	   ]
       
   673 
       
   674    del _
       
   675 
       
   676    # ...
       
   677    for a in animals:
       
   678        print _(a)
       
   679 
       
   680 This works because the dummy definition of :func:`_` simply returns the string
       
   681 unchanged.  And this dummy definition will temporarily override any definition
       
   682 of :func:`_` in the built-in namespace (until the :keyword:`del` command). Take
       
   683 care, though if you have a previous definition of :func:`_` in the local
       
   684 namespace.
       
   685 
       
   686 Note that the second use of :func:`_` will not identify "a" as being
       
   687 translatable to the :program:`pygettext` program, since it is not a string.
       
   688 
       
   689 Another way to handle this is with the following example::
       
   690 
       
   691    def N_(message): return message
       
   692 
       
   693    animals = [N_('mollusk'),
       
   694               N_('albatross'),
       
   695    	   N_('rat'),
       
   696    	   N_('penguin'),
       
   697    	   N_('python'),
       
   698    	   ]
       
   699 
       
   700    # ...
       
   701    for a in animals:
       
   702        print _(a)
       
   703 
       
   704 In this case, you are marking translatable strings with the function :func:`N_`,
       
   705 [#]_ which won't conflict with any definition of :func:`_`.  However, you will
       
   706 need to teach your message extraction program to look for translatable strings
       
   707 marked with :func:`N_`. :program:`pygettext` and :program:`xpot` both support
       
   708 this through the use of command line switches.
       
   709 
       
   710 
       
   711 :func:`gettext` vs. :func:`lgettext`
       
   712 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       
   713 
       
   714 In Python 2.4 the :func:`lgettext` family of functions were introduced. The
       
   715 intention of these functions is to provide an alternative which is more
       
   716 compliant with the current implementation of GNU gettext. Unlike
       
   717 :func:`gettext`, which returns strings encoded with the same codeset used in the
       
   718 translation file, :func:`lgettext` will return strings encoded with the
       
   719 preferred system encoding, as returned by :func:`locale.getpreferredencoding`.
       
   720 Also notice that Python 2.4 introduces new functions to explicitly choose the
       
   721 codeset used in translated strings. If a codeset is explicitly set, even
       
   722 :func:`lgettext` will return translated strings in the requested codeset, as
       
   723 would be expected in the GNU gettext implementation.
       
   724 
       
   725 
       
   726 Acknowledgements
       
   727 ----------------
       
   728 
       
   729 The following people contributed code, feedback, design suggestions, previous
       
   730 implementations, and valuable experience to the creation of this module:
       
   731 
       
   732 * Peter Funk
       
   733 
       
   734 * James Henstridge
       
   735 
       
   736 * Juan David Ibáñez Palomar
       
   737 
       
   738 * Marc-André Lemburg
       
   739 
       
   740 * Martin von Löwis
       
   741 
       
   742 * François Pinard
       
   743 
       
   744 * Barry Warsaw
       
   745 
       
   746 * Gustavo Niemeyer
       
   747 
       
   748 .. rubric:: Footnotes
       
   749 
       
   750 .. [#] The default locale directory is system dependent; for example, on RedHat Linux
       
   751    it is :file:`/usr/share/locale`, but on Solaris it is :file:`/usr/lib/locale`.
       
   752    The :mod:`gettext` module does not try to support these system dependent
       
   753    defaults; instead its default is :file:`sys.prefix/share/locale`. For this
       
   754    reason, it is always best to call :func:`bindtextdomain` with an explicit
       
   755    absolute path at the start of your application.
       
   756 
       
   757 .. [#] See the footnote for :func:`bindtextdomain` above.
       
   758 
       
   759 .. [#] François Pinard has written a program called :program:`xpot` which does a
       
   760    similar job.  It is available as part of his :program:`po-utils` package at http
       
   761    ://po-utils.progiciels-bpi.ca/.
       
   762 
       
   763 .. [#] :program:`msgfmt.py` is binary compatible with GNU :program:`msgfmt` except that
       
   764    it provides a simpler, all-Python implementation.  With this and
       
   765    :program:`pygettext.py`, you generally won't need to install the GNU
       
   766    :program:`gettext` package to internationalize your Python applications.
       
   767 
       
   768 .. [#] The choice of :func:`N_` here is totally arbitrary; it could have just as easily
       
   769    been :func:`MarkThisStringForTranslation`.
       
   770