您现在的位置是:网站首页> C/C++
qml中loader加载页面会闪屏_Qml动态语言切换
- C/C++
- 2022-03-25
- 1245人已阅读
此方法需要在Qt5.10或更高版本实现, 在Qt5.10或更高版本实现, 在Qt5.10或更高版本实现 重要的事情说三遍
首先在工程文件.pro中加入TRANSLATIONS = zh_CN.ts en_US.ts 两个翻译文件, 支持中英文两种语言切换
在工程目录下 cmd 执行
lupdate main.qml -ts zh_CN.ts
lupdate main.qml -ts en_US.ts
执行完后在代码目录里就可以看到生成了 zh_CN.ts, en_US.ts 两个翻译文件 接下来用Qt的Linguist分别打开和编辑ts文件
然后点击各个源文中的项, 并在下面的译文中填写与语言对应的文字就行了. 全部填写完成, 再运行菜单 文件->发布就会生成对应的.qm文件. 这个文件就是我们程序在实际运行中需要加载的翻译文件了.
代码中的加载过程:
void QmlLanguage::setLanguage(int nLanguage)
{
QTranslator translator;
if (nLanguage == 0)
{
translator.load(":/en_US.qm");
}else{
translator.load(":/zh_CN.qm");
}
m_app->installTranslator(&translator);
m_engine->retranslate();
}
重点的是这句 m_engine->retranslate(); Qt5.10的新方法, 使Qml界面全部动态重新翻译
然后执行【工具】-》【外部】-》【QT语言家】-》【更新翻译(lupdate)】,如下图所示,执行完之后项目下就会生成对应的XXX.ts、YYY.ts文件。
利用QT语言家:Linguist打开生成的ts文件,将里面需要翻译的地方写上对应的语言,如下图所示:
ts文件翻译完成后,执行Qt Creator中的【工具】-》【外部】-》【QT语言家】-》【部署翻译(lrelease)】就会生成最终要用到的qm文件,如下图所示:
3. 加载qm语言包
到这里qm语言包制作完成,工作就完成了一大半了。接下来的任务就是在代码中实现语言包的加载,即:根据不同的选择加载不同的语言包。
void LHSyncClientPrivate::InitUiByLanguage(const QString strLanguage)
{
if (strLanguage.isEmpty())
{
return;
}
QString strLanguageFile;
if (strLanguage.compare("en") == 0)
{
strLanguageFile = qApp->applicationDirPath() + QString("/languages/%1/%2").arg(LHT_SYNCCLIENT_VERSION_PRODOCUTNAME).arg(LHT_SYNCCLIENT_EN_FILE);
}
else if (strLanguage.compare("zh") == 0)
{
strLanguageFile = qApp->applicationDirPath() + QString("/languages/%1/%2").arg(LHT_SYNCCLIENT_VERSION_PRODOCUTNAME).arg(LHT_SYNCCLIENT_ZH_FILE);
}
if (QFile(strLanguageFile).exists())
{
m_translator->load(strLanguageFile);
qApp->installTranslator(m_translator);
}
else
{
qDebug() << "[houqd] authclient language file does not exists ...";
}
}
其中,m_translator即为QTranslator实例,在类的构造函数中赋值:m_translator = new QTranslator;实现过程很简单,就是取得语言包的绝对路径,然后利用QTranslator来加载它,最后利用qApp->installTranslator(m_translator)来安装。
4. 重新设置界面显示
重新设置界面的显示,这一步是很多人容易忘记的一步,如果这儿被忽略了,往往就无法完成语言的切换,即:重新设置一下需要显示的元素,该过程是在上面InitUiByLanguage过程之后进行的,相关代码如下:
void LHSyncClientPrivate::RetranslateUi()
{
m_wgtSync->setWindowTitle(tr("Drive Client"));
//! 左侧同步信息
m_btnSynchronizing->setText(tr("Synchronizing"));
m_btnSynchronized->setText(tr("Synchronized"));
//! 右侧面板
m_lblSyncStatus->setText(tr("looking for files changes..."));
m_lblShowRecordsNum->setText(tr("There are n records ..."));
m_btnSyncOrPause->setText(tr("Sync Or Pause"));
m_btnClearAll->setText(tr("Clear all"));
m_btnSyncOrPause->setText(tr("Sync Or Pause"));
m_btnClose->setText(tr("Close"));
m_actSync->setText(tr("Sync Info"));
}
实现效果:
好了,到这里整个语言包的制作过程就基本完成了。这里还需要提及一点在网盘客户端实现时的设计思路:由于网盘在登录前和登录后可操作的菜单是不一样的,要涉及一种动态加载的方式,可以实现一个UiLoader的插件,它实现所有的窗体加载(即LoadUi()返回QWidget句柄)、菜单加载、语言切换,在这些功能中可能UiLoader插件并不完成具体的工作,而仅仅是实现信号的转发功能。同样,也需要实现一个逻辑控制插件,它负责所有的菜单逻辑,而对于每个窗体则由各自的窗体插件自行完成。多语言切换的实现效果如下:
切换为中文:
切换后效果:
加油,坚持每天的学习!!