summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakeshi KOMIYA <i.tkomiya@gmail.com>2019-03-10 01:16:06 +0900
committerGitHub <noreply@github.com>2019-03-10 01:16:06 +0900
commit2606002bb4d0470181460740b608d13d03b84bfe (patch)
tree3744d44300cd1306ef725b38e4023bc3d059e78b
parentfe48b9b5b725199273e6ab66ce7f7e9054cc5830 (diff)
parentb3b5a595a91c7afd4da7ae71e762756d638459dd (diff)
downloadsphinx-git-2606002bb4d0470181460740b608d13d03b84bfe.tar.gz
Merge pull request #6125 from tk0miya/doc-enhance_extension_dev_i18n
doc: Enhance documentation about internalization of external extension (refs: #5991)
-rw-r--r--doc/extdev/i18n.rst80
-rw-r--r--doc/extdev/index.rst1
-rw-r--r--sphinx/locale/__init__.py11
3 files changed, 86 insertions, 6 deletions
diff --git a/doc/extdev/i18n.rst b/doc/extdev/i18n.rst
index c8c54da36..c3ec173a2 100644
--- a/doc/extdev/i18n.rst
+++ b/doc/extdev/i18n.rst
@@ -15,3 +15,83 @@ i18n API
.. autofunction:: __
+
+.. _ext-i18n:
+
+Extension internationalization (`i18n`) and localization (`l10n`) using i18n API
+---------------------------------------------------------------------------------
+
+.. versionadded:: 1.8
+
+An extension may naturally come with message translations. This is briefly
+summarized in :func:`sphinx.locale.get_translation` help.
+
+In practice, you have to:
+
+#. Choose a name for your message catalog, which must be unique. Usually
+ the name of your extension is used for the name of message catalog.
+
+#. Mark in your extension sources all messages as translatable, via
+ :func:`sphinx.locale.get_translation` function, usually renamed ``_()``,
+ e.g.:
+
+ .. code-block:: python
+ :caption: src/__init__.py
+
+ from sphinx.locale import get_translation
+
+ MESSAGE_CATALOG_NAME = 'myextension'
+ _ = get_translation(MESSAGE_CATALOG_NAME)
+
+ translated_text = _('Hello Sphinx!')
+
+#. Set up your extension to be aware of its dedicated translations:
+
+ .. code-block:: python
+ :caption: src/__init__.py
+
+ def setup(app):
+ package_dir = path.abspath(path.dirname(__file__))
+ locale_dir = os.path.join(package_dir, 'locales')
+ app.add_message_catalog(MESSAGE_CATALOG_NAME, locale_dir)
+
+#. Generate message catalog template ``*.pot`` file, usually in ``locale/``
+ source directory, for example via `Babel`_:
+
+ .. code-block:: console
+
+ $ pybabel extract --output=src/locale/myextension.pot src/
+
+#. Create message catalogs (``*.po``) for each language which your extension
+ will provide localization, for example via `Babel`_:
+
+ .. code-block:: console
+
+ $ pybabel init --input-file=src/locale/myextension.pot --domain=myextension --output-dir=src/locale --locale=fr_FR
+
+#. Translate message catalogs for each language manually
+
+#. Compile message catalogs into ``*.mo`` files, for example via `Babel`_:
+
+ .. code-block:: console
+
+ $ pybabel compile --directory=src/locale --domain=myextension
+
+#. Ensure that message catalog files are distributed when your package will
+ be installed, by adding equivalent line in your extension ``MANIFEST.in``:
+
+ .. code-block:: ini
+ :caption: MANIFEST.in
+
+ recursive-include src *.pot *.po *.mo
+
+
+When the messages on your extension has been changed, you need to also update
+message catalog template and message catalogs, for example via `Babel`_:
+
+.. code-block:: console
+
+ $ pybabel extract --output=src/locale/myextension.pot src/
+ $ pybabel update --input-file=src/locale/myextension.pot --domain=myextension --output-dir=src/locale
+
+.. _Babel: http://babel.pocoo.org/
diff --git a/doc/extdev/index.rst b/doc/extdev/index.rst
index fca8fbba3..eac4ded40 100644
--- a/doc/extdev/index.rst
+++ b/doc/extdev/index.rst
@@ -187,6 +187,7 @@ as metadata of the extension. Metadata keys currently recognized are:
output files can be used when the extension is loaded. Since extensions
usually don't negatively influence the process, this defaults to ``True``.
+
APIs used for writing extensions
--------------------------------
diff --git a/sphinx/locale/__init__.py b/sphinx/locale/__init__.py
index 77566ec04..6ae20d0d0 100644
--- a/sphinx/locale/__init__.py
+++ b/sphinx/locale/__init__.py
@@ -255,20 +255,19 @@ def get_translation(catalog, namespace='general'):
import os
from sphinx.locale import get_translation
- _ = get_translation(__name__)
+ MESSAGE_CATALOG_NAME = 'myextension' # name of *.pot, *.po and *.mo files
+ _ = get_translation(MESSAGE_CATALOG_NAME)
text = _('Hello Sphinx!')
def setup(app):
package_dir = path.abspath(path.dirname(__file__))
locale_dir = os.path.join(package_dir, 'locales')
- app.add_message_catalog(__name__, locale_dir)
+ app.add_message_catalog(MESSAGE_CATALOG_NAME, locale_dir)
With this code, sphinx searches a message catalog from
- ``${package_dir}/locales/${language}/LC_MESSAGES/${__name__}.mo``
- (ex. ``sphinxcontrib.applehelp.mo``). Of course, you can use
- arbitrary catalog name instead of ``__name__``. The
- :confval:`language` is used for the searching.
+ ``${package_dir}/locales/${language}/LC_MESSAGES/myextension.mo``.
+ The :confval:`language` is used for the searching.
.. versionadded:: 1.8
"""