qt中实现多语言功能

qt中实现多语言功能

原理:

其本质就是生成ts文件,然后使用Linguist软件手工翻译,再生成qm文件,最后在主程序的开始加载不同的qm文件,实现多语言。

步骤:
修改程序文件
在pro文件中加入说明

TRANSLATIONS = lang_English.ts \

               lang_Chinses.ts

目的就在在后面执行更新翻译(lupdate)命令在该目录位置生成.ts文件。前提条件是:该目录必须存在,上面的写法就是会在输出目录上生成lang_English.ts和lang_Chinses.ts。

语言文字在程序中说明

为了Qt识别你在程序中需要语言准换的文字,需要将需要转换的文字使用QObject::tr(“…”) 进行标记,否则程序中并不能对其进行识别。如

 label->setText(tr( "Hello World"));

生成ts文件

在Qt的菜单栏之中选择:工具->外部->Qt预言家->更新翻译(lupdate)。这样在pro设置的TRANSLATIONS 目录下生成ts文件

Linguist翻译ts文件
Windows系统的msvc

点击电脑开始菜单,在出现的应用程序列表栏找到Qt安装文件夹,找到Linguist,选择适合自己的Linguist工具,双击打开。

linux系统

直接到qt的安装目录找到Linguist软件,如我的qt安装目录是/opt/Qt5.12.2/5.12.2/gcc_64/bin

打开Linguist后,点击文件->打开,在文件选择框中选择项目生成的ts文件,点击打开。会在Linguist中展示需要翻译的字符串,与类名。

在下方的翻译区进行手动翻译,第二栏是翻译的注释内容,可以不写注释。翻译完一项之后,用Ctrl+Enter会自动跳到下一个待翻译的字符串上,翻译完一个字符串之后,上图字符串列表前面的问号图标会变为一个绿色的对号。

备注:这里可以设置你想翻译成的语言。点击编辑-》翻译文本设置,会弹出一个对话框。在目标语言中选择需要的语言和国家/地区。

生成qm文件

ts文件翻译结束以后,点击保存。

然后在Qt Creator中,使用:工具->外部->Qt预言家->部署翻译(lrelease),就会生成需要的qm文件或者在Linguist中点击文件->发布。这样在和.ts文件同一目录下会生成.qm文件。

加载qm语言包

生成qm文件之后,在main.cpp文件中添加下面的代码,加载qm文件。一般将代码添加到QApplication a(argc, argv);下一行。

#include "dialog.h"#include <QApplication>#include <QTranslator>int main(int argc, char *argv[]){QApplication a(argc, argv);QTranslator translator;QString runPath = QCoreApplication::applicationDirPath();QString  qmFilename = runPath + "/english_eg.qm";bool bret = translator.load(qmFilename);a.installTranslator(&translator);Dialog w;w.show();return a.exec();}

也可以通过点击按钮进行语言包切换设计。

