Qt多语言功能实现

本文介绍Qt多语言功能实现。

应用程序多语言支持是常用功能,比如产品需要出口到不同语种的国家。采用Qt的多语言支持工具可以方便实现应用程序的多语言功能。本文以中英文语言切换为例,简要介绍Qt的多语言功能实现。

1.界面设计

界面设计需要考虑使用语言字符宽度,比如相同语义下,中文相对简洁,而英文就相对冗长一些,设计时可考虑以英文为设计界面。如本例所设计的界面如下:

2.字符串处理

字符串处理是针对代码逻辑实现过程中,需要显示到界面的字符串,比如图中的“switch”在中文的时候需要显示成“切换”。在代码中,尽量统一使用英文来描述,并使用特殊的字符串包裹,如在Qt中需要使用“tr”包裹需要多语言支持的字符串。参考代码如下:

ui->label->setText(tr("hello"));

3.翻译过程

翻译的过程最主要的就是生成对应不同语言的qm文件。

1)工程配置

在Qt Creator中,在项目中的“.pro”中增加需要生成ts文件名,以方便后续按此文件名生成ts文件。如本例中想要生成英中文的ts文件,文件名分别为:“en_tr.ts”,“zh_tr.ts”,参考代码如下:

TRANSLATIONS += en_tr.ts \zh_tr.ts

2)ts文件生成

在Qt Creator中,点击Tools -> External -> Linguist -> Update Translations(lupdate)即可生成ts文件。在消息输出中可以检查是否成功生成,也可以在工程目录下查看是否有2个ts的文件。

3)翻译内容

打开“Qt Linguist”工具,这里使用的是Linux系统,需要在安装目录的“bin”目录中查找“linguist”可执行程序。打开需要翻译的ts文件,如我们需要对中文进行翻译,则打开“zh_tr.ts”文件,依次填写翻译内容。如下图。

4)生成qm文件

qm文件是程序中根据选择语言(这里是中英文)的不同实际要加载的文件。它的生成有如下2种方法:

a)直接在“Qt Linguist”工具中,File -> Release,即可在项目目录中生成对应的qm文件(需要先打开相应的ts文件)。

b)在Qt Creator中,Tools -> External -> Linguist -> Release Translations(lrelease)。

注意:2者的区别是,b)方法可以一次生成所有的qm文件,而a)方法需要打开不同的ts文件2次。

4.程序实现

生成最终想要的qm文件后,就可以在代码中实现多语言的切换了。以中英文切换为例,我们在按下“switch”按钮后切换另一种语言,参考代码如下:

void MainWindow::on_pushButton_clicked()
{QTranslator translator;bool bOK = false;QString strPath = QCoreApplication::applicationDirPath();if (!bSwitched) {bOK = translator.load(strPath + "/zh_tr.qm");} else {bOK = translator.load(strPath + "/en_tr.qm");}if (bOK) {qApp->installTranslator(&translator);ui->retranslateUi(this);bSwitched = !bSwitched;}ui->pushButton->setText(tr("switch"));ui->label->setText(tr("hello"));
}

注意

1)这里的qm文件需要提前拷贝到可执行文件所在目录。

2)可以在类构造函数中添加上述类似代码,在软件启动过程中加载默认语言。

总结,本文介绍了Qt多语言功能实现。

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

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

相关文章

正则表达式与文本三剑客之grep

目录 前言 一、grep命令 二、基础正则表达式常见元字符 2.1、特殊字符 2.2、定位符 2.3、非打印字符 三、元字符操作实例 3.1、查找特定字符 3.2、利用中括号“[]”来查找集合字符 3.3、查找行首“^”与行尾字符“$” 3.4、查找任意一个字符“.”与重复字符“*” 3.…

BGP选路之Preferred value

原理概述 当一台BGP路由器中存在多条去往同一目标网络的BGP路由时,BGP协议会对这些BGP路由的属性进行比较,以确定去往该目标网络的最优BGP路由,然后将该最优BGP路由与去往同一目标网络的其他协议路由进行比较,从而决定是否将该最优…

OAuth2.0 or Spring Session or 单点登录流程

1.社交登录 2.微博社交登录 第三方登录 1.登录微博 2.点击网站接入 3.填写完信息,到这里,写入成功回调 和 失败回调 是重定向,所以可以写本地的地址 3.认证 分布式Session spring-session 域名不一样 发的 jSessionId 就不同&#xff0c…

自定义element主题

说明:这里使用的是vue3做的demo,所以使用的是element-plus,不同版本大同小异 一、安装element-plus npm install element-plus --save二、在main.ts中引入 import ElementPlus from "element-plus"; import "element-plus/d…

Kubernetes学习指南:保姆级实操手册03——规划部署

