写在前面
本文编纂于 2021年2月 。由于大家很少会用到Pyqt的多语言,此时网上的信息大部分比较陈旧,且对像我这样的外行不友好,故有此文。
基本步骤
修改GUI代码
在要被翻译的字符串上用tr()方法括起来:
需要注意以下几点:
- 不需要翻译的字符串不需要使用tr()来包裹;
- 上图self指的是包含需要翻译文字的类(实例),我的是主窗口:
- 有关tr()的小知识:
tr()是PyQt5.QtCore.QObject的方法。很多东西都继承自QObject,包括QWidget,可以参考官方文档(官方文档是个极好的东西)。 - 一般源程序代码中的内容都使用英文为佳,能够避免很多麻烦:
比如,tr()包裹的内容中如果出现中文,会出现这样的问题:
“棒打鹧鸪”在Qt语言家里成了乱码,并且最后制作出来的语言包这一句不会生效(语言包和程序匹配不成功):
Unicode代码也有类似的问题:
好家伙,Qt语言家中特殊字符的斜杠直接消失(普通的转义可以用):
程序效果:
所以在写源程序的时候尽量避免这两种东西吧,我突然觉得自己重新写一遍可能比这好用。
创建语言文件
在CMD或者PowerShell中使用类似命令即可安装pyqt5-tools(记得给PIP换源或者科学上网):
pip install pyqt5-tools
在CMD或者PowerShell中使用类似命令生成翻译的源文件(*.ts):
pylupdate5 文件名.py -ts zh_CN.ts
其中文件名指的是刚刚使用了tr()的代码文件;zh_CN.ts是输出的文件,可以使用Qt语言家打开:
如图,Qt语言家与Qt设计师在同一个目录下,具体安装位置不一定,请自行探索。
需要注意的不多,亲测以下流程可以:
而这样并不可以:
使用Qt语言家进行翻译
有手就行,不多解释:
记得时常保存:
点击发布即可得到下一步需要的*.qm文件:
修改程序
在实例化QApplication的那个文件引用:
from PyQt4.QtCore import QTranslator
最简单的用法可以这样:
trans = QTranslator()
trans.load('zh_CN')
app.installTranslator(trans)
也可以这样:
trans = QTranslator()
trans.load('./src/lang/zh_CN.qm')
app.installTranslator(trans)
使用很灵活(见官方文档)。
需要注意的是,(在最简单的使用中)这三行代码需要在app = QApplication(sys.argv)之后、翻译的窗口实例化之前进行。
至此,翻译的简单使用到此为止了。
更多高级的用法可以参考推荐阅读1中更详细的内容。
疑难杂症解决
- 实际上,trans.load()会返回一个bool类型的数据,表示载入是否成功。如果载入不成功,可以尝试换一下文件的路径。
- 如果载入成功了界面却没有翻译成功,可能有以下几个原因:
①忘记app.installTranslator()这种显而易见的问题,可能性不大;
②有一个比较大的坑,就是翻译的UI文件里的类如果被继承了才使用,需要对*.ts文件进行一些手动修改。我的继承关系如图:
这个mainWindow类处在被翻译的文件里,也是包含被翻译内容的类:
因此,生成的*.ts文件里前几行是这样的:
其中标红的就是类名;而我对它又继承了一遍,以便于将业务逻辑层分开:
所以,.ts里的类名需要修改成最终被实例化的那个类名:
我使用了EmEditor对.ts文件进行修改,防止中文被编成乱码。
其实直接修改这个文件也能很容易地实现多窗口的翻译。