void Dialog::on_pushButton_clicked(){QString qmFilename;static QTranslator translator;QString runPath = QCoreApplication::applicationDirPath();       //获取文件运行路径qmFilename = runPath + "/english_eg.qm";if (translator.load(qmFilename)){qApp->installTranslator(&translator);}ui->retranslateUi(this);//对整个ui界面所有控件都进行语言切换}

  1. 重新设置界面显示

当实现“qApp->installTranslator(translator)”以后,还应该将显示界面重新显示一次进行更新。主界面可以直接借助步骤5中ui->retranslateUi(this)进行重新设置界面显示,但是这个只能更新当前页面,其余页面并不能直接显示出来,。需要对每个widget 对象重写虚函数virtual void changeEvent(QEvent *);

void Dialog::changeEvent(QEvent *e){QDialog::changeEvent(e);switch (e->type()){case QEvent::LanguageChange:ui->retranslateUi(this);break;default:break;}}
注释:

ui->retranslateUi(this);内部相当界面所有控件都调用setText。如下

ui->pushButton_2->setText(QApplication::translate(0,"中文", nullptr));

QApplication::translate函数的参数:第一个参数中0代表全局范围,第二个参数代表要转换语言的字符文本,即ts文件中的source资源。

所以关键是QApplication::translate函数。

TS文件格式

1、文件头部信息。指定了翻译文件的版本(2.1),目标语言(zh_CN,即中文)等信息。

2、划分的作用域名字。

3、每个待翻译的字符串都有一个 message 元素,其中location元素指定了源代码中字符串的位置;source 元素包含了原始的文本;translation元素用于存储翻译后的文本。

其中,location没有也可以,只是QT语言家打开.ts文件时定位不到字符串位置而已,主要还是source 元素和translation元素,source元素相当于字符串的id,翻译家通过source在lang_zh_CN.ts找中文文本,在lang_en.ts找英文文本。

如下面自定义的ts文件

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE TS><TS version="2.1" language="en_US"><context><message><source>测试</source><translation>test</translation></message><message><source>中文</source><translation>chinese</translation></message><message><source>英文</source><translation>english</translation></message></context></TS>

代码实现语言切换

    if(nLanguage == Enum_Language::Lang_en){QString strLanguageFile = g_strRunPath + "/language/lang_en.qm";QFile file(strLanguageFile);bool bExist = file.exists();if(!bExist){return ;}static QTranslator translator;if (translator.load(strLanguageFile)){qApp->installTranslator(&translator);QString strMessage =”英文”;const char* cStrMsg = strMessage.toStdString().c_str();strMessage = QApplication::translate(0,cStrMsg, nullptr);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/845810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Socket网络通讯入门(一)

提示&#xff1a;能力有限&#xff0c;不足以及错误之处还请指出&#xff01; 文章目录 前言一、 计算机网络 OSI、TCP/IP、五层协议 体系结构1.OSI七层模型每层的作用2.TCP/IP协议分成3.五层协议体系结构 二、Socket服务端和客户端 简单通信1.服务端代码2.客户端 总结 前言 简…

游戏软件与应用软件的区别

游戏软件和应用软件在功能、目标用户、使用场景以及设计理念上存在显著区别。以下是详细的比较&#xff1a; 功能和目的 游戏软件 娱乐性&#xff1a;游戏软件的主要目的是提供娱乐和休闲体验&#xff0c;用户通过互动、挑战和成就感获得乐趣。 交互性&#xff1a;通常具有…

vs - 在win10中安装vs2013update5

文章目录 vs - 在win10中安装vs2013update5概述笔记直接安装vs2013-update5报错先安装vs2013原版安装 vs2013 update5测试备注END vs - 在win10中安装vs2013update5 概述 用VS2019写的程序&#xff0c;在早期windows(e.g. win7, win8.1)上安装时&#xff0c;需要UCRT。 UCRT是…

SpringBoot整合jasypt加密配置文件敏感信息

SpringBoot整合jasypt加密配置文件敏感信息 在项目中我们需要对配置文件的一些敏感信息进行加密处理&#xff0c;比如数据库账户密码&#xff0c;避免直接暴露出来&#xff0c;这种场景常常用于生产环境&#xff0c;我们不想让开发人员知道生产库的密码&#xff0c;有运维人员…

mysql中一个字段查看有没有重复的值用DISTINCT函数,查看两个字段有没有重复的值用那个函数实例?

在MySQL中&#xff0c;如果你想要查看一个字段中是否有重复的值&#xff0c;你通常会使用DISTINCT来列出所有不重复的值&#xff0c;然后比较返回的行数是否与原始表的行数相同。如果不同&#xff0c;那么就存在重复的值。 但是&#xff0c;如果你想要查看两个字段的组合是否有…

Aws EKS 技术文章

官网 https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/delete-cluster.html eksctl 官网 https://eksctl.io/usage/vpc-networking/ 指定vpc网段 ##### ## eksctl create cluster -f cluster.yml ### cluster.yml apiVersion: eksctl.io/v1alpha5 kind: Cluster…

基础篇01——SQL的基本语法和分类

MySQL数据库安装与基本使用 安装教程参见&#xff1a;通过zip安装MySQL 通过命令行启动和停止MySQL服务命令 前提&#xff1a;安装MySQL成功之后 启动服务&#xff1a;net start mysql 停止服务&#xff1a;net stop mysql 通过命令行连接mysql 可以通过mysql的客户端命令行…

入手戴尔R720,通过iDRAC查看系统信息

想入手服务器很久了&#xff0c;一直担心功耗太高&#xff0c;今天狠心搞了一台戴尔服务器R720。 需求 开虚拟机&#xff0c;核心数要多 学习以下 Windows云桌面AD域控office online serverubuntu试验机 随便折腾不怕玩坏 最好两个网口以上 稳定 四个以上硬盘位 ‍ 为什么是…

在AutoDL上部署百川2大模型

在AutoDL上部署百川2大模型 AUTO DL相关 官网地址 选择容器实例 租用新实例 选择配置 我这里选择3090 , 硬盘尽量选择可以扩容的 , CUDA版本尽量高一点 选择镜像 先将机器关机 先扩容一下数据盘 50G就可以了 然后选择无卡模式开机 因为无卡模式下开机费用会变低 使用JupyterL…

1.3Java对象和类

Java作为一种面向对象语言。支持以下基本概念&#xff1a; 多态继承封装抽象类对象实例方法重载 本节我们重点研究对象和类的概念。 对象&#xff1a;对象是类的一个实例&#xff08;对象不是找个女朋友&#xff09;&#xff0c;有状态和行为。例如&#xff0c;一条狗是一个…

element-plus 使el-dropdown只显示当前选择节点

在数据对象中设置一个唯一标识符currentDrop&#xff0c;用来存放当前打开的下拉菜单的下标&#xff0c;初始化为null&#xff1a; data() { return { currentDrop: null }; }, 在每个el-dropdown-item上使用visible-change方法&#xff0c;当下拉菜单的状态发生变化时&#…

深入理解Java反射

Java反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;它允许在运行时检查和操作类、方法、字段等信息。反射提供了动态性和灵活性&#xff0c;使得应用程序可以在运行时动态加载和操作类。本篇博客将详细讲解Java反射的概念、使用方法和注意事项&#xff0…

BrainGPT1,一个帮你b站点歌放视频的多模态多轮对话模型

BrainGPT1&#xff0c;一个帮你b站点歌放视频的多模态多轮对话模型 返回论文目录 项目地址 模型地址 作者&#xff1a;华东师范大学&#xff0c;计算机科学与技术学院&#xff0c;智能教育研究院的小怪兽会微笑。 介绍 BrainGPT1是一个工具调用多轮对话模型&#xff0c;与G…

免费实现网站HTTPS访问

HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是一种基于SSL协议的HTTP安全协议&#xff0c;旨在为客户端&#xff08;浏览器&#xff09;与服务器之间的通信提供加密通道&#xff0c;确保数据在传输过程中的保密性、完整性和身份验证。与传统的HTTP相比&a…

MySQL优化器的SQL重写规则

MySQL优化器的SQL重写规则 MySQL优化器的SQL重写规则&#xff1a;MySQL优化器会根据一定的规则对输入的SQL在保证含义不变的情况下进行SQL的优化重写。 1. 条件简化 1.1 移除不必要的括号 例如&#xff1a; ((a 5 AND b c) OR ((a > c) AND (c < 5))); --优化后 (a…

【数据结构与算法(C 语言)】栈的基本操作函数(动图演示) 及 栈的实际应用之一:进制转换

目录 1. 前言2. 结构及基本操作函数&#xff1a;2.1 栈的结构类型 Stack2.2 初始化栈 InitStack2.3 销毁栈 DestroyStack2.4 清空栈 ClearStack2.5 判断栈是否为空 StackEmpty2.6 获取stack的长度 StackLength2.7 获取栈顶元素 GetTop2.8 入栈 Push2.9 出栈 Pop2.10 访问元素2.…

COLING 2024: 复旦发布AoR,层级聚合推理突破大模型复杂推理上限

“三个臭皮匠&#xff0c;顶个诸葛亮&#xff1f;” “一个模型不行&#xff0c;那就再堆一个&#xff1f;” 过去当我们在处理复杂任务的时候&#xff0c;往往会考虑集成策略&#xff08;Ensembling Strategy&#xff09;&#xff0c;通过多个模型投票的方式&#xff0c;选出…

SSL 、IPSec、MPLS和SD-WAN的对比分析

VPN类型 实现方式 应用场景 优势 SSL VPN 基于SSL/TLS协议 传输层加密 远程访问企业 内部资源 易于部署和管理 无需额外客户端 IPSec VPN 基于IPsec协议 网络层加密 站点到站点和远程访问 强大的加密和认证机制 MPLS VPN 基于MPLS技术 标签转发 企业站点间连接…

图形学初识--屏幕空间变换

文章目录 前言正文为什么需要屏幕空间变换&#xff1f;什么是屏幕空间变换&#xff1f;屏幕空间变换矩阵如何推导&#xff1f;问题描述步骤描述 结尾&#xff1a;喜欢的小伙伴点点关注赞哦! 前言 前面章节主要讲解了视图变换和投影变换&#xff0c;此时距离在屏幕空间显示也就…

alexnet模型_图像分类算法对动物有无斑纹识别-不含数据集图片-含逐行注释和说明文档

alexnet模型_图像分类算法对动物有无斑纹识别-不含数据集图片-含逐行注释和说明文档 代码下载地址&#xff1a; https://download.csdn.net/download/qq_34904125/89357170 本代码是基于python pytorch环境安装的。 下载本代码后&#xff0c;有个环境安装的requirement.txt…