国际化

在 1.1 版本加入.

作为对Sphinx生成的消息(如导航栏)提供的翻译的补充,Sphinx提供了促进 文档 翻译的机制。有关配置的详细信息,请参阅 用于国际化的选项

../../_images/translation.svg

Sphinx翻译的工作流可视化(图形由 plantuml 创建)。

Sphinx国际化细节

gettext [1] 是国际化和本地化的既定标准。它简单地将程序中的消息映射到翻译后的字符串。Sphinx使用这些工具翻译整个文件。

最初,项目维护人员必须收集所有可翻译的字符串(也称为 消息 )以使其为翻译人员所知。Sphinx通过调用 sphinx-build -M gettext 来提取这些字符串。

doctree中的每个元素都将以一条消息结束,这将导致列表被平均地分成不同的块,而大的段落将保持与原始文档中一样的粗粒度。这就允许无缝的文档更新,同时仍然为自由文本段中的翻译人员提供一点上下文。维护人员的任务是分割太大的段落,因为没有一种合理的自动化方法来分割这些段落。

在Sphinx成功运行 MessageCatalogBuilder 后,您将在输出目录中找到一组 .pot 文件。这些是 catalog templates 包含您的原始语言的消息。

它们可以被传递给翻译程序,翻译程序会将它们转换成 .po 文件,即所谓的 消息目录,其中包含从原始消息到外语字符串的映射。

为了提高效率,gettext 使用 msgfmt 将它们编译成一种称为 binary catalogs 的二进制格式。如果您使用 locale_dirs 为您 language 设置这些文件的可发现性,Sphinx将自动提取它们。

一个例子:您在Sphinx项目中有一个文档 usage.rstgettext 构建器将把它的消息放入 usage.pot 。假设您有存储在 usage.po 中的西班牙语翻译 [2] --- 要进行翻译的构建,您需要遵循以下说明:

  • 将您的消息目录编译到一个区域目录中,比如 locale,这样它最终会出现在您的源目录中的 ./locale/es/LC_MESSAGES/usage.mo 中(其中 es 是西班牙语的语言代码)。:

    msgfmt "usage.po" -o "locale/es/LC_MESSAGES/usage.mo"
    
  • Set locale_dirs to ["locale/"].

  • Set language to es (also possible via -D).

  • 运行所需的构建。

为了防止错误,如果翻译段落中的交叉引用与原始段落中的不匹配,则会发出警告。这可以使用配置变量 suppress_warnings 全局关闭。或者,为了仅关闭一条消息,请像这样用 #noqa 结尾该消息:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse
risus tortor, luctus id ultrices at. #noqa

