PyQt5 国际化

动态修改界面的语言

Qt 提供 Qt Linguist.exe 动态修改界面的语言。Qt 为 Qt C++ 和 Qt Quick 提供了专用的快捷开发语言翻译的应用,使得权限管理者,翻译者,开发者可以用 Qt tools 来完成他们的工作。

  • 权限管理者(Release managers):承担着管理所有应用权限的责任,比如说,调配开发者跟翻译者的工作,还可以用已发布的应用,lupdate tool 来同步源代码跟翻译后的,还可以用 lrelease tool 来创建一个运行时的翻译文件(我理解为语言包)。
  • 翻译者(Translators):可以使用 Qt Linguist 工具来在应用中翻译文本。不需要计算机知识,只需要你会启动项目,会用文本编辑器。
  • 开发者(Developers)必须创建可以使用被翻译过的文本的 Qt 应用。应当帮助译者识别短语出现的上下文。开发人员可以使用教程了解他们的任务。

更加详细的信息见:Internationalization with Qt。

Qt Linguist 提供了多种语言支持,但是没有增加很多开发者的工作。Qt 通过只在程序创建的时候,使用翻译者翻译短句,实现对程序的最小开支。在大多数情况下,主窗口只创建一遍,一旦窗口初始化的时候完成翻译,根据需要来选择显示还是隐藏,只有在窗口被创建,销毁的时候才需要翻译者。

概述

参考自:Overview of the Translation Process

开发人员使用简单但特殊的语法以开发人员的母语将这些短语输入到源代码中,以标识这些短语需要翻译。Qt 工具为每个短语提供了上下文信息,以帮助翻译人员,并且开发人员能够在必要时向短语添加其他上下文信息。

版本管理器(The release manage)会生成一组从源文件生成的翻译文件,并将这些文件传递给翻译器。翻译人员使用 Qt 语言学家打开翻译文件,输入翻译内容,再将结果保存回翻译文件中,接着将其传递回版本管理器。然后,版本管理器会生成这些翻译文件的快速精简版本,以供应用程序使用。

这些工具旨在随着应用程序的更改和发展而反复使用,以保留现有翻译并轻松确定需要哪些新翻译。Qt Linguist 还提供了短语手册功能,以帮助确保在多个应用程序和项目之间的一致翻译。

Qt Linguist 和 lupdate 能够导入和导出 XML 本地化交换文件格式(XLIFF)文件,从而可以利用与此格式配合使用的工具和翻译服务。有关使用这些文件的更多信息,请参见 Translators。

1 创建一个简单的界面

先使用 Qt Designer 创建如下图的界面:

并保存文件为 first.ui,在 vscode 的控制台输入命令:

$ pyuic5 first.ui -o first.py

获得 first.py 文件,并编写主程序文件 test.py

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from first import Ui_MainWindow


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    myWin = MainWindow()
    myWin.show()
    sys.exit(app.exec_())

2 Qt Linguist 创建翻译包

  1. 首先需要生成一个 .ts 文件,first.py 是要翻译的文件名,zn_CN.ts 是要生成的文件名:
$ pylupdate5 first.py -ts zn_CN.ts
  1. 接着,使用 Qt Linguist.exe 打开刚才生成的 .ts 文件:
$ linguist zn_CN.ts

弹出如下界面:

点击 OK 按钮,进入界面:

  1. 完成所有的字段翻译并保存,作为例子只翻译 hello world 这个字段,最后,点击文件按钮,选中 发布 选项,将翻译好的包保存到当前目录下,得到 .qm 文件:
  1. 将翻译逻辑写添加到逻辑页面中

完整代码如下:

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from first import Ui_MainWindow
from PyQt5.QtCore import QTranslator

class MainWindow(QMainWindow,  Ui_MainWindow):
    def __init__(self,parent = None):
        super().__init__(parent)
        self.setupUi(self)
        #定义翻译家
        self.trans = QTranslator()
        #将两个按钮链接到槽函数
        self.pushButton.clicked.connect(self._tigger_english)
        self.pushButton_2.clicked.connect(self._trigger_zh_cn)

    def _tigger_english(self):
        #加载语言包
        self.trans.load("en")
        #获取窗口实例
        app = QApplication.instance()
        #将翻译家安装到实例中
        app.installTranslator(self.trans)
        #翻译界面
        self.retranslateUi(self)
        pass

    def _trigger_zh_cn(self):
        #加载语言包
        self.trans.load("zn_CN")
        #获取窗口实例
        app = QApplication.instance()
        #将翻译家安装到实例中
        app.installTranslator(self.trans)
        self.retranslateUi(self)
        pass

if __name__ == '__main__':
    app = QApplication(sys.argv)
    myWin = MainWindow()
    myWin.show()
    sys.exit(app.exec_())

最终,实现界面语言的国际化。更多信息参考:Qt Linguist Manual: Release Manager|Qt Linguist Manual: Translators|Qt Linguist Manual: Developers

你可能感兴趣的:(PyQt5 国际化)