PySide6 实现 Qt 程序的多语言

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

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top