Kubernetes学习指南:保姆级实操手册03——规划部署 一、部署节点规划 Hostnameiprolesk8s-master0110.255.210.1masterk8s-master0210.255.210.2masterk8s-master0310.255.210.3masterk8s-node0110.255.210.4worker nodek8s-node0210.255.210.5worker nodek8s-nod…

【深度学习】LDA线性判别分析

date:2024/07/23 author:sion tag:Deeping Learn LDA(线性判别分析) 文章目录 LDA(线性判别分析)1.LDA是什么LDA是一种解决二分类问题的线性方法。它描述,对于给定样例集,将样例点投影到一条直线上,这条直线能使异样的样例相距远,…

Linus: vim编辑器的使用,快捷键及配置等周边知识详解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 vim的安装创建新用户 adduser 用户名Linus是个多用户的操作系统是否有创建用户的权限查看当前用户身份:whoami** 怎么创建设置密码passwdsudo提权(sudo输入的是用户…

Golang | Leetcode Golang题解之第275题H指数II

题目: 题解: func hIndex(citations []int) int {n : len(citations)return n - sort.Search(n, func(x int) bool { return citations[x] > n-x }) }

数驭未来,景联文科技构建高质大模型数据库

国内应用层面的需求推动AI产业的加速发展。根据IDC数据预测,预计2026年中国人工智能软件及应用市场规模会达到211亿美元。 数据、算法、算力是AI发展的驱动力,其中数据是AI发展的基石,中国的数据规模增长速度预期将领跑全球。 2024年《政府工…

go语言day15 goroutine

Golang-100-Days/Day16-20(Go语言基础进阶)/day17_Go语言并发Goroutine.md at master rubyhan1314/Golang-100-Days GitHub 第2讲-调度器的由来和分析_哔哩哔哩_bilibili 一个进程最多可以创建多少个线程?-CSDN博客 引入协程 go语言中内置了协程goroutine&#…

Python实现图片相似度比较之SSIM

Python实现图片相似度比较之SSIM 解读 SSIM 数值 结构相似性指数 (SSIM) 是用来衡量两张图像相似度的指标,范围从 -1 到 1: 1 表示完全相同。0 表示没有任何相似性。负值 表示图像之间的差异超出了正常范围(通常是因为两张图像的内容差异非…

积木报表-自定义报表

文章目录 一、springboot初始项目集成积木报表二、springboot正式项目集成积木报表注意点注意点1:依赖下载失败原因:Maven私服设置注意点2:dependency在【springboot初始项目集成积木报表】情况下不要放在根目录的pom里,放子模块的…

【Python系列】详解 open 函数:文件操作的基石

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

C# 委托函数 delegate

在C#中,委托(Delegate)是一种特殊的类型,它可以持有对方法的引用。 委托是实现事件的基础。事件本质上是多播委托,允许多个方法被触发 委托允许你将方法作为参数传递给其他方法,或者将方法作为返回值从方法…

Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示

Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示 目录 Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示 一、简单介绍 二、共享纹理 1、共享纹理的原理 2、共享纹理涉及到的关键知识点 3、什么可以实现共享 不能实现共享…

微服务安全——SpringSecurity6详解

文章目录 说明SpringSecurity认证快速开始设置用户名密码基于application.yml方式基于Java Bean配置方式 设置加密方式自定义用户加载方式自定义登录页面前后端分离认证认证流程 SpringSecurity授权web授权:基于url的访问控制自定义授权失败异常处理方法授权:基于注解的访问控制…

沐风老师3DMAX一键烘焙插件使用方法

3DMAX一键烘焙插件使用教程 3DMAX一键烘焙插件:从3dMax2021增加了一个新功能是全新的BakingToTexture(烘焙到纹理)工具。s3DMAX一键烘焙插件是新BakingToToTorTexture的简化前端。它允许用户一键烘焙某些实用程序映射(贴图&#x…

MySQL 数据表

InnoDB存储引擎文件 InnoDB存储引擎相关的文件包括重做日志文件、表空间文件。 表空间文件 InnoDB存储引擎在设计上模仿了Oracle,将存储的数据按表空间进行存放。默认配置下,会有一个初始化大小为10MB、名为ibdata1的文件,该文件就是默认的…

FlutterFlame游戏实践#16 | 生命游戏 - 编辑与交互

theme: cyanosis 本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究! Flutter\&Flame 游戏开发系列前言: 该系列是 [张风捷特烈] 的 Flame 游戏开发教程。Flutter 作为 全平台 的 原生级 渲…

Jenkins卡在等待界面解决方法

一、问题 部署jenkins服务器出现Please wait while Jenkins is getting ready to work。 二、原因分析 jenkins里面文件指向国外的官网,因为防火墙的原因连不上。 三、解决方法 将配置文件里面的url换成国内镜像: (1)修改配…