1382 字
7 分钟
Page Views
PySide PyQt多语言国际化翻译工作流以及相关问题

正确标记文本#

这里默认你已经了解了国际化的流程和工具,具体可以参考C++版更底层的解释

使用.tr()#

只要是使用.tr()标记的文本不管.tr()在这里能否直接访问,都会被pyside6-lupdate工具(PyQt5是pylupdate5)添加到.ts文件。

对于类本身就继承自QObject的(QT组件都是),可以直接使用self.tr()标记文本,对于类没有继承QObject的,使用别的继承了QObject的对象调用.tr()虽然可以正常标记文本,但想要不修改文件.ts直接使用就必须让类继承QObject然后调用self.tr()

因为生成的.ts里context名称默认为类名,使用其他对象或类的.tr()方法都不能正确处理context名称,要自己去修改成正确的名称才能正常生效非常麻烦。直接使用QObject.tr()QCoreApplication.tr()都是不行的,这时context名称直接为空,无法对应上。

使用QCoreApplication.translate()#

QApplication.translate(context: str, sourceText: str, disambiguation: str = None, n: int = -1) -> str
参数说明
context上下文名称,通常用类名(如 ‘InfoBar’ ),用于区分不同模块中相同的源文本
sourceText要翻译的源文本(如 ‘提示’ )
disambiguation(可选)消歧字符串,当同一上下文中有相同源文本但不同含义时使用
n(可选)用于处理复数形式, -1 表示不使用复数

对于无法直接调用或继承QObject的情况,直接使用QApplication.translate(),一般只需要传入前两项参数,虽然这样很长,但不要改写名称例如tr=QApplication.translate或封装方法后使用,这样pyside6-lupdate工具要么会错误理解内容要么无法识别到标记文本。

使用自定义的翻译器管理#

如果不想每次都使用一长串来标记,可以放弃qt的自动托管,使用自定的翻译管理类。思路就是在需要标记的地方实例化一个QObject对象,然后调用.tr()进行标记,这样pyside6-lupdate工具会将对象名作为context名称,需要使用对应文本时可以通过context名称和原始文本从 qm 文件返回翻译文本。这里只提供简单的思路,我还未在自己的项目中实现。

对于要在界面中显示的选项等配置文本,可以单独创建一个类继承自QObject,单独将所有要使用的文本标记,同样在需要使用对应文本时可以通过context名称和原始文本从 qm 文件返回翻译文本。在配置变更时也可以获取原始文本来写入配置。

翻译工作流说明#

翻译管理脚本#

让AI写一个脚本例如 update_i18n.py,具备以下功能,主要根据项目文件创建.ts文件、将.ts文件中要翻译的文本到处为JSON,将JSON文件扔给免费AI补全翻译文本,再用脚本将翻译好的内容应用到.ts文件中,最后编译成.qm文件。

为什么不直接让AI翻译.ts文件,因为文件结构特殊,AI也是要先提取文本翻译了再生成文件的,这样效率低而且很容易漏掉某些文本,不如直接给结构化的文本,AI直接一对一自动翻译,校对翻译内容时直接看JSON文件也更方便,当然不用JSON,用表格也是可以的。

命令说明#

Terminal window
# 初始化创建 .ts 文件
python devTools/update_i18n.py --init
# 更新翻译源文件
python devTools/update_i18n.py --update
# 导出待翻译文本到 JSON
python devTools/update_i18n.py --export
# 导出所有翻译(包括已完成的)
python devTools/update_i18n.py --export-all
# 从 JSON 文件读取翻译并应用到 .ts
python devTools/update_i18n.py --apply
# 编译翻译文件
python devTools/update_i18n.py --release
# 执行完整工作流(更新 + 编译)
python devTools/update_i18n.py --all
# 查看帮助
python devTools/update_i18n.py --help

标准翻译工作流#

Terminal window
# 1. 更新翻译源文件
python devTools/update_i18n.py --update
# 2. 导出所有翻译到 JSON 以便编辑
python devTools/update_i18n.py --export-all
# 3. 编辑 translations.json,添加/修改翻译
# 4. 应用翻译到 .ts 文件
python devTools/update_i18n.py --apply
# 5. 编译为 .qm 文件
python devTools/update_i18n.py --release

仅添加新翻译的工作流#

Terminal window
# 1. 更新翻译源文件
python devTools/update_i18n.py --update
# 2. 只导出未完成的翻译
python devTools/update_i18n.py --export
# 3. 在 translations.json 中为未完成的条目添加翻译
# 4. 应用翻译
python devTools/update_i18n.py --apply
# 5. 编译
python devTools/update_i18n.py --release

参数详解#

参数别名说明
—init-i初始化创建 .ts 文件
—update-u从 Python/UI 代码提取可翻译字符串,更新 .ts 文件
—release-r将 .ts 编译为二进制 .qm 文件
—all-a同时执行 —update 和 —release(默认行为)
—export-e导出未完成的翻译条目到 JSON(直接覆盖)
—export-all导出所有翻译条目到 JSON(直接覆盖)
—apply从 translations.json 读取翻译并更新 .ts 文件
—help-h显示帮助信息

translations.json 文件格式#

新的 JSON 格式是一条文本对应多个语言版本,更加直观:

[
{
"source": "源文本(可选)",
"comment": "注释文本(用于匹配,优先)",
"zh_CN": "简体中文翻译",
"zh_TW": "繁体中文翻译",
"en_US": "英文翻译",
"ja_JP": "日文翻译"
},
{
"comment": "警告",
"zh_CN": "警告",
"en_US": "Warning"
}
]

格式说明#

  • source: 原始文本(可选,用于匹配)
  • comment: 注释文本(可选,用于匹配,优先级高于 source)
  • zh_CN, zh_TW, en_US, ja_JP: 各语言的翻译内容

匹配规则:先匹配 comment,没有则匹配 source。

评论

PySide PyQt多语言国际化翻译工作流以及相关问题
https://swakinx.github.io/posts/pyqt-translation-workflow/
作者
Swakin
发布于
2026-05-01
许可协议
CC BY-NC-SA 4.0