PyQt5 程序多语言国际化的便捷实现

本文基于 QT Designer 生成代码来做示例,手写 UI 也具有参考性,无非是函数的定义与类的结构有所差异。如果你只需要应用,则不需要过多关注注意事项。

一、多语言需求文本标记

1.1 生成ui.py文件

① 使用 qtdesigner 画出所需要 ui 并生成对应的 ui.py 文件(即将 .ui 文件转化为 .py 文件)
注意事项:在使用 qtdesigner 的时候注意 text 的属性是否为可翻译的(translatable) ,在下图中展示的是一个 button的text,这个 text 来自于抽象类 QAbstractButton,其中有三个属性,translatable(可翻译),disambiguation(消除歧义,多语言翻译时为了避免产生歧义额外添加的字符,默认为空),comment(注释,关联到 text,帮助理解当前词在该语言下的真实意思)
在这里插入图片描述
使用 qtdesigner 生成的 ui.py 文件相关部分大致代码如下,主要利用了 translate 函数去标记可翻译的 text 对象。
在这里插入图片描述

1.2 使用 pylupdate5 转化文本

② 使用 pylupdate5 将 ui.py 文件内所标记的文本转化为 XML 格式的文本保存到另外一个文件下

# 这是一条命令 
# ui.py:ui文件    
# zh_CN.ts:新建的,名字可变,通常按当前语言命名
$ pylupdate5 ui.py -ts zh_CN.ts

命令执行完毕后得到 zh_CN.ts 文件,该文件是 XML 文件,可以选择用 txt 打开,或者使用浏览器(查看源代码)打开,大致格式如下。每一个可翻译文本由 source 标记。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS><TS version="2.0">
<context encoding="UTF-8">
    <name>search</name>
    <message encoding="UTF-8">
        <location filename="ui_search.py" line="265"/>
        <source>搜索结果</source>
        <translation type="unfinished"></translation>
    </message>
</context>
</TS>

1.3 转化后的文本编辑演示

③ 示例:由上述中文XML文档转化为英文,可以直接手动翻译并可参考以下格式填写。

<message utf8="true">
    <location filename="main_ui.py" line="90"/>
    <source>搜索结果</source>
    <translation>search result</translation>
</message>

推荐使用的是 Qt Linguist 进行编辑,这里做一点说明,据说该文件是pyqt4 或者是单独安装 pyqt5-tools 自带的。考虑到大部分人没有,这里贴一个国内的下载地址(国外的下载实在太慢了): https://www.cr173.com/soft/17885.html

  • 打开一个 .ts 文件,选择好源语言和目标语言
  • 从字符串中可选择已标记的文本,下方是翻译

在这里插入图片描述
在这里插入图片描述

二、标记后的使用

2.1 转换成 .qm

方法一

使用 lrelease 将 .ts 文件转化成 .qm 文件,这里主要照顾手动编辑的人。我用的是Qt Linguist,所以这一块没有过多深究。

$ lrelease en.ts

方法二

Qt Linguist 编辑好后直接在文件中选择发布
在这里插入图片描述
在这里插入图片描述

2.2 在代码中加载 .qm

使用 QtCore.QTranslator 加载

def to_english(self):
     translator = QTranslator()
     # 加载语言包,.qm省略不写
     translator.load('language/test_EN')
     # app 重新加载语言包
     self.app.installTranslator(translator)
     self.retranslateUi(self)

注意事项:

  • 其中 app 是在实例化一个app的时候将其当做属性传入
  • app.installTranslator(tranlator) 在加载完后一定要重新安装语言包
  • self.retranslateUi(self) :在 ui 生成阶段,凡是使用 QT Designer都有这个函数。可以自定义,用途是对 text 使用 translate,可见下方示例
# app 来由示例
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = SearchPage(app)
    window.showMaximized()
    sys.exit(app.exec_())
# 示例二
def retranslateUi(self, search):
    _translate = QtCore.QCoreApplication.translate
    search.setWindowTitle(_translate("search", "Dialog"))
    self.groupBox_3.setTitle(_translate("search", "疾病详述"))
    self.pushButton_insert.setText(_translate("search", "导入"))

猜你喜欢

转载自blog.csdn.net/qq_39177678/article/details/107382508