(如果您想在文本中逐字写入“#noqa”,请写 \#noqa 。这不适用于代码块,因为代码块无论如何都不包含引用, #noqa 会被忽略。)

在 4.5 版本加入: #noqa 机制。

使用sphinx-intl做翻译

快速指南

sphinx-intl 是Sphinx翻译工作流中的有用工具。本节介绍一种使用 sphinx-intl 进行翻译的简单方法。

  1. 安装 sphinx-intl.

    $ pip install sphinx-intl
    
  2. 将配置添加到 conf.py

    locale_dirs = ['locale/']   # path is example but recommended.
    gettext_compact = False     # optional.
    

    这个案例研究假设BUILDDIR被设置为 _buildlocale_dirs 被设置为 locale/ 并且 gettext_compact 被设置为 False (Sphinx文档已经这样配置)。

  3. 将可翻译的消息提取到pot文件中。

    $ make gettext
    

    生成的pot文件将放在 _build/gettext 目录中。如果您想自定义输出,超出 用于国际化的选项 可以完成的范围,可以通过放置在 templates_path 列表中的任何目录中的自定义 message.pot.jinja 文件来替换 default pot file template

  4. 生成po文件。

    我们将使用上述步骤中生成的pot文件。

    $ sphinx-intl update -p _build/gettext -l de -l ja
    

    完成后,生成的po文件将放在以下目录中:

    • ./locale/de/LC_MESSAGES/

    • ./locale/ja/LC_MESSAGES/

  5. 翻译po文件。

    如上所述,这些文件位于 ./locale/<lang>/LC_MESSAGES 目录中。下面给出了Sphinx中的一个此类文件 builders.po 的示例。

    # a5600c3d2e3d48fc8c261ea0284db79b
    #: ../../builders.rst:4
    msgid "Available builders"
    msgstr "<FILL HERE BY TARGET LANGUAGE>"
    

    另一种情况是,msgid是多行文本,并包含restructedText语法:

    # 302558364e1d41c69b3277277e34b184
    #: ../../builders.rst:9
    msgid ""
    "These are the built-in Sphinx builders. More builders can be added by "
    ":ref:`extensions <extensions>`."
    msgstr ""
    "FILL HERE BY TARGET LANGUAGE FILL HERE BY TARGET LANGUAGE FILL HERE "
    "BY TARGET LANGUAGE :ref:`EXTENSIONS <extensions>` FILL HERE."
    

    请注意不要破坏reStructuredText符号。大多数po编辑器都会帮助您做到这一点。

  6. 生成翻译文档。

    你需要在 conf.py 中设置 language 参数,或者你也可以在命令行中指定该参数。

    对于BSD/GNU make,运行:

    $ make -e SPHINXOPTS="-D language='de'" html
    

    对于Windows cmd.exe,运行:

    > set SPHINXOPTS=-D language=de
    > .\make.bat html
    

    对于PowerShell,运行:

    PS> Set-Item env:SPHINXOPTS "-D language=de"
    PS> .\make.bat html
    

祝贺你!翻译后的文档在 _build/html 目录下。

在 1.3 版本加入: sphinx-build 被make命令调用,将po文件编译成mo文件。

如果您使用的是1.2.x或更早版本,请在 sphinx-intl build 命令之前调用 make 命令。

翻译

用新的pot文件更新你的po文件

如果更新了文档,则需要生成更新的pot文件,并将差异应用于已翻译的po文件。要将pot文件中的更新应用于po文件,请使用 sphinx-intl update 命令。

$ sphinx-intl update -p _build/gettext

使用Transifex服务进行团队翻译

Transifex 是几种允许通过Web界面进行协作翻译的服务之一。它有一个巧妙的基于Go的命令行客户端,使获取和推送翻译变得容易。

  1. 安装 Transifex CLI tool.

    为了上传资源(pot文件),您需要 tx 命令行工具。官方安装过程将 tx 二进制文件放在当前目录中,以及一个README和一个LICENSE文件,并将当前目录添加到 $PATH 中。

    $ curl -o- https://raw.githubusercontent.com/transifex/cli/master/install.sh | bash
    
  2. 创建您的 Transifex 帐户,并为您的文档创建一个新项目和一个组织。

    当前,Transifex不允许翻译项目拥有多个版本的文档,因此您最好在项目名称中包含版本号。

    例如:

    组织ID:

    sphinx-document

    项目ID:

    sphinx-document-test_1_0

    项目URL:

    https://www.transifex.com/projects/p/sphinx-document-test_1_0/

  3. 创建一个将在命令行中使用的API令牌。

    转到您的Transifex API token页面并生成一个令牌。现在复制生成的令牌,因为您以后将无法再次看到它。

  4. 在用户配置文件 $HOME/.transifexrc 中设置您的Transifex API令牌。

    [https://app.transifex.com]
    rest_hostname = https://rest.api.transifex.com
    token         = paste_your_api_token_here
    
  5. 或者,您可以将您的Transifex API令牌存储为环境变量 TX_TOKEN,该变量由 tx 识别和使用。

    $ export TX_TOKEN=paste_your_api_token_here
    
  6. tx 命令创建项目的配置文件。

    该过程将在当前目录中创建 .tx/config

    $ cd /your/document/root
    $ tx init
    
    Successful creation of '.tx/config' file
    
  7. 将pot文件上传到Transifex服务。

    使用 sphinx-intl update-txconfig-resources 将pot文件注册到 .tx/config 文件中,调整 --pot-dir 值以适应您项目的pot文件目录:

    $ cd /your/document/root
    $ sphinx-intl update-txconfig-resources --pot-dir _build/locale \
      --transifex-organization-name=sphinx-document \
      --transifex-project-name=sphinx-document-test_1_0
    

    您可以使用 SPHINXINTL_TRANSIFEX_ORGANIZATION_NAMESPHINXINTL_TRANSIFEX_PROJECT_NAME 环境变量来代替各自的命令行参数。

    以及上传pot文件

    $ tx push -s
    # Getting info about resources
    
    sphinx-document-test_1_0.builders - Getting info
    sphinx-document-test_1_0.builders - Done
    
    # Pushing source files
    
    sphinx-document-test_1_0.builders - Uploading file
    sphinx-document-test_1_0.builders - Done
    
  8. 在Transifex上转发翻译。

  9. 拉取翻译后的po文件,并制作翻译的HTML。

    获取翻译的目录并生成mo文件。例如,要为德语(de)生成mo文件:

    $ cd /your/document/root
    $ tx pull -l de
    # Getting info about resources
    
    sphinx-document-test_1_0.builders - Getting info
    sphinx-document-test_1_0.builders - Done
    
    # Pulling files
    
    sphinx-document-test_1_0.builders [de] - Pulling file
    sphinx-document-test_1_0.builders [de] - Creating download job
    sphinx-document-test_1_0.builders [de] - Done
    

    调用 make html (对于BSD/GNU make)传递语言代码:

    $ make -e SPHINXOPTS="-D language='de'" html
    

大功告成!

小技巧

在本地和Transifex上翻译

如果您想推送所有语言的po文件,可以使用 tx push -t 命令来完成。注意!此操作会覆盖Transifex中的翻译。

换句话说,如果您已经更新了服务和本地po文件中的每一个文件,那么集成它们将花费大量的时间和精力。

使用Weblate服务进行团队翻译

阅读更多 Weblate's documentation

对 Sphinx参考翻译 做贡献

新贡献者翻译sphinx参考文献的推荐方式是加入Transifex上的翻译团队。

Sphinx(master)文档有一个 Sphinx translation page

  1. 登录到 Transifex 服务。

  2. 转到 "Sphinx's documentation" translation project

  3. 单击 Request language 并填写表单。

  4. 等待Transifex sphinx翻译维护人员的接受。

  5. (在被接受后)在Transifex上进行翻译。

细节在这里:https://help.transifex.com/en/articles/6248698-getting-started-as-a-translator

翻译进度和统计

在 7.1.0 版本加入.

在渲染过程中,Sphinx使用 translated 属性标记每个可翻译的节点,指示是否找到了该节点中文本的翻译。

配置值 translation_progress_classes 可用于根据 translated 属性的值向每个元素添加类。

可以使用 |translation progress| 替换来显示每个文档中已翻译节点的百分比。

脚注