您现在的位置是:网站首页> C/C++

qml中loader加载页面会闪屏_Qml动态语言切换

  • C/C++
  • 2022-03-25
  • 1247人已阅读
摘要

此方法需要在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文件


1.jpg


然后点击各个源文中的项, 并在下面的译文中填写与语言对应的文字就行了. 全部填写完成, 再运行菜单 文件->发布就会生成对应的.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界面全部动态重新翻译

2.gif

然后执行【工具】-》【外部】-》【QT语言家】-》【更新翻译(lupdate)】,如下图所示,执行完之后项目下就会生成对应的XXX.ts、YYY.ts文件。

1.jpg

利用QT语言家:Linguist打开生成的ts文件,将里面需要翻译的地方写上对应的语言,如下图所示:


    1.jpg


   ts文件翻译完成后,执行Qt Creator中的【工具】-》【外部】-》【QT语言家】-》【部署翻译(lrelease)】就会生成最终要用到的qm文件,如下图所示:


   1.jpg


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插件并不完成具体的工作,而仅仅是实现信号的转发功能。同样,也需要实现一个逻辑控制插件,它负责所有的菜单逻辑,而对于每个窗体则由各自的窗体插件自行完成。多语言切换的实现效果如下:


         1.jpg   


切换为中文:


          2.jpg


切换后效果:

3.jpg

        


加油,坚持每天的学习!!


Top