zoukankan      html  css  js  c++  java
  • 【大话QT之十四】QT实现多语言切换

    功能需求:

            网盘client要可以实现多国语言的切换,第一版要支持中、英文的切换。

    在实现过程中感觉QT对多国语言的支持还是非常不错的。制作多语言包非常方便。切换的逻辑也非常easy。

    以下就来看一下QT中怎样制作多语言包。

    实现方法:

            为了支持国际化最关键的地方是制作多国语言包,然后再实现动态切换。

    QT里面既能够採用命令行也能够採用Qt Creator的界面操作来生成。这里我们利用Qt Creator来生成多国语言包。基本流程是,先生成ts文件。然后生成qm文件,最后通过QTranslator类来载入qm文件,实现多语言包的切换。

    注意:为了更全面地实现多语言包,在程序中全部涉及到界面中的button或者菜单中的文字显示,都必须使用 QObject::tr("...") 的方式将显示的内容包裹起来,这样做的原因是:仅仅有加入了QObject::tr()的标记。生成ts文件的时候程序才会觉得被QObject::tr()包裹的地方是须要制作多语言的,从而在ts中预留出位置。

    1> 生成ts文件

          在QT的项目文件(.pro)中加入:TRANSLATIONS = XXX.ts YYY.ts(假设是多行,则用 切割)

         

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

         

          注意:假设项目中包括ui文件。如:FORMS += ZZZ.ui,则在生成的ts文件里包括全部ui文件上的字符显示。并且。在制作ui文件时默认情况下界面上的文字显示都是通过QObejct::tr(" ")包裹的。由于在默认情况下ui中的全部控件都存在一个属性:可翻译的。就代表了默认用QObject::tr()嵌套了。

    2. 生成qm文件

        利用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。实现过程非常easy。就是取得语言包的绝对路径,然后利用QTranslator来载入它,最后利用qApp->installTranslator(m_translator)来安装。

    4. 又一次设置界面显示

        又一次设置界面的显示,这一步是非常多人easy忘记的一步,假设这儿被忽略了,往往就无法完毕语言的切换,即:又一次设置一下须要显示的元素。该过程是在上面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"));
    }
    实现效果:

            好了,到这里整个语言包的制作过程就基本完毕了。这里还须要提及一点在网盘client实现时的设计思路:因为网盘在登录前和登录后可操作的菜单是不一样的。要涉及一种动态载入的方式,能够实现一个UiLoader的插件,它实现全部的窗口载入(即LoadUi()返回QWidget句柄)、菜单载入、语言切换,在这些功能中可能UiLoader插件并不完毕详细的工作,而不过实现信号的转发功能。相同。也须要实现一个逻辑控制插件,它负责全部的菜单逻辑,而对于每一个窗口则由各自的窗口插件自行完毕。多语言切换的实现效果例如以下:

               

    切换为中文:

             

    切换后效果:

           

    加油。坚持每天的学习。。

  • 相关阅读:
    Django创建模型。
    Kubernetes APIService资源
    应用系统管理风险
    [Golang] go list命令查看依赖的版本
    [Golang] 升级gin框架和jwtgo
    [Git] 解决git错误 OpenSSL SSL_read: Connection was reset, errno 10054
    [Github] 配置ssh免密码登录解决 You've successfully authenticated, but GitHub does not provide shell access.
    go循环遍历小坑
    Go 字符串拼接6种,最快的方式 strings.builder
    uniapp安卓真机调试提示检测不到手机【解决办法】
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7105164.html
Copyright © 2011-2022 走看看