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. QString strLanguageFile;
  8. if (strLanguage.compare("en") == 0)
  9. {
  10. strLanguageFile = qApp->applicationDirPath() + QString("/languages/%1/%2").arg(LHT_SYNCCLIENT_VERSION_PRODOCUTNAME).arg(LHT_SYNCCLIENT_EN_FILE);
  11. }
  12. else if (strLanguage.compare("zh") == 0)
  13. {
  14. strLanguageFile = qApp->applicationDirPath() + QString("/languages/%1/%2").arg(LHT_SYNCCLIENT_VERSION_PRODOCUTNAME).arg(LHT_SYNCCLIENT_ZH_FILE);
  15. }
  16. if (QFile(strLanguageFile).exists())
  17. {
  18. m_translator->load(strLanguageFile);
  19. qApp->installTranslator(m_translator);
  20. }
  21. else
  22. {
  23. qDebug() << "[houqd] authclient language file does not exists ...";
  24. }
  25. }

其中,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. m_btnSynchronizing->setText(tr("Synchronizing"));
  6. m_btnSynchronized->setText(tr("Synchronized"));
  7. //! 右侧面板
  8. m_lblSyncStatus->setText(tr("looking for files changes..."));
  9. m_lblShowRecordsNum->setText(tr("There are n records ..."));
  10. m_btnSyncOrPause->setText(tr("Sync Or Pause"));
  11. m_btnClearAll->setText(tr("Clear all"));
  12. m_btnSyncOrPause->setText(tr("Sync Or Pause"));
  13. m_btnClose->setText(tr("Close"));
  14. m_actSync->setText(tr("Sync Info"));
  15. }

实现效果:

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

切换为中文:

切换后效果:

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

时间: 2024-10-21 19:47:06

QT实现多语言切换的相关文章

【大话QT之十四】QT实现多语言切换

功能需求: 网盘客户端要能够实现多国语言的切换,第一版要支持中.英文的切换.在实现过程中感觉QT对多国语言的支持还是很不错的,制作多语言包很方便,切换的逻辑也很简单.下面就来看一下QT中如何制作多语言包. 实现方法: 为了支持国际化最关键的地方是制作多国语言包,然后再实现动态切换.QT里面既可以采用命令行也可以采用Qt Creator的界面操作来生成,这里我们利用Qt Creator来生成多国语言包.基本流程是,先生成ts文件,然后生成qm文件,最后通过QTranslator类来加载qm文件,实

在使用Qt5.8完成程序动态语言切换时遇到的问题

因为之前了解过一些Qt国际化的东西,所以在写程序的时候需要显示给用户的字符都使用了 tr(" ")的形式,然后使用 Qt Linguist得到相应的 qm(Qt message)文件,再通过网上介绍的方式,在 main函数中使用 installTranslator,即可让程序在启动时自动判断语言环境,加载相应语言. 至此,静态语言切换已经完成,下面要做的是动态切换(即不需要重启软件). 1.首先,令语言能够切换的 GUI组件用的是 QComboBox,信号是 currentIndexC

Android 应用内多语言切换

p.p1 { margin: 0.0px 0.0px 12.0px 0.0px; line-height: 18.0px; font: 12.0px ".PingFang SC"; color: #000000 } p.p3 { margin: 0.0px 0.0px 13.9px 0.0px; line-height: 18.0px; font: 16.8px "PT Sans"; color: #000000 } p.p4 { margin: 0.0px 0.0

Android应用语言切换功能

因为公司的产品大部分是销售到国外的,所以领导要求app有语言切换功能.我在网上搜了些相关知识并实现了功能,在这里做个中英文切换的demo记录下来. 先看看demo的效果: 效果就是这样子.当然也可以做成其他语言的切换,具体根据需求而定. 原理其实很简单,就是多个strings.xml进行切换然后在刷新Activity. 首先,在AndroidManifest.xml文件中的每个需要切换语言的Activity中加入android:configChanges="locale". 然后在re

android 语言切换过程分析 (zhuan)

最近在看一个bug,系统切换语言后,本来退到后台的音乐,会在通知栏上显示通知.为了解决这个bug,我学习了下android的语言切换流程,也参考了大量其他人的资料.(主要参考了http://blog.csdn.net/wqhjfree/article/details/8244520)在这里我将自己的探索记录下来,作为自己的学习记录,也希望能对有同样需要的人有个帮助.刚学android不久,如果中间有什么问题不对的请多多谅解,并指出错误,多交流,共同进步下. 1.从setting入手,我们可以知道

【Android 多语言切换简单实例分享】

一.Android多语言切换 Android应用的开发不可能只针对某一个国家或者区域使用,各国间语言文化各不相同,因此一个优秀的APP必须支持多种语言,为了实现这个特性,Android给出了一个解决方式,在res目录下通过values+语言编码来实现多国语言的支持(中间采用连字符号-连接),例如:values-es代表英文,如果你决定了你的应用要支持多国语言,那么你就必须新建多种values-XXX的多语言支持文件,下面通过一个例子来看看基本的使用方式,先看下效果图: 1.工程结构 注:主要看下

Android应用内语言切换实现

自定义控件系列结束了,打个回马枪,补上前段时间埋下的一个坑---"应用内语言切换".APP语言改变是一个Configuration,但是这个Configuration和android手机屏幕旋转有点不大一样.屏幕旋转的时候,会destroy当前页面,并进行重新绘制.而切换语言后不会重新绘制页面,所以这种情况的出现造成了网上的一知半解小伙伴们哀声一片,不是在咒骂api的坑爹,就是在卖力的另辟蹊径想尽办法解决问题.思路都是很好的,目的也是坚决的,可是方向是错误的,把哥哥我也给带进了坑了,爬

android实现多语言切换

在安卓开发中,常会遇到需要切换不同语言的情况.语言不同意味着需要进行不同语种字符的动态切换.不同布局的动态切换. 安卓实现这一功能非常的简单: 首先在res中创建其它语种对应的value.layout等文件夹,比如添加英文版和越南版,命名如value-en-US.value-vi.layout-en-US.layout-vi. 命名规则在网上可以查到,value-en-US中,en表示英文,US表示美国.国家可不写.越南版可全写为layout-vi-VN. 如此,便有了几套同名,同id,但内容属

语言切换

ECSHOP商城模板实现英文繁体简体多语言切换 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2013-11-17 各位ECSHOP网店系统用户大家好,欢迎来到ECSHOP教程网图文教程,今天为大家详细解说一下ECSHOP模板实现英文繁体简体多语言切换 ECSHOP教程网ECSHOP视频教程也再不断的完善与跟进,期待大家的关注!希望在ECSHOP的道路上,ecshop教程网与您一路同行! 1).首先打开 includds/init.php  文件,找到 requi