You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

多项目Sphinx架构下的国际化配置问题

解决Sphinx-intl无法识别软链接核心项目PO文件修改的问题

看起来你遇到的核心问题是软链接的核心项目翻译文件没被Sphinx-intl正确识别,这主要是软链接路径解析、locale目录配置以及gettext生成流程的配合出了问题。我给你梳理几个关键修复步骤:

1. 先确认核心项目文档是否被纳入Gettext生成流程

首先要排查子项目执行make gettext时,核心文档的内容有没有生成到子项目的_build/gettext目录中:

  • 检查子项目的conf.py,确保exclude_patterns没有排除core目录(比如不要有exclude_patterns = ['core/*']这类配置)
  • 检查子项目的主index.rst,是否通过toctreeinclude指令正确引入了核心项目的文档内容。如果核心文档没被包含,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

火山引擎 最新活动