【Python】基于界面库PyQt5+QTLinguist的多语言切换功能实现
之前的文章中,利用QT Designer设计了一个简单的ui界面,并转换成py文件(具体参考【Python】基于界面库PyQt5+Qt Dsigner的环境配置和界面绘制)。
现有一个为Python+QT中实现的程序,添加中英文切换功能的需求,可以用QT自带的 pylupdate5 + QTLinguist 工具实现快捷的字符提取、翻译、转换,步骤如下:
一 用pylupdate5将.py文件转换为翻译文件(.ts)
将需要翻译的.py文件,利用 pylupdate5 工具转换成.ts文件。这里提供两种方式:
(1)使用命令行直接操作(建议:加上 -noobsolete 参数,这样可以保证在修改完py文件之后,生成新.ts中,删除旧有词条):
pylupdate5 -noobsolete xxx.py
-ts xxx.ts
(2)使用 pycharm 就更方便了,可以在”文件——设置——工具——外部工具“中添加对应的工具和实参,实现一键转换生成(实参和目录根据自己需要填写):
注意:可以一次性将多个.py文件转换为一个ts文件,如下所示:
pylupdate5 -noobsolete xxx.py yyy.py zzz.py -ts all.ts
二 用QTLinguist将.ts文件翻译并转换为.qm文件
(1)在外部工具中添加 QTLinguist ,并通过 QTLinguist 打开上面转换而来的.ts文件:
(2)打开文件之后,语言设置如下,点击OK确认:
(3)对照中文字符自行翻译:
(4)全部翻译完成之后,选择”文件——发布“,生成.qm文件;
(5)在QRC文件中登记.qm文件,并使用 PyRcc5 编译生成py文件:
<!DOCTYPE RCC>
<RCC version="1.0"><qresource prefix="/tr"><file>ui/english.qm</file><file>core/english_core.qm</file></qresource>
</RCC>
三 程序中使用.qm文件实现多语言切换
(1)包含QT翻译器类:
from PyQt5.QtCore import QTranslator
(2)初始化中创建中英文翻译器,我这边创建了两个翻译器,分别翻译不同类别的文件:
def __init__(self):self.translator_ui = QTranslator() # 用来翻译QT Designer生成原始界面中内容的翻译器(ui文件夹中)self.translator_core = QTranslator() # 用来翻译自己创建诸多文件中内容的翻译器(core文件夹中)self.loadLanguage(self.now_language) # 加载语言配置(新语言设置只在重启后生效)self.retranslateUi(self) # 重新翻译主窗口
其中, 如果使用QT Designer创建的文件,自带retranslateUi()接口;如果是自己创建的文件,该接口需要自己实现。
(3)我这边是根据 self.now_language 变量值,进行语言切换。具体情况具体分析:
def loadLanguage(self, language):"""加载新语言"""# 移除旧的翻译QApplication.instance().removeTranslator(self.translator_ui)QApplication.instance().removeTranslator(self.translator_core)# 根据语言选择翻译文件if language == "en_US":# 从qrc资源文件加载英文翻译if self.translator_ui.load(TRANSLATE_UI_FILE): # 更新完qm翻译文件之后,需要把qrc文件也用PyRCC5重编一下QApplication.instance().installTranslator(self.translator_ui)if self.translator_core.load(TRANSLATE_CORE_FILE): # 更新完qm翻译文件之后,需要把qrc文件也用PyRCC5重编一下QApplication.instance().installTranslator(self.translator_core)else:# 切换到中文时,移除所有翻译(使用原始中文界面)。不需要加载任何翻译文件,因为界面默认就是中文pass
其中,.qm文件路径分别为:
TRANSLATE_UI_FILE = ":/tr/ui/english.qm" # QT Designer生成原始界面中内容(ui文件夹中)的翻译文件
TRANSLATE_CORE_FILE = ":/tr/core/english_core.qm" # 自己创建诸多文件中内容(core文件夹中)的翻译文件
(4)综上即可实现中英文切换功能。
四 自己手写的程序中字符翻译
用QT Designer生成的文件自带 _translate 进行修饰,且自带 retranslateUi 接口进行刷新,所以转换、翻译操作起来比较方便。
如果是自己创建文件中的文本,需要额外自行添加文本修饰器,如下所示:
_translate= QtCore.QCoreApplication.translate
OpeWidget.setWindowTitle(_translate("OpeWidget", "基本操作"))
这里推荐一个更简单的修饰方法,直接用self.tr()来修饰所有自己编写的字符串:
OpeWidget.setWindowTitle(self.tr("基本操作"))
所有经过 self.tr() 修饰的字符串,都可以被 pylupdate5 工具识别,并通过 QTLinguist 工具执行翻译,其他步骤就和上面的步骤一、二、三相同了。
五 注意事项
【1】用 pylupdate5 工具转换时,建议加上 -noobsolete 参数,这样可以保证在修改完py文件之后,生成新.ts中,删除旧有词条;
【2】用 pylupdate5 工具转换时,可以一次性将多个.py文件转换为一个ts文件;
【3】建议用qt自带的 pyrcc5 工具进行资源(翻译文件、图片等)管理;