Qt语言家及打包发布
一、Qt语言家实现语言国际化
Qt语言家就是用于提供软件翻译的工具,利用其生成的语言包可实现软件界面文本信息的多语言显示切换;美其名曰国际化。要实现软件多语言切换,首先就得为当前的Qt程序制作对应的语言翻译包;然后在Qt程序中去选择加载语言包,操作大致分以下几步:
1.利用语言家的lupdate生成ts文件(ts文件实际就是一个xml文件)
首先在我们的pro文件中添加如下内容,ts文件名可参考各国语言代码命名(方便、统一)
部分国家语言代码:
语言代码 语言名称
ar 阿拉伯语
be 比利时语
de-DE 德语(德国)
en 英语
es 西班牙语
ru-RU 俄语
zh-CN 中文(简体)
zh-TW 中文(繁体)
其次就是利用Qt语言家的lupdate根据项目工程代码生成对应的ts文件,此操作可直接在QtCreator菜单栏中选择工具 --> 外部 --> Qt语言家 --> lupdate 即可
此时在你的工程目录下的translations目录中就会生成我们在pro工程文件中命名的zh_CN.ts和en.ts两个文件
2.在电脑开始菜单中找到安装的Qt下的语言家,在语言家中操作ts文件翻译文本信息
在Qt语言家中打开选择需翻译的ts文件,并进行对应文本信息的翻译:
3.利用语言家的lrelease发布qm翻译文件,这步可直接在语言家中选择发布
或在QtCreator中选择工具 -> 外部 -> 语言家 -> lrelease发布生成对应的翻译语言包.qm文件
发布后在你的工程目录下的translations目录中就会生成zh_CN.qm和en.qm两个文件
4.在程序中加载发布的qm语言包并更新显示,加载需放在界面初始化完成之前,大致代码逻辑如下:
QObject::tr()方法就是用于标记Qt中需要翻译的文本信息使用如:
QObject::tr(“hello”)或QObject::tr(“你好”)
下面是我们程序的语言包动态加载的代码,仅供参考:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTranslator>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->actionCH->setCheckable(true);
ui->actionEnglish->setCheckable(true);
static QTranslator trans; //可 new
connect(ui->menuOptions, &QMenu::triggered, this, [&](QAction *action){
QString transFile;
if("English" == action->text()) {
ui->actionCH->setChecked(false);
ui->actionEnglish->setChecked(true);
transFile = "en.qm";
}else if("中文简体" == action->text()) {
ui->actionCH->setChecked(true);
ui->actionEnglish->setChecked(false);
transFile = "zh_CN.qm";
}
if(!trans.load(transFile)) { //此时需将qm文件放置到项目构建目录中
qDebug() << "load error";
return;
}
qApp->installTranslator(&trans);
ui->retranslateUi(this);
//使用tr翻译的文本需在安装翻译包并retranslateUi重新翻译界面之后
this->setWindowTitle(tr("Lingust"));
});
ui->actionCH->trigger(); //触发对应语言选择action,设置默认显示
}
程序效果:
二、Qt程序打包发布
打包发布,就是将编译好的执行程序和其需要的动态库、资源文件等打包在一起,这样就可以把打好的包拷贝到其它电脑上,方便运行我们的执行程序;当然也可以将其打包成安装包。下面就说一个常见的打包方式:
首先将项目构建方式改为release发布方式进行构建(debug方式包含了太多调试需要的库和信息,对于发布是没用的,所以要发布程序要使用release版本)
然后自己新建一个用于发布程序的目录,然后将release生成的执行程序复制到该目录下,在目录空白处按shift+鼠标右键,选择在此处打开Powershell窗口输入Qt的打包命令windeployqt.exe + 我们需发布的执行程序按下回车;
在Powershell中使用命令打包时依赖的库文件可能不够,会出现类似下面的错误,一般可能缺少Qt安装的构建套件目录下的bin目录中的libgcc_s_dw2-1.dll,libstdc++-6.dll,libwinpthread-1.dll等或者一些外部库文件,总之缺少就拷贝啥直到打包的程序能正常运行。
注意:拷贝上述库的时候一定选择和编译套件匹配的。
所以这里更推荐使用Qt安装的命令终端操作(操作类似Powershell,但进行打包时如上面对应编译套件的库文件就能自动打包添加不需要我们自行拷贝,并且识别的windeployqt命令也是对应版本的,若采用Powershell就可能出现识别的windeployqt命令版本不对(如库文件位数不对)最终造成打包后的程序无法执行)
在开始菜单中去查找到该Qt命令行终端工具,执行的命令还是windeployqt.exe + 需发布的执行程序(所在目录可能不一致,推荐直接使用需发布程序的绝对路径,这里也可先通过cd /d + 发布程序的绝对路径切换到对应执行程序目录再操作)
打包完成后目录下就会包含该执行程序所需的一些依赖文件,如下图所示:
我们如果想在其他电脑上运行该程序就需要将这整个目录下的所有文件一起拷贝至其它电脑,如果闲文件太多程序也不是很大的情况我们还可以使用Enigma Virtual Box这类工具将所有依赖和执行程序再次打包成一个执行程序,这样在其它电脑上运行就只需拷贝最终打包好的包含所有依赖的执行程序就好。
下面就是Enigma Virtual Box的具体使用操作截图:
在你设置的目录下就会生成对应的执行程序文件,双击即可运行:
这样操作起来是不是就方便多了,还无需担心拷贝过程中库文件丢失,若需要Enigma Virtual Box软件的朋友可以自行在其官网(https://enigmaprotector.com/en/downloads.html)下载。