Qt对于多语言提供了QTranslator的接口,只要在程序启动时进行安装,然后动态改变QTranslator的加载即可。下面是效果图(英文/简体/繁体)。

选择不同的语言,界面会随着切换。这要如何实现呢?QTranslator会加载*.qm的语言档,而该文件是从*.ts转换而来的。所以我们首先要做的是制作*.ts档。步骤如下

1.在项目的Resource Files的位置右击,添加新建项,选择.cpp类型的文件,然后将名字命名为ts的后缀,比如simplify.ts。

2.双击simplify.ts,在里面添加ts必要的内容。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0"></TS>

3.右击ts档,选择lupdate,更新ts档。如下图。

4.查看ts档。右击ts档->打开方式->XML(文本)编译器->双击或确定。(ts档是xml格式,选用xml编译器,便于编辑)。内容如下

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0">
<context><name>LanguagesDialog</name><message><source>Languages</source><translation type="unfinished"></translation></message><message><source>English</source><translation type="unfinished"></translation></message><message><source>Simplify</source><translation type="unfinished"></translation></message><message><source>Traditional</source><translation type="unfinished"></translation></message>
</context>
</TS>

5.编译ts档。代码中使用tr转换的字段都被提取了出来,并且存在了message字段下。message字段下的source是代码中的源字段,translation就是转换的内容。我们将type="unfinished"删除,然后添加内容。编译后的内容如下。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0"><context><name>LanguagesDialog</name><message><source>Languages</source><translation >多语言</translation></message><message><source>English</source><translation >英文</translation></message><message><source>Simplify</source><translation >简体</translation></message><message><source>Traditional</source><translation >繁体</translation></message></context>
</TS>

6.繁体档(traditional.ts)和英文档(english.ts)按同样的方法制作。也可直接将simpify.ts复制,然后改名。

7.生成qm档。选中ts->右击->lrelease.如下图


8.查看qm档是否生成成功。也就是说,生成了对应的english.qm、simplify.qm、traditional.qm。如下图

注:对于ts和qm档的制作也可以直接使用qt的Qt Linguist工具来制作。

qm制作完成后,在代码中要实现相应的切换和调用。下面是实现代码。

main.cpp

#include <QtWidgets/QApplication>
#include "LanguagesDialog.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);LanguagesDialog languagesDialog;a.installTranslator(languagesDialog.qTranslator);//注意:一定要加上这一句,才能将转换器安装到程序中,否则语言切换会失败。languagesDialog.show();return a.exec();
}

LanguagesDialog.h

#include <QtWidgets>class LanguagesDialog:public QDialog
{Q_OBJECT
public:LanguagesDialog();QTranslator *qTranslator;
protected:void changeEvent(QEvent *);private slots:void languageChanged();private:void translateUi();QGroupBox *languages;QRadioButton *english;QRadioButton *simplify;QRadioButton *traditional;};

LanguagesDialog.cpp

