0%

PyQt5 多语言支持

主要使用到的是 QTranslator 类,这个类加载 .qm 文件,.qm是一个二进制的文件,它由.ts生成。
大致过程如下:

  1. .ts 使用 pylupdate5 命令生成,命令如下:
1
2
pylupdate5 mwin.py  -ts   zh_CN.ts
pylupdate5 mwin.py -ts en.ts
  1. 用 Qt Linguist.exe(/Lib/site-packages/pyqt5-tools/),用它打开刚刚生成的 .ts 文件翻译。注意,你每翻译好一个后要打上那个√。完成之后点击 file 中的 Release,然后就生成了 .qm 文件。

  2. 例如,用 QT 写了一个界面文件 mwin.py,然后执行如下指令

1
2
3
pyuic5.exe -o mwin.py mwin.ui
pylupdate5.exe mwin.py -ts zh_CN.ts
pylupdate5.exe mwin.py -ts en.ts

新建 main.py 文件,在其中加载对应的界面文件和翻译文件就可以了。

  1. 源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# mwin.py
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'mwin.ui'
#
# Created by: PyQt5 UI code generator 5.10.1
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MWin(object):
def setupUi(self, MWin):
MWin.setObjectName("MWin")
MWin.resize(400, 300)
self.centralWidget = QtWidgets.QWidget(MWin)
self.centralWidget.setObjectName("centralWidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralWidget)
self.horizontalLayout.setContentsMargins(11, 11, 11, 11)
self.horizontalLayout.setSpacing(6)
self.horizontalLayout.setObjectName("horizontalLayout")
self.gridLayout = QtWidgets.QGridLayout()
self.gridLayout.setSpacing(6)
self.gridLayout.setObjectName("gridLayout")
self.btn1 = QtWidgets.QPushButton(self.centralWidget)
self.btn1.setObjectName("btn1")
self.gridLayout.addWidget(self.btn1, 1, 0, 1, 1)
self.btn2 = QtWidgets.QPushButton(self.centralWidget)
self.btn2.setObjectName("btn2")
self.gridLayout.addWidget(self.btn2, 1, 1, 1, 1)
self.label = QtWidgets.QLabel(self.centralWidget)
font = QtGui.QFont()
font.setFamily("Microsoft YaHei")
font.setPointSize(20)
self.label.setFont(font)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 0, 1, 2)
self.horizontalLayout.addLayout(self.gridLayout)
MWin.setCentralWidget(self.centralWidget)
self.menuBar = QtWidgets.QMenuBar(MWin)
self.menuBar.setGeometry(QtCore.QRect(0, 0, 400, 26))
self.menuBar.setObjectName("menuBar")
MWin.setMenuBar(self.menuBar)
self.mainToolBar = QtWidgets.QToolBar(MWin)
self.mainToolBar.setObjectName("mainToolBar")
MWin.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar)
self.statusBar = QtWidgets.QStatusBar(MWin)
self.statusBar.setObjectName("statusBar")
MWin.setStatusBar(self.statusBar)
self.retranslateUi(MWin)
QtCore.QMetaObject.connectSlotsByName(MWin)
def retranslateUi(self, MWin):
_translate = QtCore.QCoreApplication.translate
MWin.setWindowTitle(_translate("MWin", "MWin"))
self.btn1.setText(_translate("MWin", "中文"))
self.btn2.setText(_translate("MWin", "英文"))
self.label.setText(_translate("MWin", "hello world"))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# main.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date : 2018-07-16 11:28:06
# @Author : Lewis Tian (taseikyo@gmail.com)
# @Link : https://taseikyo.github.io/
# @Version : Python3.6
from mwin import Ui_MWin
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys
class MyWindow(QMainWindow, Ui_MWin):
def __init__(self, parent=None):
super(MyWindow, self).__init__(parent)
self.setupUi(self)
# 翻译
self.trans = QTranslator()
# 连接到槽函数
self.btn1.clicked.connect(self._trigger_zh_cn)
self.btn2.clicked.connect(self._trigger_english)
def _trigger_english(self):
print("[MainWindow] Change to English")
self.trans.load("en")
_app = QApplication.instance() # 获取app实例
_app.installTranslator(self.trans)
# 重新翻译界面
self.retranslateUi(self)
def _trigger_zh_cn(self):
print("[MainWindow] Change to zh_CN")
self.trans.load("zh_CN")
_app = QApplication.instance()
_app.installTranslator(self.trans)
self.retranslateUi(self)
if __name__ == "__main__":
app = QApplication(sys.argv)
mainWindow = MyWindow()
mainWindow.show()
sys.exit(app.exec_())
  1. 界面
    点击中文:
中文

点击英文:

英文

Welcome to my other publishing channels