我目前正在使用python-sphinx进行一个复杂的文档项目。我的下一步是实现国际化。
项目概述(简化(:
doc
build # contains sphinx build output
images # contains image resources
locales # gnu gettext structure (simplified)
enLC_MESSAGESindex.po+mo
enLC_MESSAGESarticlesconnect.po+mo
deLC_MESSAGESindex.po+mo
deLC_MESSAGESarticlesconnect.po+mo
source
_static
articles
connect.rst
commission.rst
troubleshoot
bugs.rst
reference
generated.rst
about.rst
conf.py # contains sphinx configuration
index.rst
terminology.rst
Makefile
Workbench # contains work contained in generated reference
conf.py
:中的本地化选项
locale_dirs = [
'../locales/'
]
gettext_compact = False
Makefile
中创建html输出的规则
html:
sphinx-build -M html "source" "build" -Dlanguage="de" -v
Makefile
中创建*.pot文件的规则:
gettext:
sphinx-build -b gettext "source" "buildgettext"
Makefile
中更新本地化的规则:
update_po:
sphinx-intl update -p "buildgettext" -Dlanguage="en" -Dlanguage="de"
正如你可能已经可以从目录结构和路径分隔符中看出的那样:我使用的是Windows 10。
从包含本地化输出的make html
的构建输出中截取
Running Sphinx v4.2.0
loading translations [de]... done
loading pickled environment... done
building [mo]: targets for 0 po files that are out of date
building [html]: targets for 1 source files that are out of date
updating environment: 0 added, 15 changed, 0 removed
我的问题如下:
Sphinx与LC_MESSAGES子目录中包含的文本域中的本地化字符串不匹配。
我已经用gettext_compact=False
配置了sphinx-gettext,因为我想为每个文档提供单独的翻译文件。这使我们团队的工作流程更容易管理翻译和进度。
当使用命令make gettext
生成*.pot文件时,我使用相同的配置。
现在,当我生成html/pdf输出时,只有顶层文档的文本域得到了正确处理,并且本地化字符串在生成的文档中被替换。此外,在加载翻译过程中也不会出现任何错误(正如您在上面的剪切中看到的那样(。文件的数量也与文档的数量相匹配——我认为在这里之前一切都很好。
我想知道这是否与windows使用与unix不同的路径分隔符有关?也许gettext找不到正确的文本域,因为"articles/connect" != "articlesconnect"
。还是我只是错过了什么?我假设make update_po
命令在LC_MESSAGES下生成gettext能够处理的有效文件/目录结构。这个假设正确吗?我还没有找到关于这个话题的任何信息。
感谢任何帮助和/或想法!
我找到了解决方案/原因。
我的第一个假设是,它可能与conf.py
中的locale_dirs
条目有关。我将包含sphinx构建本地化字符串的*.po
文件的目录移动到sphinx-intl
文档中推荐的位置。一切都没有改变。
当再次检查生成的*.po
文件时,我注意到了一些奇怪的事情(我想(。一些消息ID包含在多个*.po
文件中。事实证明,sphinx为目录结构中的每个*.rst
文档或至少为文档层次结构中的每一个文档生成一个*.po
文件。当一个文档通过include
指令导入另一个文档时,包含文档的文本也被视为包含文档的一部分。而且,在为特定语言生成文档时,文本域也是以这种方式匹配的。这有点道理,因为include
指令只是在当前文档中插入所包含文档的内容。。。
为了解决这个问题,必须在包含文档的*.po
文件中翻译文本。实际文档的*.po
文件中翻译的文本将被忽略。我认为这种行为适用于包括其他文档在内的整个递归文档堆栈,但尚未进行测试。
希望其他人觉得这个有用
我将接受这个答案作为正确答案。