1 在源码中事先准备好字符串
对于要进行多语言翻译的字符串,需要在 coding 的时候使用 QCoreApplication.translate()
或者 QObject.tr()
这两个静态方法预埋好“翻译入口”。
如下图所示:
当程序运行时,这两个方法会自动调用当前 QApplication 的 translator 对字符串进行翻译。(如果没有主动设置过 translator,那么就是不翻译。)
- 对于使用 .ui 文件生成的 .py 界面代码,pyside6-uic 命令会自动对 UI 中的字符串包裹上
translate()
方法。 - 对于不在 .ui 设计阶段定义的字符串,需要主动在代码中调用
translate()
或者tr()
方法。
2 生成 ts 文件
使用 pyside6-lupdate
命令生成 ts 文件。
pyside6-lupdate designer/* transfer_dog/view/main_window.py -ts i18n/zh_cn.ts
执行上述语句,pyside6-lupdate
会遍历 designer/ 目录下的所有文件,以及 transfer_dog/view/main_windows.py 文件,扫描其中的 translate() 与 tr() 语句,然后生成一个 zh_cn.ts 文件放在 i18n 目录下。
ts 文件本质是一个 xml 文件,你可以直接使用文本编辑器打开,并进行编辑。
更方便地是使用 Qt 提供的 Qt Linguist 工具打开 ts 文件进行编辑。
3 生成 qm 文件
对于编辑好的 ts 文件。可以使用 pyside6-lrelease
命令生成 .qm 后缀的二进制文件。这个 qm 文件才是 Qt 程序使用的翻译文件。
pyside6-lrelease i18n/zh_cn.ts -qm i18n/zh_cn.qm
也可以使用 Qt Linguist 工具的 File > Release 菜单直接生成。
4 在源码中加载 QTranslator
在你的 Qt 主程序代码中,为 QApplication 实例加载 translator,这个 translator 负责读取 qm 文件并进行字符串翻译。
q_app = QApplication(sys.argv) translator = QTranslator() if translator.load('zh_cn.qm', directory='i18n'): q_app.installTranslator(translator)
需要注意的是,installTranslator()
并不会让 QCoreApplication 保存对这个 translator 对象的引用。所以要小心,不要某个函数中 installTranslator()
之后又把 translator 释放了,最好的做法就是将 translator 保存在某个全局变量中。
Note: QCoreApplication does not take ownership of translationFile.
from: https://doc.qt.io/qt-6/qcoreapplication.html#installTranslator