功能需求:

网盘客户端要能够实现多国语言的切换,第一版要支持中、英文的切换。在实现过程中感觉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语言包制作完成,工作就完成了一大半了。接下来的任务就是在代码中实现语言包的加载,即:根据不同的选择加载不同的语言包。

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

切换为中文:

切换后效果:

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

【大话QT之十四】QT实现多语言切换相关推荐

  1. Hello Qt(十)——QT输入组件

    一.QComboBox下拉列表框 1.QComboBox组件简介 QComboBox下拉框继承自QWidget,用于有多个选项的下拉框. 2.QComboBox组件属性 QComboBox组件属性设置 ...

  2. Qt学习(十):QT连接mysql(增加、删除、遍历)

    知识点 Qt连接数据库 数据库的插入+删除+遍历 数据库的批量插入 完整项目github地址: https://github.com/taw19960426/Qt_study/tree/main/Da ...

  3. 大话设计模式(十四 设计模式不能戏说!设计模式怎就不能戏说?)

    (续上篇) 次日,小菜来到大鸟处.        "大鸟,你在写什么东西?"小菜看到大鸟的电脑上开着记事本.        "哦,我打算写篇博客,名字就叫<设计模式 ...

  4. 【Qt】通过QtCreator源码学习Qt(十):多国语言支持

    1.获取系统支持的语言 QStringList uiLanguages;uiLanguages = QLocale::system().uiLanguages(); 2.从设置中获取想要显示的语言,尝 ...

  5. C语言库函数大全及应用实例十四

    原文:C语言库函数大全及应用实例十四                                       [编程资料]C语言库函数大全及应用实例十四 函数名: strset 功 能: 将一个串 ...

  6. QT开发(六十四)——QT样式表(二)

    QT开发(六十四)--QT样式表 本文主要翻译自QT官方文档Qt Style Sheets . 五.QT样式表参考 QT样式表支持多种的属性.状态和子控件,使得定制组件的外观成为可能. 1.组件 以下 ...

  7. QT学习笔记(十四):QLayout的属性介绍

    QT学习笔记(十四):QLayout的属性介绍 主要包括QBoxLayout.和QGridLayout以及QFormLayout等的参数类似. 我主要说明一下QGridLayout在QtDesigne ...

  8. QT开发(四十)——GraphicsView编程

    QT开发(四十)--GraphicsView编程 一.QGraphicsScene 1.QGraphicsScene QGraphicsScene继承自QObject,是一个管理图元的容器,与QGra ...

  9. OpenGL(十四)——Qt OpenGL纹理

    OpenGL(十四)--Qt OpenGL纹理 一.纹理 终于写到纹理的部分了: 纹理(Texture)的本质是一个2D图片(1D和3D),或者叫图形数据.只是在OpenGL中专业术语中称其为纹理. ...

最新文章

  1. linux为用户配置java环境变量
  2. [LeetCode] Permutations II 全排列之二
  3. 错误传播 --try{}catch(e){console.log(e)}
  4. SAP运维和SAP实施有什么区别
  5. 考研院校选择【2022 考研 定专业就要这三步——专业必知、专业初选与精选】
  6. GetGeneratedKeysHelper 与反射
  7. 一个数据包的旅程_如何学习数据科学并开始您的惊人旅程
  8. 【CodeForces - 746E】Numbers Exchange(贪心构造)
  9. linux中配置tomcat
  10. 服务器说你注册过多,为什么我的世界服务器说此用户名已被注册我都换了很多用户了都没用 爱问知识人...
  11. 测试基础-04-用例的编写评审
  12. 史上最便捷搭建RocketMQ服务器的方法
  13. ascii码与键盘代码的区别
  14. 系统运维方案_传统运维 VS 互联网运维 框架体系大观
  15. SQL Server 2008 R2 卸载教程
  16. linux 开根号函数,Linux里隐藏的计算器开根号,问他它的地球未解之谜吗?
  17. 实训项目:PHP双色球效果实现
  18. 负载均衡和Nginx
  19. 微信防撤回(.dll补丁形式)
  20. ios wkweb设置图片_ios·WKWebView\UIWebView加载HTMLString,实现图片懒加载

热门文章

  1. JAVA开发与运维(Nginx配置详解)
  2. 等保知识|测评高风险项详解:安全管理部分
  3. MySQL中length()、char_length()的区别和用法
  4. 在5G智慧园区的“保龄球道”上,目标全垒打的征途
  5. FastDFS分布式文件服务器部署与运用
  6. 上、下运动神经元的区别
  7. springboot使用flyway
  8. Scratch软件编程等级考试一级——201909
  9. [Excel]VLOOKUP函数使用示例
  10. 智能路灯引路冰蓄冷替空调