Complementary to translations provided for Sphinx-generated messages such as navigation bars, Sphinx provides mechanisms facilitating document translations in itself. See the :ref:`intl-options` for details on configuration.
Workflow visualization of translations in Sphinx. (The stick-figure is taken from an XKCD comic.)
gettext  is an established standard for internationalization and localization. It naïvely maps messages in a program to a translated string. Sphinx uses these facilities to translate whole documents.
Initially project maintainers have to collect all translatable strings (also
referred to as messages) to make them known to translators. Sphinx extracts
these through invocation of
sphinx-build -b gettext.
Every single element in the doctree will end up in a single message which results in lists being equally split into different chunks while large paragraphs will remain as coarsely-grained as they were in the original document. This grants seamless document updates while still providing a little bit of context for translators in free-text passages. It is the maintainer's task to split up paragraphs which are too large as there is no sane automated way to do that.
After Sphinx successfully ran the
:class:`~sphinx.builders.gettext.MessageCatalogBuilder` you will find a collection
.pot files in your output directory. These are catalog templates
and contain messages in your original language only.
They can be delivered to translators which will transform them to
--- so called message catalogs --- containing a mapping from the original
messages to foreign-language strings.
Gettext compiles them into a binary format known as binary catalogs through :program:`msgfmt` for efficiency reasons. If you make these files discoverable with :confval:`locale_dirs` for your :confval:`language`, Sphinx will pick them up automatically.
An example: you have a document
usage.rst in your Sphinx project. The
gettext builder will put its messages into
usage.pot. Imagine you have
Spanish translations  on your hands in
usage.po --- for your builds to
be translated you need to follow these instructions:
Compile your message catalog to a locale directory, say
translated, so it ends up in
./translated/es/LC_MESSAGES/usage.moin your source directory (where
esis the language code for Spanish.)
msgfmt "usage.po" -o "translated/es/LC_MESSAGES/usage.mo"
Set :confval:`locale_dirs` to
Run your desired build.
|||See the GNU gettext utilites for details on that software suite.|
|||Because nobody expects the Spanish Inquisition!|