多项目Sphinx架构下的国际化配置问题
解决Sphinx-intl无法识别软链接核心项目PO文件修改的问题
看起来你遇到的核心问题是软链接的核心项目翻译文件没被Sphinx-intl正确识别,这主要是软链接路径解析、locale目录配置以及gettext生成流程的配合出了问题。我给你梳理几个关键修复步骤:
1. 先确认核心项目文档是否被纳入Gettext生成流程
首先要排查子项目执行make gettext时,核心文档的内容有没有生成到子项目的_build/gettext目录中:
- 检查子项目的
conf.py,确保exclude_patterns没有排除core目录(比如不要有exclude_patterns = ['core/*']这类配置) - 检查子项目的主
index.rst,是否通过toctree或include指令正确引入了核心项目的文档内容。如果核心文档没被包含,make gettext自然不会生成对应的.pot文件,后续翻译也就无从谈起 - 查看子项目的
_build/gettext目录,是否存在core/子目录及对应的.pot文件(比如core/index.pot)。如果没有,说明核心文档没被扫描到,先解决这个基础问题
2. 修正Locale目录路径配置(规避软链接解析歧义)
你用的locale_dirs = ['locale/', 'core/locale/']是相对路径,但软链接的core目录可能让Sphinx解析路径时出现歧义。建议改用绝对路径确保正确性:
在子项目的conf.py中添加:
import os # 获取当前conf.py所在目录的绝对路径 current_dir = os.path.dirname(os.path.abspath(__file__)) # 基于软链接的core目录,拼接核心项目locale的绝对路径 core_locale_dir = os.path.join(current_dir, 'core/locale') locale_dirs = [ 'locale/', core_locale_dir ]
这样Sphinx就能精准定位到核心项目的翻译目录,不会因为软链接的相对路径问题找不到文件。
3. 调整翻译维护流程(分离核心与子项目翻译)
软链接方式容易让核心和子项目的翻译文件混在一起,建议分开维护更清晰:
- 核心项目单独处理翻译:在核心项目的docs目录下执行:
make gettext sphinx-intl update -p _build/gettext -l sv # 然后在核心项目的locale/sv/LC_MESSAGES目录下修改PO文件 - 子项目仅维护自身翻译:子项目执行
make gettext只生成自身文档的.pot,再用sphinx-intl update生成子项目自己的PO文件 - 子项目的
conf.py直接指向核心项目的locale目录(不用依赖软链接的docs/core/locale),比如:core_locale_dir = "/path/to/coreproject/locale" # 核心项目locale的绝对路径 locale_dirs = ['locale/', core_locale_dir]
这种方式彻底避免了软链接带来的路径混淆,核心和子项目翻译各自独立,Sphinx-build时会自动合并两者的翻译内容。
4. 强制Sphinx-intl扫描核心项目PO文件
如果一定要保留软链接方式,执行sphinx-intl update时可以显式指定核心项目的gettext目录:
# 同时指定子项目和核心项目的gettext目录 sphinx-intl update -p /path/to/subproject/a/docs/_build/gettext -p /path/to/coreproject/docs/_build/gettext -l sv
这样Sphinx-intl会同时处理两个目录下的.pot文件,更新对应的PO文件。
5. 升级Sphinx-intl版本
旧版本的Sphinx-intl对软链接的支持可能存在bug,建议升级到最新版:
pip install --upgrade sphinx-intl sphinx
最后构建多语言文档时,确保命令中的language参数正确:
make -e SPHINXOPTS="-D language='sv'" html
内容的提问来源于stack exchange,提问作者Oskar Persson




