blob: ef315e041e1377899bd19bae958c9d679781bdbc [file] [log] [blame]
Georg Brandl116aa622007-08-15 14:28:22 +00001:mod:`gettext` --- Multilingual internationalization services
2=============================================================
3
4.. module:: gettext
5 :synopsis: Multilingual internationalization services.
Terry Jan Reedyfa089b92016-06-11 15:02:54 -04006
Andrew Kuchling587e9702013-11-12 10:02:35 -05007.. moduleauthor:: Barry A. Warsaw <barry@python.org>
8.. sectionauthor:: Barry A. Warsaw <barry@python.org>
Georg Brandl116aa622007-08-15 14:28:22 +00009
Raymond Hettinger469271d2011-01-27 20:38:46 +000010**Source code:** :source:`Lib/gettext.py`
11
12--------------
Georg Brandl116aa622007-08-15 14:28:22 +000013
14The :mod:`gettext` module provides internationalization (I18N) and localization
15(L10N) services for your Python modules and applications. It supports both the
16GNU ``gettext`` message catalog API and a higher level, class-based API that may
17be more appropriate for Python files. The interface described below allows you
18to write your module and application messages in one natural language, and
19provide a catalog of translated messages for running under different natural
20languages.
21
22Some hints on localizing your Python modules and applications are also given.
23
24
25GNU :program:`gettext` API
26--------------------------
27
28The :mod:`gettext` module defines the following API, which is very similar to
29the GNU :program:`gettext` API. If you use this API you will affect the
30translation of your entire application globally. Often this is what you want if
31your application is monolingual, with the choice of language dependent on the
32locale of your user. If you are localizing a Python module, or if your
33application needs to switch languages on the fly, you probably want to use the
34class-based API instead.
35
36
Georg Brandl036490d2009-05-17 13:00:36 +000037.. function:: bindtextdomain(domain, localedir=None)
Georg Brandl116aa622007-08-15 14:28:22 +000038
39 Bind the *domain* to the locale directory *localedir*. More concretely,
40 :mod:`gettext` will look for binary :file:`.mo` files for the given domain using
41 the path (on Unix): :file:`localedir/language/LC_MESSAGES/domain.mo`, where
42 *languages* is searched for in the environment variables :envvar:`LANGUAGE`,
43 :envvar:`LC_ALL`, :envvar:`LC_MESSAGES`, and :envvar:`LANG` respectively.
44
45 If *localedir* is omitted or ``None``, then the current binding for *domain* is
46 returned. [#]_
47
48
Georg Brandl036490d2009-05-17 13:00:36 +000049.. function:: bind_textdomain_codeset(domain, codeset=None)
Georg Brandl116aa622007-08-15 14:28:22 +000050
Serhiy Storchaka26cb4652017-06-20 17:13:29 +030051 Bind the *domain* to *codeset*, changing the encoding of byte strings
52 returned by the :func:`lgettext`, :func:`ldgettext`, :func:`lngettext`
53 and :func:`ldngettext` functions.
54 If *codeset* is omitted, then the current binding is returned.
Georg Brandl116aa622007-08-15 14:28:22 +000055
Serhiy Storchakafec35c92018-10-27 08:00:41 +030056 .. deprecated-removed:: 3.8 3.10
57
Georg Brandl116aa622007-08-15 14:28:22 +000058
Georg Brandl036490d2009-05-17 13:00:36 +000059.. function:: textdomain(domain=None)
Georg Brandl116aa622007-08-15 14:28:22 +000060
61 Change or query the current global domain. If *domain* is ``None``, then the
62 current global domain is returned, otherwise the global domain is set to
63 *domain*, which is returned.
64
65
Serhiy Storchaka913876d2018-10-28 13:41:26 +020066.. index:: single: _ (underscore); gettext
Georg Brandl116aa622007-08-15 14:28:22 +000067.. function:: gettext(message)
68
69 Return the localized translation of *message*, based on the current global
70 domain, language, and locale directory. This function is usually aliased as
71 :func:`_` in the local namespace (see examples below).
72
73
Georg Brandl116aa622007-08-15 14:28:22 +000074.. function:: dgettext(domain, message)
75
Serhiy Storchaka26cb4652017-06-20 17:13:29 +030076 Like :func:`.gettext`, but look the message up in the specified *domain*.
Georg Brandl116aa622007-08-15 14:28:22 +000077
Georg Brandl116aa622007-08-15 14:28:22 +000078
79.. function:: ngettext(singular, plural, n)
80
Serhiy Storchaka26cb4652017-06-20 17:13:29 +030081 Like :func:`.gettext`, but consider plural forms. If a translation is found,
Georg Brandl116aa622007-08-15 14:28:22 +000082 apply the plural formula to *n*, and return the resulting message (some
83 languages have more than two plural forms). If no translation is found, return
84 *singular* if *n* is 1; return *plural* otherwise.
85
86 The Plural formula is taken from the catalog header. It is a C or Python
87 expression that has a free variable *n*; the expression evaluates to the index
Andrew Kuchling30c5ad22013-11-19 11:05:20 -050088 of the plural in the catalog. See
89 `the GNU gettext documentation <https://www.gnu.org/software/gettext/manual/gettext.html>`__
90 for the precise syntax to be used in :file:`.po` files and the
91 formulas for a variety of languages.
Georg Brandl116aa622007-08-15 14:28:22 +000092
Georg Brandl116aa622007-08-15 14:28:22 +000093
Georg Brandl116aa622007-08-15 14:28:22 +000094.. function:: dngettext(domain, singular, plural, n)
95
96 Like :func:`ngettext`, but look the message up in the specified *domain*.
97
Georg Brandl116aa622007-08-15 14:28:22 +000098
Serhiy Storchaka26cb4652017-06-20 17:13:29 +030099.. function:: lgettext(message)
100.. function:: ldgettext(domain, message)
101.. function:: lngettext(singular, plural, n)
Georg Brandl116aa622007-08-15 14:28:22 +0000102.. function:: ldngettext(domain, singular, plural, n)
103
Serhiy Storchaka26cb4652017-06-20 17:13:29 +0300104 Equivalent to the corresponding functions without the ``l`` prefix
105 (:func:`.gettext`, :func:`dgettext`, :func:`ngettext` and :func:`dngettext`),
106 but the translation is returned as a byte string encoded in the preferred
107 system encoding if no other encoding was explicitly set with
Georg Brandl116aa622007-08-15 14:28:22 +0000108 :func:`bind_textdomain_codeset`.
109
Serhiy Storchaka26cb4652017-06-20 17:13:29 +0300110 .. warning::
111
112 These functions should be avoided in Python 3, because they return
113 encoded bytes. It's much better to use alternatives which return
114 Unicode strings instead, since most Python applications will want to
115 manipulate human readable text as strings instead of bytes. Further,
116 it's possible that you may get unexpected Unicode-related exceptions
Serhiy Storchakafec35c92018-10-27 08:00:41 +0300117 if there are encoding problems with the translated strings.
118
119 .. deprecated-removed:: 3.8 3.10
Serhiy Storchaka26cb4652017-06-20 17:13:29 +0300120
Georg Brandl116aa622007-08-15 14:28:22 +0000121
122Note that GNU :program:`gettext` also defines a :func:`dcgettext` method, but
123this was deemed not useful and so it is currently unimplemented.
124
125Here's an example of typical usage for this API::
126
127 import gettext
128 gettext.bindtextdomain('myapplication', '/path/to/my/language/directory')
129 gettext.textdomain('myapplication')
130 _ = gettext.gettext
131 # ...
Georg Brandl6911e3c2007-09-04 07:15:32 +0000132 print(_('This is a translatable string.'))
Georg Brandl116aa622007-08-15 14:28:22 +0000133
134
135Class-based API
136---------------
137
138The class-based API of the :mod:`gettext` module gives you more flexibility and
139greater convenience than the GNU :program:`gettext` API. It is the recommended
Serhiy Storchakac02a1f42017-10-04 20:28:20 +0300140way of localizing your Python applications and modules. :mod:`!gettext` defines
Georg Brandl116aa622007-08-15 14:28:22 +0000141a "translations" class which implements the parsing of GNU :file:`.mo` format
Georg Brandlf6945182008-02-01 11:56:49 +0000142files, and has methods for returning strings. Instances of this "translations"
143class can also install themselves in the built-in namespace as the function
144:func:`_`.
Georg Brandl116aa622007-08-15 14:28:22 +0000145
146
Georg Brandl036490d2009-05-17 13:00:36 +0000147.. function:: find(domain, localedir=None, languages=None, all=False)
Georg Brandl116aa622007-08-15 14:28:22 +0000148
149 This function implements the standard :file:`.mo` file search algorithm. It
150 takes a *domain*, identical to what :func:`textdomain` takes. Optional
151 *localedir* is as in :func:`bindtextdomain` Optional *languages* is a list of
152 strings, where each string is a language code.
153
154 If *localedir* is not given, then the default system locale directory is used.
155 [#]_ If *languages* is not given, then the following environment variables are
156 searched: :envvar:`LANGUAGE`, :envvar:`LC_ALL`, :envvar:`LC_MESSAGES`, and
157 :envvar:`LANG`. The first one returning a non-empty value is used for the
158 *languages* variable. The environment variables should contain a colon separated
159 list of languages, which will be split on the colon to produce the expected list
160 of language code strings.
161
162 :func:`find` then expands and normalizes the languages, and then iterates
163 through them, searching for an existing file built of these components:
164
Georg Brandl036490d2009-05-17 13:00:36 +0000165 :file:`{localedir}/{language}/LC_MESSAGES/{domain}.mo`
Georg Brandl116aa622007-08-15 14:28:22 +0000166
167 The first such file name that exists is returned by :func:`find`. If no such
168 file is found, then ``None`` is returned. If *all* is given, it returns a list
169 of all file names, in the order in which they appear in the languages list or
170 the environment variables.
171
172
Georg Brandl036490d2009-05-17 13:00:36 +0000173.. function:: translation(domain, localedir=None, languages=None, class_=None, fallback=False, codeset=None)
Georg Brandl116aa622007-08-15 14:28:22 +0000174
Georg Brandlbded4d32008-07-17 18:15:35 +0000175 Return a :class:`Translations` instance based on the *domain*, *localedir*,
176 and *languages*, which are first passed to :func:`find` to get a list of the
Georg Brandl116aa622007-08-15 14:28:22 +0000177 associated :file:`.mo` file paths. Instances with identical :file:`.mo` file
Georg Brandlbded4d32008-07-17 18:15:35 +0000178 names are cached. The actual class instantiated is either *class_* if
179 provided, otherwise :class:`GNUTranslations`. The class's constructor must
Antoine Pitrou11cb9612010-09-15 11:11:28 +0000180 take a single :term:`file object` argument. If provided, *codeset* will change
Serhiy Storchaka26cb4652017-06-20 17:13:29 +0300181 the charset used to encode translated strings in the
182 :meth:`~NullTranslations.lgettext` and :meth:`~NullTranslations.lngettext`
183 methods.
Georg Brandl116aa622007-08-15 14:28:22 +0000184
185 If multiple files are found, later files are used as fallbacks for earlier ones.
186 To allow setting the fallback, :func:`copy.copy` is used to clone each
187 translation object from the cache; the actual instance data is still shared with
188 the cache.
189
Antoine Pitrou62ab10a02011-10-12 20:10:51 +0200190 If no :file:`.mo` file is found, this function raises :exc:`OSError` if
Georg Brandl116aa622007-08-15 14:28:22 +0000191 *fallback* is false (which is the default), and returns a
192 :class:`NullTranslations` instance if *fallback* is true.
193
Antoine Pitrou62ab10a02011-10-12 20:10:51 +0200194 .. versionchanged:: 3.3
195 :exc:`IOError` used to be raised instead of :exc:`OSError`.
196
Serhiy Storchakafec35c92018-10-27 08:00:41 +0300197 .. deprecated-removed:: 3.8 3.10
198 The *codeset* parameter.
199
Georg Brandl116aa622007-08-15 14:28:22 +0000200
Georg Brandl036490d2009-05-17 13:00:36 +0000201.. function:: install(domain, localedir=None, codeset=None, names=None)
Georg Brandl116aa622007-08-15 14:28:22 +0000202
Georg Brandl22b34312009-07-26 14:54:51 +0000203 This installs the function :func:`_` in Python's builtins namespace, based on
Georg Brandl116aa622007-08-15 14:28:22 +0000204 *domain*, *localedir*, and *codeset* which are passed to the function
Benjamin Peterson801844d2008-07-14 14:32:15 +0000205 :func:`translation`.
Georg Brandl116aa622007-08-15 14:28:22 +0000206
207 For the *names* parameter, please see the description of the translation
Alexandre Vassalotti6d3dfc32009-07-29 19:54:39 +0000208 object's :meth:`~NullTranslations.install` method.
Georg Brandl116aa622007-08-15 14:28:22 +0000209
210 As seen below, you usually mark the strings in your application that are
211 candidates for translation, by wrapping them in a call to the :func:`_`
212 function, like this::
213
Georg Brandl6911e3c2007-09-04 07:15:32 +0000214 print(_('This string will be translated.'))
Georg Brandl116aa622007-08-15 14:28:22 +0000215
216 For convenience, you want the :func:`_` function to be installed in Python's
Georg Brandl22b34312009-07-26 14:54:51 +0000217 builtins namespace, so it is easily accessible in all modules of your
Georg Brandl116aa622007-08-15 14:28:22 +0000218 application.
219
Serhiy Storchakafec35c92018-10-27 08:00:41 +0300220 .. deprecated-removed:: 3.8 3.10
221 The *codeset* parameter.
222
Georg Brandl116aa622007-08-15 14:28:22 +0000223
224The :class:`NullTranslations` class
225^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
226
227Translation classes are what actually implement the translation of original
228source file message strings to translated message strings. The base class used
229by all translation classes is :class:`NullTranslations`; this provides the basic
230interface you can use to write your own specialized translation classes. Here
Serhiy Storchakac02a1f42017-10-04 20:28:20 +0300231are the methods of :class:`!NullTranslations`:
Georg Brandl116aa622007-08-15 14:28:22 +0000232
233
Georg Brandl036490d2009-05-17 13:00:36 +0000234.. class:: NullTranslations(fp=None)
Georg Brandl116aa622007-08-15 14:28:22 +0000235
Antoine Pitrou11cb9612010-09-15 11:11:28 +0000236 Takes an optional :term:`file object` *fp*, which is ignored by the base class.
Georg Brandl116aa622007-08-15 14:28:22 +0000237 Initializes "protected" instance variables *_info* and *_charset* which are set
238 by derived classes, as well as *_fallback*, which is set through
239 :meth:`add_fallback`. It then calls ``self._parse(fp)`` if *fp* is not
240 ``None``.
241
Georg Brandlbded4d32008-07-17 18:15:35 +0000242 .. method:: _parse(fp)
Georg Brandl116aa622007-08-15 14:28:22 +0000243
Georg Brandlbded4d32008-07-17 18:15:35 +0000244 No-op'd in the base class, this method takes file object *fp*, and reads
245 the data from the file, initializing its message catalog. If you have an
246 unsupported message catalog file format, you should override this method
247 to parse your format.
Georg Brandl116aa622007-08-15 14:28:22 +0000248
249
Georg Brandlbded4d32008-07-17 18:15:35 +0000250 .. method:: add_fallback(fallback)
Georg Brandl116aa622007-08-15 14:28:22 +0000251
Georg Brandlbded4d32008-07-17 18:15:35 +0000252 Add *fallback* as the fallback object for the current translation object.
253 A translation object should consult the fallback if it cannot provide a
254 translation for a given message.
Georg Brandl116aa622007-08-15 14:28:22 +0000255
256
Georg Brandlbded4d32008-07-17 18:15:35 +0000257 .. method:: gettext(message)
Georg Brandl116aa622007-08-15 14:28:22 +0000258
Serhiy Storchakac02a1f42017-10-04 20:28:20 +0300259 If a fallback has been set, forward :meth:`!gettext` to the fallback.
Serhiy Storchaka26cb4652017-06-20 17:13:29 +0300260 Otherwise, return *message*. Overridden in derived classes.
Georg Brandl116aa622007-08-15 14:28:22 +0000261
Georg Brandl116aa622007-08-15 14:28:22 +0000262
Georg Brandlbded4d32008-07-17 18:15:35 +0000263 .. method:: ngettext(singular, plural, n)
Georg Brandl116aa622007-08-15 14:28:22 +0000264
Serhiy Storchakac02a1f42017-10-04 20:28:20 +0300265 If a fallback has been set, forward :meth:`!ngettext` to the fallback.
Serhiy Storchaka26cb4652017-06-20 17:13:29 +0300266 Otherwise, return *singular* if *n* is 1; return *plural* otherwise.
267 Overridden in derived classes.
Georg Brandl116aa622007-08-15 14:28:22 +0000268
269
Serhiy Storchaka26cb4652017-06-20 17:13:29 +0300270 .. method:: lgettext(message)
Georg Brandlbded4d32008-07-17 18:15:35 +0000271 .. method:: lngettext(singular, plural, n)
Georg Brandl116aa622007-08-15 14:28:22 +0000272
Serhiy Storchakac02a1f42017-10-04 20:28:20 +0300273 Equivalent to :meth:`.gettext` and :meth:`.ngettext`, but the translation
Serhiy Storchaka26cb4652017-06-20 17:13:29 +0300274 is returned as a byte string encoded in the preferred system encoding
275 if no encoding was explicitly set with :meth:`set_output_charset`.
276 Overridden in derived classes.
277
278 .. warning::
279
280 These methods should be avoided in Python 3. See the warning for the
281 :func:`lgettext` function.
Georg Brandl116aa622007-08-15 14:28:22 +0000282
Serhiy Storchakafec35c92018-10-27 08:00:41 +0300283 .. deprecated-removed:: 3.8 3.10
284
Georg Brandl116aa622007-08-15 14:28:22 +0000285
Georg Brandlbded4d32008-07-17 18:15:35 +0000286 .. method:: info()
Georg Brandl116aa622007-08-15 14:28:22 +0000287
Georg Brandlbded4d32008-07-17 18:15:35 +0000288 Return the "protected" :attr:`_info` variable.
Georg Brandl116aa622007-08-15 14:28:22 +0000289
Georg Brandl116aa622007-08-15 14:28:22 +0000290
Georg Brandlbded4d32008-07-17 18:15:35 +0000291 .. method:: charset()
Georg Brandl116aa622007-08-15 14:28:22 +0000292
Serhiy Storchaka26cb4652017-06-20 17:13:29 +0300293 Return the encoding of the message catalog file.
Georg Brandl116aa622007-08-15 14:28:22 +0000294
Georg Brandl116aa622007-08-15 14:28:22 +0000295
Georg Brandlbded4d32008-07-17 18:15:35 +0000296 .. method:: output_charset()
Georg Brandl116aa622007-08-15 14:28:22 +0000297
Serhiy Storchaka26cb4652017-06-20 17:13:29 +0300298 Return the encoding used to return translated messages in :meth:`.lgettext`
299 and :meth:`.lngettext`.
Georg Brandl116aa622007-08-15 14:28:22 +0000300
Serhiy Storchakafec35c92018-10-27 08:00:41 +0300301 .. deprecated-removed:: 3.8 3.10
302
Georg Brandl116aa622007-08-15 14:28:22 +0000303
Georg Brandlbded4d32008-07-17 18:15:35 +0000304 .. method:: set_output_charset(charset)
Georg Brandl116aa622007-08-15 14:28:22 +0000305
Serhiy Storchaka26cb4652017-06-20 17:13:29 +0300306 Change the encoding used to return translated messages.
Georg Brandl116aa622007-08-15 14:28:22 +0000307
Serhiy Storchakafec35c92018-10-27 08:00:41 +0300308 .. deprecated-removed:: 3.8 3.10
309
Benjamin Peterson801844d2008-07-14 14:32:15 +0000310
Georg Brandl036490d2009-05-17 13:00:36 +0000311 .. method:: install(names=None)
Benjamin Peterson801844d2008-07-14 14:32:15 +0000312
Serhiy Storchaka26cb4652017-06-20 17:13:29 +0300313 This method installs :meth:`.gettext` into the built-in namespace,
Georg Brandlbded4d32008-07-17 18:15:35 +0000314 binding it to ``_``.
Benjamin Peterson801844d2008-07-14 14:32:15 +0000315
Georg Brandlbded4d32008-07-17 18:15:35 +0000316 If the *names* parameter is given, it must be a sequence containing the
Georg Brandl22b34312009-07-26 14:54:51 +0000317 names of functions you want to install in the builtins namespace in
Serhiy Storchaka26cb4652017-06-20 17:13:29 +0300318 addition to :func:`_`. Supported names are ``'gettext'``, ``'ngettext'``,
Georg Brandlbded4d32008-07-17 18:15:35 +0000319 ``'lgettext'`` and ``'lngettext'``.
Benjamin Peterson801844d2008-07-14 14:32:15 +0000320
Georg Brandlbded4d32008-07-17 18:15:35 +0000321 Note that this is only one way, albeit the most convenient way, to make
322 the :func:`_` function available to your application. Because it affects
323 the entire application globally, and specifically the built-in namespace,
324 localized modules should never install :func:`_`. Instead, they should use
325 this code to make :func:`_` available to their module::
Benjamin Peterson801844d2008-07-14 14:32:15 +0000326
Georg Brandlbded4d32008-07-17 18:15:35 +0000327 import gettext
328 t = gettext.translation('mymodule', ...)
329 _ = t.gettext
Benjamin Peterson801844d2008-07-14 14:32:15 +0000330
Georg Brandlbded4d32008-07-17 18:15:35 +0000331 This puts :func:`_` only in the module's global namespace and so only
332 affects calls within this module.
Georg Brandl116aa622007-08-15 14:28:22 +0000333
Georg Brandl116aa622007-08-15 14:28:22 +0000334
335The :class:`GNUTranslations` class
336^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
337
338The :mod:`gettext` module provides one additional class derived from
339:class:`NullTranslations`: :class:`GNUTranslations`. This class overrides
340:meth:`_parse` to enable reading GNU :program:`gettext` format :file:`.mo` files
Benjamin Peterson801844d2008-07-14 14:32:15 +0000341in both big-endian and little-endian format.
Georg Brandl116aa622007-08-15 14:28:22 +0000342
343:class:`GNUTranslations` parses optional meta-data out of the translation
344catalog. It is convention with GNU :program:`gettext` to include meta-data as
345the translation for the empty string. This meta-data is in :rfc:`822`\ -style
346``key: value`` pairs, and should contain the ``Project-Id-Version`` key. If the
347key ``Content-Type`` is found, then the ``charset`` property is used to
348initialize the "protected" :attr:`_charset` instance variable, defaulting to
349``None`` if not found. If the charset encoding is specified, then all message
350ids and message strings read from the catalog are converted to Unicode using
Georg Brandlbded4d32008-07-17 18:15:35 +0000351this encoding, else ASCII encoding is assumed.
352
353Since message ids are read as Unicode strings too, all :meth:`*gettext` methods
354will assume message ids as Unicode strings, not byte strings.
Georg Brandl116aa622007-08-15 14:28:22 +0000355
356The entire set of key/value pairs are placed into a dictionary and set as the
357"protected" :attr:`_info` instance variable.
358
Antoine Pitroube8d06f2014-10-28 20:17:51 +0100359If the :file:`.mo` file's magic number is invalid, the major version number is
360unexpected, or if other problems occur while reading the file, instantiating a
361:class:`GNUTranslations` class can raise :exc:`OSError`.
Georg Brandl116aa622007-08-15 14:28:22 +0000362
Serhiy Storchaka26cb4652017-06-20 17:13:29 +0300363.. class:: GNUTranslations
364
365 The following methods are overridden from the base class implementation:
366
367 .. method:: gettext(message)
368
369 Look up the *message* id in the catalog and return the corresponding message
370 string, as a Unicode string. If there is no entry in the catalog for the
371 *message* id, and a fallback has been set, the look up is forwarded to the
372 fallback's :meth:`~NullTranslations.gettext` method. Otherwise, the
373 *message* id is returned.
Georg Brandl116aa622007-08-15 14:28:22 +0000374
375
Serhiy Storchaka26cb4652017-06-20 17:13:29 +0300376 .. method:: ngettext(singular, plural, n)
Georg Brandl116aa622007-08-15 14:28:22 +0000377
Serhiy Storchaka26cb4652017-06-20 17:13:29 +0300378 Do a plural-forms lookup of a message id. *singular* is used as the message id
379 for purposes of lookup in the catalog, while *n* is used to determine which
380 plural form to use. The returned message string is a Unicode string.
381
382 If the message id is not found in the catalog, and a fallback is specified,
383 the request is forwarded to the fallback's :meth:`~NullTranslations.ngettext`
384 method. Otherwise, when *n* is 1 *singular* is returned, and *plural* is
385 returned in all other cases.
386
387 Here is an example::
388
389 n = len(os.listdir('.'))
390 cat = GNUTranslations(somefile)
391 message = cat.ngettext(
392 'There is %(num)d file in this directory',
393 'There are %(num)d files in this directory',
394 n) % {'num': n}
Georg Brandl116aa622007-08-15 14:28:22 +0000395
396
Serhiy Storchaka26cb4652017-06-20 17:13:29 +0300397 .. method:: lgettext(message)
398 .. method:: lngettext(singular, plural, n)
Georg Brandl116aa622007-08-15 14:28:22 +0000399
Serhiy Storchaka26cb4652017-06-20 17:13:29 +0300400 Equivalent to :meth:`.gettext` and :meth:`.ngettext`, but the translation
401 is returned as a byte string encoded in the preferred system encoding
402 if no encoding was explicitly set with
403 :meth:`~NullTranslations.set_output_charset`.
Georg Brandl116aa622007-08-15 14:28:22 +0000404
Serhiy Storchaka26cb4652017-06-20 17:13:29 +0300405 .. warning::
Georg Brandl116aa622007-08-15 14:28:22 +0000406
Serhiy Storchaka26cb4652017-06-20 17:13:29 +0300407 These methods should be avoided in Python 3. See the warning for the
408 :func:`lgettext` function.
Georg Brandl116aa622007-08-15 14:28:22 +0000409
Serhiy Storchakafec35c92018-10-27 08:00:41 +0300410 .. deprecated-removed:: 3.8 3.10
411
Georg Brandl116aa622007-08-15 14:28:22 +0000412
Georg Brandl116aa622007-08-15 14:28:22 +0000413Solaris message catalog support
414^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
415
416The Solaris operating system defines its own binary :file:`.mo` file format, but
417since no documentation can be found on this format, it is not supported at this
418time.
419
420
421The Catalog constructor
422^^^^^^^^^^^^^^^^^^^^^^^
423
424.. index:: single: GNOME
425
426GNOME uses a version of the :mod:`gettext` module by James Henstridge, but this
427version has a slightly different API. Its documented usage was::
428
429 import gettext
430 cat = gettext.Catalog(domain, localedir)
431 _ = cat.gettext
Georg Brandl6911e3c2007-09-04 07:15:32 +0000432 print(_('hello world'))
Georg Brandl116aa622007-08-15 14:28:22 +0000433
434For compatibility with this older module, the function :func:`Catalog` is an
435alias for the :func:`translation` function described above.
436
437One difference between this module and Henstridge's: his catalog objects
438supported access through a mapping API, but this appears to be unused and so is
439not currently supported.
440
441
442Internationalizing your programs and modules
443--------------------------------------------
444
445Internationalization (I18N) refers to the operation by which a program is made
446aware of multiple languages. Localization (L10N) refers to the adaptation of
447your program, once internationalized, to the local language and cultural habits.
448In order to provide multilingual messages for your Python programs, you need to
449take the following steps:
450
451#. prepare your program or module by specially marking translatable strings
452
453#. run a suite of tools over your marked files to generate raw messages catalogs
454
455#. create language specific translations of the message catalogs
456
457#. use the :mod:`gettext` module so that message strings are properly translated
458
459In order to prepare your code for I18N, you need to look at all the strings in
460your files. Any string that needs to be translated should be marked by wrapping
461it in ``_('...')`` --- that is, a call to the function :func:`_`. For example::
462
463 filename = 'mylog.txt'
464 message = _('writing a log message')
465 fp = open(filename, 'w')
466 fp.write(message)
467 fp.close()
468
469In this example, the string ``'writing a log message'`` is marked as a candidate
470for translation, while the strings ``'mylog.txt'`` and ``'w'`` are not.
471
Andrew Kuchling30c5ad22013-11-19 11:05:20 -0500472There are a few tools to extract the strings meant for translation.
473The original GNU :program:`gettext` only supported C or C++ source
474code but its extended version :program:`xgettext` scans code written
475in a number of languages, including Python, to find strings marked as
476translatable. `Babel <http://babel.pocoo.org/>`__ is a Python
477internationalization library that includes a :file:`pybabel` script to
478extract and compile message catalogs. François Pinard's program
479called :program:`xpot` does a similar job and is available as part of
Georg Brandl525d3552014-10-29 10:26:56 +0100480his `po-utils package <https://github.com/pinard/po-utils>`__.
Georg Brandl116aa622007-08-15 14:28:22 +0000481
Andrew Kuchling30c5ad22013-11-19 11:05:20 -0500482(Python also includes pure-Python versions of these programs, called
483:program:`pygettext.py` and :program:`msgfmt.py`; some Python distributions
484will install them for you. :program:`pygettext.py` is similar to
485:program:`xgettext`, but only understands Python source code and
486cannot handle other programming languages such as C or C++.
487:program:`pygettext.py` supports a command-line interface similar to
488:program:`xgettext`; for details on its use, run ``pygettext.py
489--help``. :program:`msgfmt.py` is binary compatible with GNU
490:program:`msgfmt`. With these two programs, you may not need the GNU
491:program:`gettext` package to internationalize your Python
492applications.)
Georg Brandl116aa622007-08-15 14:28:22 +0000493
Andrew Kuchling30c5ad22013-11-19 11:05:20 -0500494:program:`xgettext`, :program:`pygettext`, and similar tools generate
495:file:`.po` files that are message catalogs. They are structured
Georg Brandled007d52013-11-24 16:09:26 +0100496human-readable files that contain every marked string in the source
497code, along with a placeholder for the translated versions of these
498strings.
Georg Brandl116aa622007-08-15 14:28:22 +0000499
Andrew Kuchling30c5ad22013-11-19 11:05:20 -0500500Copies of these :file:`.po` files are then handed over to the
501individual human translators who write translations for every
502supported natural language. They send back the completed
503language-specific versions as a :file:`<language-name>.po` file that's
504compiled into a machine-readable :file:`.mo` binary catalog file using
505the :program:`msgfmt` program. The :file:`.mo` files are used by the
506:mod:`gettext` module for the actual translation processing at
507run-time.
Georg Brandl116aa622007-08-15 14:28:22 +0000508
509How you use the :mod:`gettext` module in your code depends on whether you are
510internationalizing a single module or your entire application. The next two
511sections will discuss each case.
512
513
514Localizing your module
515^^^^^^^^^^^^^^^^^^^^^^
516
517If you are localizing your module, you must take care not to make global
518changes, e.g. to the built-in namespace. You should not use the GNU ``gettext``
519API but instead the class-based API.
520
521Let's say your module is called "spam" and the module's various natural language
522translation :file:`.mo` files reside in :file:`/usr/share/locale` in GNU
523:program:`gettext` format. Here's what you would put at the top of your
524module::
525
526 import gettext
527 t = gettext.translation('spam', '/usr/share/locale')
Serhiy Storchaka26cb4652017-06-20 17:13:29 +0300528 _ = t.gettext
Georg Brandl116aa622007-08-15 14:28:22 +0000529
Georg Brandl116aa622007-08-15 14:28:22 +0000530
531Localizing your application
532^^^^^^^^^^^^^^^^^^^^^^^^^^^
533
534If you are localizing your application, you can install the :func:`_` function
535globally into the built-in namespace, usually in the main driver file of your
536application. This will let all your application-specific files just use
537``_('...')`` without having to explicitly install it in each file.
538
539In the simple case then, you need only add the following bit of code to the main
540driver file of your application::
541
542 import gettext
543 gettext.install('myapplication')
544
Andrew Kuchling30c5ad22013-11-19 11:05:20 -0500545If you need to set the locale directory, you can pass it into the
Benjamin Peterson801844d2008-07-14 14:32:15 +0000546:func:`install` function::
Georg Brandl116aa622007-08-15 14:28:22 +0000547
548 import gettext
Benjamin Peterson801844d2008-07-14 14:32:15 +0000549 gettext.install('myapplication', '/usr/share/locale')
Georg Brandl116aa622007-08-15 14:28:22 +0000550
551
552Changing languages on the fly
553^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
554
555If your program needs to support many languages at the same time, you may want
556to create multiple translation instances and then switch between them
557explicitly, like so::
558
559 import gettext
560
561 lang1 = gettext.translation('myapplication', languages=['en'])
562 lang2 = gettext.translation('myapplication', languages=['fr'])
563 lang3 = gettext.translation('myapplication', languages=['de'])
564
565 # start by using language1
566 lang1.install()
567
568 # ... time goes by, user selects language 2
569 lang2.install()
570
571 # ... more time goes by, user selects language 3
572 lang3.install()
573
574
575Deferred translations
576^^^^^^^^^^^^^^^^^^^^^
577
578In most coding situations, strings are translated where they are coded.
579Occasionally however, you need to mark strings for translation, but defer actual
580translation until later. A classic example is::
581
582 animals = ['mollusk',
583 'albatross',
Georg Brandla1c6a1c2009-01-03 21:26:05 +0000584 'rat',
585 'penguin',
586 'python', ]
Georg Brandl116aa622007-08-15 14:28:22 +0000587 # ...
588 for a in animals:
Georg Brandl6911e3c2007-09-04 07:15:32 +0000589 print(a)
Georg Brandl116aa622007-08-15 14:28:22 +0000590
591Here, you want to mark the strings in the ``animals`` list as being
592translatable, but you don't actually want to translate them until they are
593printed.
594
595Here is one way you can handle this situation::
596
597 def _(message): return message
598
599 animals = [_('mollusk'),
600 _('albatross'),
Georg Brandla1c6a1c2009-01-03 21:26:05 +0000601 _('rat'),
602 _('penguin'),
603 _('python'), ]
Georg Brandl116aa622007-08-15 14:28:22 +0000604
605 del _
606
607 # ...
608 for a in animals:
Georg Brandl6911e3c2007-09-04 07:15:32 +0000609 print(_(a))
Georg Brandl116aa622007-08-15 14:28:22 +0000610
611This works because the dummy definition of :func:`_` simply returns the string
612unchanged. And this dummy definition will temporarily override any definition
613of :func:`_` in the built-in namespace (until the :keyword:`del` command). Take
614care, though if you have a previous definition of :func:`_` in the local
615namespace.
616
617Note that the second use of :func:`_` will not identify "a" as being
Andrew Kuchling30c5ad22013-11-19 11:05:20 -0500618translatable to the :program:`gettext` program, because the parameter
619is not a string literal.
Georg Brandl116aa622007-08-15 14:28:22 +0000620
621Another way to handle this is with the following example::
622
623 def N_(message): return message
624
625 animals = [N_('mollusk'),
626 N_('albatross'),
Georg Brandla1c6a1c2009-01-03 21:26:05 +0000627 N_('rat'),
628 N_('penguin'),
629 N_('python'), ]
Georg Brandl116aa622007-08-15 14:28:22 +0000630
631 # ...
632 for a in animals:
Georg Brandl6911e3c2007-09-04 07:15:32 +0000633 print(_(a))
Georg Brandl116aa622007-08-15 14:28:22 +0000634
Andrew Kuchling30c5ad22013-11-19 11:05:20 -0500635In this case, you are marking translatable strings with the function
636:func:`N_`, which won't conflict with any definition of :func:`_`.
637However, you will need to teach your message extraction program to
638look for translatable strings marked with :func:`N_`. :program:`xgettext`,
639:program:`pygettext`, ``pybabel extract``, and :program:`xpot` all
Martin Panter5c679332016-10-30 04:20:17 +0000640support this through the use of the :option:`!-k` command-line switch.
Andrew Kuchling30c5ad22013-11-19 11:05:20 -0500641The choice of :func:`N_` here is totally arbitrary; it could have just
642as easily been :func:`MarkThisStringForTranslation`.
Georg Brandl116aa622007-08-15 14:28:22 +0000643
644
Georg Brandl116aa622007-08-15 14:28:22 +0000645Acknowledgements
646----------------
647
648The following people contributed code, feedback, design suggestions, previous
649implementations, and valuable experience to the creation of this module:
650
651* Peter Funk
652
653* James Henstridge
654
655* Juan David Ibáñez Palomar
656
657* Marc-André Lemburg
658
659* Martin von Löwis
660
661* François Pinard
662
663* Barry Warsaw
664
665* Gustavo Niemeyer
666
667.. rubric:: Footnotes
668
669.. [#] The default locale directory is system dependent; for example, on RedHat Linux
670 it is :file:`/usr/share/locale`, but on Solaris it is :file:`/usr/lib/locale`.
671 The :mod:`gettext` module does not try to support these system dependent
672 defaults; instead its default is :file:`sys.prefix/share/locale`. For this
673 reason, it is always best to call :func:`bindtextdomain` with an explicit
674 absolute path at the start of your application.
675
676.. [#] See the footnote for :func:`bindtextdomain` above.