• QT实现多语言切换


     

    功能需求:

            网盘客户端要能够实现多国语言的切换,第一版要支持中、英文的切换。在实现过程中感觉QT对多国语言的支持还是很不错的,制作多语言包很方便,切换的逻辑也很简单。下面就来看一下QT中如何制作多语言包。

    实现方法:

            为了支持国际化最关键的地方是制作多国语言包,然后再实现动态切换。QT里面既可以采用命令行也可以采用Qt Creator的界面操作来生成,这里我们利用Qt Creator来生成多国语言包。基本流程是,先生成ts文件,然后生成qm文件,最后通过QTranslator类来加载qm文件,实现多语言包的切换。注意:为了更全面地实现多语言包,在程序中所有涉及到界面中的按钮或者菜单中的文字显示,都必须使用 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语言包制作完成,工作就完成了一大半了。接下来的任务就是在代码中实现语言包的加载,即:根据不同的选择加载不同的语言包。    

    [cpp] view plaincopy
     
    1. void LHSyncClientPrivate::InitUiByLanguage(const QString strLanguage)  
    2. {  
    3.     if (strLanguage.isEmpty())  
    4.     {  
    5.         return;  
    6.     }  
    7.   
    8.     QString strLanguageFile;  
    9.     if (strLanguage.compare("en") == 0)  
    10.     {  
    11.         strLanguageFile = qApp->applicationDirPath() + QString("/languages/%1/%2").arg(LHT_SYNCCLIENT_VERSION_PRODOCUTNAME).arg(LHT_SYNCCLIENT_EN_FILE);  
    12.     }  
    13.     else if (strLanguage.compare("zh") == 0)  
    14.     {  
    15.         strLanguageFile = qApp->applicationDirPath() + QString("/languages/%1/%2").arg(LHT_SYNCCLIENT_VERSION_PRODOCUTNAME).arg(LHT_SYNCCLIENT_ZH_FILE);  
    16.     }  
    17.   
    18.     if (QFile(strLanguageFile).exists())  
    19.     {  
    20.         m_translator->load(strLanguageFile);  
    21.         qApp->installTranslator(m_translator);  
    22.     }  
    23.     else  
    24.     {  
    25.         qDebug() << "[houqd] authclient language file does not exists ...";  
    26.     }  
    27. }  
    其中,m_translator即为QTranslator实例,在类的构造函数中赋值:m_translator = new QTranslator;实现过程很简单,就是取得语言包的绝对路径,然后利用QTranslator来加载它,最后利用qApp->installTranslator(m_translator)来安装。

    4. 重新设置界面显示

        重新设置界面的显示,这一步是很多人容易忘记的一步,如果这儿被忽略了,往往就无法完成语言的切换,即:重新设置一下需要显示的元素,该过程是在上面InitUiByLanguage过程之后进行的,相关代码如下:

    [cpp] view plaincopy
     
    1. void LHSyncClientPrivate::RetranslateUi()  
    2. {  
    3.     m_wgtSync->setWindowTitle(tr("Drive Client"));  
    4.       
    5.     //! 左侧同步信息  
    6.     m_btnSynchronizing->setText(tr("Synchronizing"));  
    7.     m_btnSynchronized->setText(tr("Synchronized"));  
    8.   
    9.     //! 右侧面板  
    10.     m_lblSyncStatus->setText(tr("looking for files changes..."));  
    11.     m_lblShowRecordsNum->setText(tr("There are n records ..."));  
    12.     m_btnSyncOrPause->setText(tr("Sync Or Pause"));  
    13.     m_btnClearAll->setText(tr("Clear all"));  
    14.     m_btnSyncOrPause->setText(tr("Sync Or Pause"));  
    15.   
    16.     m_btnClose->setText(tr("Close"));  
    17.     m_actSync->setText(tr("Sync Info"));  
    18. }  
    实现效果:

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

                

    切换为中文:

              

    切换后效果:

            

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

  • 相关阅读:
    kubernetes安装
    kubernetes介绍
    Nginx——stream模块
    Nginx——文件路径配置
    Nginx——HTTP核心模块
    Nginx优化性能配置项
    Nginx----运行的配置项
    四十六、进程间通信——管道的分类与读写
    四十五、进程间通信——介绍
    四十四、Linux 线程——线程同步之死锁以及线程和信号
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4061655.html
Copyright © 2020-2023  润新知