Pyqt5多语言的简单实现步骤与偷懒避坑

目 了 个 录

  • 写在前面
  • 基本步骤
    • 修改GUI代码
    • 创建语言文件
    • 使用Qt语言家进行翻译
    • 修改程序
  • 疑难杂症解决
  • 推荐阅读
    • 选读
  • 请求大佬补充、指出不足
  • 欢迎爱好者/新手提问、指出不足

写在前面

本文编纂于 2021年2月 。由于大家很少会用到Pyqt的多语言,此时网上的信息大部分比较陈旧,且对像我这样的外行不友好,故有此文。

基本步骤

修改GUI代码

在要被翻译的字符串上用tr()方法括起来:
Pyqt5多语言的简单实现步骤与偷懒避坑_第1张图片
需要注意以下几点:

  1. 不需要翻译的字符串不需要使用tr()来包裹;
  2. 上图self指的是包含需要翻译文字的类(实例),我的是主窗口:
    Pyqt5多语言的简单实现步骤与偷懒避坑_第2张图片
  3. 有关tr()的小知识:
    tr()方法
    tr()是PyQt5.QtCore.QObject的方法。很多东西都继承自QObject,包括QWidget,可以参考官方文档(官方文档是个极好的东西)。
  4. 一般源程序代码中的内容都使用英文为佳,能够避免很多麻烦:
    Pyqt5多语言的简单实现步骤与偷懒避坑_第3张图片
    比如,tr()包裹的内容中如果出现中文,会出现这样的问题:
    Pyqt5多语言的简单实现步骤与偷懒避坑_第4张图片
    “棒打鹧鸪”在Qt语言家里成了乱码,并且最后制作出来的语言包这一句不会生效(语言包和程序匹配不成功):
    Pyqt5多语言的简单实现步骤与偷懒避坑_第5张图片
    Unicode代码也有类似的问题:
    Pyqt5多语言的简单实现步骤与偷懒避坑_第6张图片
    好家伙,Qt语言家中特殊字符的斜杠直接消失(普通的转义可以用):
    Pyqt5多语言的简单实现步骤与偷懒避坑_第7张图片
    程序效果:
    Pyqt5多语言的简单实现步骤与偷懒避坑_第8张图片
    所以在写源程序的时候尽量避免这两种东西吧,我突然觉得自己重新写一遍可能比这好用

创建语言文件

在CMD或者PowerShell中使用类似命令即可安装pyqt5-tools(记得给PIP换源或者科学上网):

pip install pyqt5-tools

在CMD或者PowerShell中使用类似命令生成翻译的源文件(*.ts):

pylupdate5 文件名.py -ts zh_CN.ts

其中文件名指的是刚刚使用了tr()的代码文件;zh_CN.ts是输出的文件,可以使用Qt语言家打开:
Pyqt5多语言的简单实现步骤与偷懒避坑_第9张图片
如图,Qt语言家与Qt设计师在同一个目录下,具体安装位置不一定,请自行探索。
需要注意的不多,亲测以下流程可以:
正确操作
而这样并不可以:
不知道为啥不行

使用Qt语言家进行翻译

有手就行,不多解释:
Pyqt5多语言的简单实现步骤与偷懒避坑_第10张图片
记得时常保存:
Pyqt5多语言的简单实现步骤与偷懒避坑_第11张图片
点击发布即可得到下一步需要的*.qm文件:
Pyqt5多语言的简单实现步骤与偷懒避坑_第12张图片

修改程序

在实例化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中更详细的内容。

疑难杂症解决

  1. 实际上,trans.load()会返回一个bool类型的数据,表示载入是否成功。如果载入不成功,可以尝试换一下文件的路径。
  2. 如果载入成功了界面却没有翻译成功,可能有以下几个原因:
    ①忘记app.installTranslator()这种显而易见的问题,可能性不大;
    ②有一个比较大的坑,就是翻译的UI文件里的类如果被继承了才使用,需要对*.ts文件进行一些手动修改。我的继承关系如图:
    Pyqt5多语言的简单实现步骤与偷懒避坑_第13张图片
    这个mainWindow类处在被翻译的文件里,也是包含被翻译内容的类:
    Pyqt5多语言的简单实现步骤与偷懒避坑_第14张图片
    因此,生成的*.ts文件里前几行是这样的:
    Pyqt5多语言的简单实现步骤与偷懒避坑_第15张图片
    其中标红的就是类名;而我对它又继承了一遍,以便于将业务逻辑层分开:
    Pyqt5多语言的简单实现步骤与偷懒避坑_第16张图片
    所以,.ts里的类名需要修改成最终被实例化的那个类名
    被实例化的类
    Pyqt5多语言的简单实现步骤与偷懒避坑_第17张图片
    我使用了EmEditor对
    .ts文件进行修改,防止中文被编成乱码。
    其实直接修改这个文件也能很容易地实现多窗口的翻译。

推荐阅读

  1. Pyqt5在程序中动态修改多界面的语言(英语转中文或者中文转英语)
  2. 将pip源更换到国内镜像

选读

  1. Qt国际化(源码含中文时)的点滴分析

请求大佬补充、指出不足

欢迎爱好者/新手提问、指出不足

你可能感兴趣的:(Pyqt5,python,pyqt5,自然语言处理)