司开星的博客

PyQt 程序添加多国语言(国际化)支持

PyQt 内置一套机制,可以为你的 PyQt 程序添加多种界面语言。

本文示例代码主要以PyQt5为主。

标记出需要多语言的文本

首先标记程序中需要多语言支持的文本,用QObject.tr()方法标记出即可:

1
2
3
4
5
class Mwindow(QtGui.QDialog):
def __init__(self):
super(Mwindow, self).__init__()
self.resize(100, 60)
self.down1 = QtGui.QPushButton(self.tr(u'下载'), self)

由于QObject是大部分类的基类,所以直接使用self.tr()即可。

tr()方法在PyQt5中已经不建议使用了,建议使用translate()方法:

1
2
3
class A(QObject):
def hello(self):
return QCoreApplication.translate('A', "Hello")

如果你跟我一样是先用Qt Designer 画的UI文件,并且要翻译的文本都写在UI文件中了,那就更简单一些。在画UI文件时注意有文本的组件中text属性下的“可翻译的”选项要保持勾选状态,默认是勾选的。这样在通过ui生成py文件时就自动在文本外添加了translate()方法。

转换并编辑翻译文件

首先通过包含文本的py文件生成翻译文件:

pylupdate5 main_ui.py -ts zh_CN.ts

PyQt4 中是pylupdate4

linguist 编辑

接着用安装PyQt4程序包时附带的,或单独安装的pyqt5-tools中包含的linguist程序打开这个文件,一个一个编辑即可。编辑完成后点击菜单栏“文件–发布”即可生成所需的.qm文件。

手动编辑

如果没有linguist也没关系,.ts文件就是一个xml文件,直接用文本编辑器编辑即可。

未翻译的xml结构为:

1
2
3
4
<message encoding="UTF-8">
<location filename="GitHub/pdfdir/gui/main_ui.py" line="90"/>
<source>打开</source>
<translation type="unfinished"></translation>

翻译完成的xml结构为:

1
2
3
4
<message utf8="true">
<location filename="main_ui.py" line="90"/>
<source>打开</source>
<translation>Open</translation>

对照你的.ts文件就知道怎么修改了。

手动翻译完成后还需要用lrelease程序将.ts转换成.qm:

lrelease en.ts

lrelease程序在PyQt4程序目录下或pyqt5-tools中。

载入.qm文件切换语言

最后一步就是载入.qm文件了。

初始化界面时修改语言

如果你先判断系统语言再根据系统语言切换界面语言的话就要在界面初始化时载入.qm文件:

1
2
3
4
5
6
7
8
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
trans = QtCore.QTranslator()
trans.load("./gui/en")
app.installTranslator(trans)
window = Main(app, trans)
window.show()
sys.exit(app.exec_())

注意要在界面show之前installTranslator

运行时动态修改语言

如果你希望程序运行时可以动态修改语言,比如通过点击菜单栏的english_action切换到英文,可以通过触发以下方法实现:

1
2
3
4
def to_englist(self):
self.trans.load("en")
self.app.installTranslator(self.trans)
self.retranslateUi(self)

其中self.retranslateUi(self)方法是ui转py文件时自动生成的一个方法,代码示例如下:

1
2
3
def retranslateUi(self, MainUI):
_translate = QtCore.QCoreApplication.translate
self.open_button.setText(_translate("MainUI", "打开"))

如果不是Qt Designer画的界面那就需要手动写一个类似retranslateUi的函数。

参考资料:

  1. How to create a multi language application
  2. Hello tr() Example
  3. Internationalisation of PyQt5 Applications
  4. Pyqt 国际化多语言支持
  5. qt的多国语言支持方案