#include "LanguagesDialog.h"LanguagesDialog::LanguagesDialog():QDialog()
{languages=new QGroupBox(this);english=new QRadioButton(this);simplify=new QRadioButton(this);traditional=new QRadioButton(this);qTranslator=new QTranslator();english->setChecked(true);qTranslator->load("english");QVBoxLayout *baselayout=new QVBoxLayout(this);baselayout->addWidget(languages);QVBoxLayout *radioLayout=new QVBoxLayout(languages);radioLayout->addWidget(english);radioLayout->addWidget(simplify);radioLayout->addWidget(traditional);connect(english,SIGNAL(toggled(bool)),this,SLOT(languageChanged()));connect(simplify,SIGNAL(toggled(bool)),this,SLOT(languageChanged()));connect(traditional,SIGNAL(toggled(bool)),this,SLOT(languageChanged()));translateUi();
}void LanguagesDialog::translateUi()
{languages->setTitle(tr("Languages"));//用tr转换的字段,会被自动抽取出来,将利用QTranslator来转换。english->setText(tr("English"));simplify->setText(tr("Simplify"));traditional->setText(tr("Traditional"));
}void LanguagesDialog::changeEvent(QEvent *event)
{    if (event->type()==QEvent::LanguageChange){translateUi();//更新界面}else{QDialog::changeEvent(event);}
}///slots
void LanguagesDialog::languageChanged()
{if (english->isChecked()){qTranslator->load("english");//加载英文}else if(simplify->isChecked()){qTranslator->load("simplify");//加载简体}  else if(traditional->isChecked()){qTranslator->load("traditional");//加载繁体}
}

如果需要与操作系统的语言相匹配,那么可以利用QLocale::system().name()获取系统的语言信息,然后载入对应的语言档。简易代码如下

int main(int argc, char *argv[])
{QApplication a(argc, argv);  QTranslator translator;translator.load(QLocale::system().name());a.installTranslator(&translator);//other thing.return a.exec();
}

注意:QLocale::system().name()获取的语言信息是依据ISO_639-1和ISO_3166-1生成的,一般是语言_区域的形式,比如中文代号是zh,中国的代号是CN,所以组合出来的结果就是zh_CN。所以这就要求我们在制作i18n(国际化)和l10n(本地化)的文言档时,最好是依照这种规范生成相应的ts和qm档。比如刚刚可以是zh_CN.ts和zh_CN.qm。当然可以适当的加入前缀,以便于区分不同的程序(LanguageDialog_zh_ch)。前缀可以用translator.load(QString("LanguageDialog_")+QLocale::system().name())组合而成。

以上就是简单的实现。

转载于:https://www.cnblogs.com/sparkleDai/p/7605053.html

Qt动态多语言的实现(VS2012开发)相关推荐

  1. dhtml是基于html的一门语言,用户直接使用集成的动态HTML语言(简称DHTML)来开发基于.ppt...

    15.3 VB 应用程序的 Internet 扩展 * 在VB里,用户直接使用集成的动态HTML语言(简称DHTML)来开发基于HTML语言的应用程序.DHTML将文档中的每一个元素都看成一个对象,通 ...

  2. QT + OpenCV + MinGW 在windows下配置开发环境

           由于研究项目需要,最近开始接触C++界面设计,关于"QT + OpenCV + MinGW在windows下配置开发环境"着实让人头疼,单次配置时间相当长,也十分不容 ...

  3. Qt+大恒相机+OpenCV+MinGW界面开发

    Qt+大恒相机+OpenCV+MinGW界面开发 遇到的坑有哪些? 大恒相机接口的问题(C与C++选谁,傻傻分不清) OpenCV版本与MinGW编译平台适应性问题(编译通过,但是一运行就异常退出) ...

  4. php语言与jsp,关于开发语言之PHP JSP与ASP NET对比浅析

    关于开发语言之PHP JSP与http://www.doczj.com/doc/140b0d8802020740be1e9bb7.html对比浅析 [摘要]在21世纪的今天,网络成为了我们生活的每日必 ...

  5. .NET 动态脚本语言Script.NET系列文章汇总 非常精彩的应用举例

    对于Script.NET,我已经写了三篇文章来介绍它,文章汇总如下 .NET 动态脚本语言Script.NET 入门指南 Quick Start .NET 动态脚本语言Script.NET 开发指南 ...

  6. C语言到嵌入式Linux开发项目指导

    C语言到嵌入式Linux开发项目指导 第一阶段C语言 1.常量与变量,数据类型,数据类型转换,数据输入与输出: 2.C语言运算符,C语言操作符,C语言表达式,表达式优先级: 3.C语言流程控制,分支, ...

  7. 建模语言UML在软件开发中的应用

      建模语言 UML 在软件开发中的应用 摘要:UML( Unified Modeling Language)是建立系统模型和分析业务处理流程强有力的工具,它能够帮助软件开发人员从不同角度描述系统,使 ...

  8. 基于Qt上USBCAN模块的二次开发

    最近用qt做了一个USBCAN二次开发的上位机软件.经过本人实际测试,效果不错,界面和官方的软件类似.做此软件的目的主要是学会调用该模块的二次开发库, 采集数据时也就可以将数据进行简单的处理,这样调试 ...

  9. 基于 Qt Quick+websocket 的Web扫描仪驱动开发

    基于 Qt Quick+websocket 的Web扫描仪驱动开发 核心需求 在浏览器中点击扫描按钮,驱动扫描仪进行扫描,接收图片保存到ftp指定路径. 支持扫描仪参数设置 出现异常时可重置恢复 支持 ...

最新文章

  1. seaborn可视化多水平分类变量分组箱图boxplot并自定义多个箱体的顺序(Manually Order Boxes in Boxplot with Seaborn)
  2. 地图区域划分转换成数学模型解决问题
  3. 使用Qt开发中国象棋(一):概述
  4. Codeforces 1198 1199
  5. 计算机视觉开源库OpenCV之利用开操作(Opening Operation)修复受损照片方法
  6. python 复制文件夹内容 并结构一致_Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法...
  7. 小猫的java基础知识点汇总(下)
  8. App的selenium,Appium爬App!
  9. 使用电信光猫+华为路由器实现内网穿透,外网访问内网 之 光猫超级管理员密码获取并设置桥接模式
  10. 免费https ssl证书freessl.org的申请及配置
  11. Interpreting visually-grounded navigation instructions in real environments论文翻译
  12. Scanner的close()方法的使用以及Scanner应该如何关闭
  13. 【spring事务管理】
  14. java 一年有多少周_Java获取一年有多少周、某周的第一天和最后一天.
  15. 数据结构(递归及应用)
  16. 【PR 基础】PR界面简介
  17. pytest之标记会失败的测试:pytest.mark.xfail
  18. 淄博旅游景点与美食汇总
  19. utf8转gb2312
  20. 11、RH850 中断配置

热门文章

  1. hihoCoder #1954 : 压缩树(虚树)
  2. Django—模板渲染
  3. Hibernate Annotation _List/Map
  4. SRS学习笔记7-SrsHttpServer
  5. 17._5正则表达式的替换
  6. bin(x) 将整数x转换为二进制字符串
  7. 双中心积分计算氟化氢HF的动能和势能
  8. 1/r单中心双电子积分Li+
  9. 用神经网络分类左和右
  10. python输入输出简单例子_Python 文件和流的简单示例