本文基于 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", "导入"))