i18n API

sphinx.locale.init(locale_dirs: Iterable[str | os.PathLike[str] | None], language: str | None, catalog: str = 'sphinx', namespace: str = 'general') tuple[NullTranslations, bool][source]

locale_dirs 中查找消息目录,并确保translators 中至少设置了一个 NullTranslations 目录。如果多次调用或找到多个 .mo 文件,它们的内容将被合并在一起(从而使 init 成为可重入的)。

sphinx.locale.init_console(locale_dir: str | os.PathLike[str] | None = None, catalog: str = 'sphinx') tuple[NullTranslations, bool][source]

初始化控制台的区域设置。

在 1.8 版本中添加。

sphinx.locale.get_translation(catalog: str, namespace: str = 'general') Callable[[str], str][source]

根据 catalognamespace 获取翻译函数。

扩展可以使用此 API 来翻译扩展上的消息

from pathlib import Path
from sphinx.locale import get_translation

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(__file__).resolve().parent
    locale_dir = package_dir / 'locales'
    app.add_message_catalog(MESSAGE_CATALOG_NAME, locale_dir)

通过此代码,sphinx 从 ${package_dir}/locales/${language}/LC_MESSAGES/myextension.mo 中搜索消息目录。 language 用于搜索。

在 1.8 版本中添加。

sphinx.locale._(message: str) str

用于文档(菜单、标签、主题等)消息的翻译函数。此函数遵循 language 设置。

sphinx.locale.__(message: str) str

用于控制台消息的翻译函数。此函数遵循区域设置(LC_ALLLC_MESSAGES 等)。

扩展国际化 (i18n) 和本地化 (l10n) 使用 i18n API

在 1.8 版本中添加。

扩展可能自然带有消息翻译。这在 sphinx.locale.get_translation() 帮助中进行了简要概述。

在实践中,您必须

  1. 为您的消息目录选择一个名称,该名称必须是唯一的。通常,您的扩展的名称用作消息目录的名称。

  2. 在您的扩展源代码中,将所有消息标记为可翻译的,通过 sphinx.locale.get_translation() 函数,通常重命名为 _(),例如

    src/__init__.py
    from sphinx.locale import get_translation
    
    MESSAGE_CATALOG_NAME = 'myextension'
    _ = get_translation(MESSAGE_CATALOG_NAME)
    
    translated_text = _('Hello Sphinx!')
    
  3. 设置您的扩展以使其意识到其专用的翻译

    src/__init__.py
    def setup(app):
        package_dir = Path(__file__).resolve().parent
        locale_dir = package_dir / 'locales'
        app.add_message_catalog(MESSAGE_CATALOG_NAME, locale_dir)
    
  4. 生成消息目录模板 *.pot 文件,通常在 locale/ 源代码目录中,例如通过 Babel

    $ pybabel extract --output=src/locale/myextension.pot src/
    
  5. 为您的扩展将提供的本地化的每种语言创建消息目录 (*.po),例如通过 Babel

    $ pybabel init --input-file=src/locale/myextension.pot --domain=myextension --output-dir=src/locale --locale=fr_FR
    
  6. 手动翻译每种语言的消息目录

  7. 将消息目录编译为 *.mo 文件,例如通过 Babel

    $ pybabel compile --directory=src/locale --domain=myextension
    
  8. 确保在安装您的软件包时分发消息目录文件,方法是在您的扩展 MANIFEST.in 中添加等效行

    MANIFEST.in
    recursive-include src *.pot *.po *.mo
    

当您的扩展上的消息已更改时,您还需要更新消息目录模板和消息目录,例如通过 Babel

$ pybabel extract --output=src/locale/myextension.pot src/
$ pybabel update --input-file=src/locale/myextension.pot --domain=myextension --output-dir=src/locale