国际化语言项目
基本概念
1、使用QString对象表示所有用户可见的文本。由于QString内部使用Unicode编码实现,所以它可以用 于表示所有需要向用户呈现的文本。当然,对于仅程序员可见的文本并不需要都变为QString对象,可利 用Qt提供的QCString或原始的“char *”。
2、使用tr()函数获取所有需要翻译的文本。在Qt的翻译机制下,QObject::tr()函数可以帮助程序员取得 翻译之后的文本。对于从QObject继承而来的类,QObject::tr()函数最终由QMetaObject::tr()实现。在某 些时候,如果无法使用QObject::tr()函数,则可以直接调用QCoreApplication::translate()取得翻译之后 的字符串。
3、使用QString::arg()方法组织动态文本。有些时候,一段文本需要由一些静态文本和动态变量组合起 来,如常见的情况“printf(“The value of i is: %d”, i)”。对于这种动态文本的翻译,由于语言习惯的问题, 如果简单地采用这种连接字符串的方法,则可能会带来一些问题,如下面的字符串用于表示任务的完成 情况:
QString m = tr("Mission status: " )+ x + tr("of ") + y +tr("are completed");
其中,x和y是动态的变量,三个字符串被x和y分隔开,它们能够被很好地编译,因为“x of y”是英语中分 数的表示方法,如4 of 5是分数4/5,在不同的语言中,分子和分母的位置可能是颠倒的,在这种情况 下,数字4和5的位置在翻译时无法被正确地放置。由此可见,孤立地翻译被分隔开的字符串是不行的, 改进的办法是使用QString:: arg()方法:
QString m = tr("Mission status: %1 of %2 are completed").arg(x).arg(y);
4、利用QTranslator::load()和QCoreApplication::installTranslator()函数读取对应的翻译之后的资源文 件。翻译工作者将提供包含翻译之后的字符串的资源文件“*.qm”,程序员还需要做的是定义 QTranslator对象,并使用load()函数读取相应的“.qm”文件,利用QCoreApplication:: installTranslator()函数安装QTranslator对象。
多国语言国际化的实现
多国语言国际化的实现,主要是利用Qt提供的工具lupdate、linguist和lrelease(它们都可以在Qt安 装目录的“bin”文件夹下找到)协助翻译工作并生成最后需要的“.qm”文件,它包括以下内容。
1、利用lupdate工具从源代码中扫描并提取需要翻译的字符串,生成“.ts”文件。类似编译时用到的 qmake,运行lupdate时也需要指定一个“.pro”的文件,可以单独创建这个“.pro”文件,也可以利用编译 时用到的“.pro”文件,只需定义好变量TRANSLATIONS即可。
2、利用linguist工具来协助完成翻译工作,即打开前面用lupdate生成的“.ts”文件,对其中的字符串逐条 进行翻译并保存。由于“.ts”文件采用了XML格式,所以也可以使用其他编辑器来打开“.ts”文件并翻译。
3、利用lrelease工具处理翻译好的“.ts”文件,生成格式更为紧凑的“.qm”文件。这便是翻译工作者最终需 要提供的资源文件,它所占的空间比“.ts”文件小,但基本不具有可读性,只有QTranslator能够正确地识 别它。
修改工程文件.pro,添加一下内容:
TRANSLATIONS = lang_en.ts\
leng_zh.ts\
lang_la.ts
其中,.ts文件是将要生成的翻译文件,有多少种语言就写多少个文件,文件不需要手动创建。
本例中包含三种语言,那么lang_en.ts就是英文的翻译文件,lang_zh.ts是中文的翻译文件,lang_la.ts是 意大利语的翻译文件。
c.编译工程。记住,一定要先编译,如果没有编译就进行下面的步骤,则生成的“.ts”文件只是一个仅有标 题栏的框架。
d.编译完成后,打开Qt 5.8 64-bit for Desktop (MSVC 2013),打开命令行窗口,执行命令:lupdate 工程文件,如下图:

执行完后在工程目录下会生成.ts文件,如下图:

e.执行命令:lrelease 工程文件,如下图:

f.最终生成的.qm文件即我们代码中需要加载的翻译文件。
加载翻译文件的代码如下:
/* 修改翻译文件函数 code参数为语言类型*/
void MainWindow::changeTr(const QString &code)
{
//定义QTranslator 指针
static QTranslator *translator;
if(translator != NULL)
{
//删除旧的QTranslator 对象
qApp->removeTranslator(translator);
delete translator;
translator = NULL;
}
//创建新的QTranslator 对象
translator = new QTranslator;
//设置翻译文件路径
QString qmFileName = QString(":/lang_%1.qm").arg(code);
//加载翻译文件
if(translator->load(qmFileName))
{
//应用翻译对象
qApp->installTranslator(translator);
}
//更新UI
ui->retranslateUi(this);
retranslateUi();
}
相关文章:
国际化语言项目
基本概念 1、使用QString对象表示所有用户可见的文本。由于QString内部使用Unicode编码实现,所以它可以用 于表示所有需要向用户呈现的文本。当然,对于仅程序员可见的文本并不需要都变为QString对象,可利 用Qt提供的QCString或原始的“char …...
交直流系统潮流计算及相互关联特性分析(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
如何快速掌握Facebook运营+独立站运营基础?
在当今数字化时代,Facebook运营和独立站运营成为许多企业和个人创业者的关键战略。通过巧妙地结合这两个渠道,你可以有效地推广品牌、吸引目标受众并实现商业目标。本文将为你介绍如何快速掌握Facebook运营和独立站运营的基础知识,为你的业务…...
Java之旅(十三)
Java 类 Java类是Java编程语言中的基本构建块,是一种用户定义的数据类型,它可以被看作是一个模板或蓝图。它是对象的模板,,描述了一组具有相同特征(属性)和行为(方法)的对象。Java …...
Calibre 6.18.1 正式发布,功能强大的开源电子书工具
导读Calibre 开源项目是 Calibre 官方出的电子书管理工具。它可以查看,转换,编辑和分类所有主流格式的电子书。Calibre 是个跨平台软件,可以在 Linux、Windows 和 macOS 上运行。 Calibre 6.18.1 正式发布,此次更新内容如下&#…...
如何在C语言中定义和使用函数?
如何在C语言中定义和使用函数? 引言: 函数是C语言中的一个重要概念,它使程序能够模块化、重用和组织代码。通过将一段逻辑相关的代码封装到函数中,我们可以提高代码的可读性、可维护性和重用性。本文将详细介绍在C语言中定义和使…...
【C++】4.多媒体库:SFML库入门
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍SFML库使用。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习知识,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路&#…...
【算法题】1717. 删除子字符串的最大得分
插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 给你一个字符串 s 和两个整数 x 和 y 。你可以执行下面…...
Codeforces Round 877 (Div. 2) ABCD
A. Blackboard List solve: 1、生成的数一定不是负数,所以有负数的情况下,负数一定是原来的数。 2、没有负数的情况下,最大的数一定是原来的数,因为操作只能使数变小。 void solve() {cin>>n;for(int i0;i<n;i)cin>&…...
easyExcel导入失败提示用户第几行有误并回滚数据
思路: 在controller定义一个map,将map传入excel监听器,在监听器中处理excel的数据,读取到某一行出现错误就将错误提示信息存入map并抛出一个异常给service。在service方法上开启事务,并将异常出实现数据回滚࿰…...
问道价值互联网,区块链的下一个十年 | 2023 开放原子全球开源峰会区块链分论坛即将启幕
随着全球 Web3 浪潮经由数字藏品、元宇宙的日渐普及而实现落地,区块链在“信息互联网”转向“价值互联网”中的重要作用正得到进一步认可。在数字经济蓬勃发展、数据成为重要生产要素的时代,区块链已不仅仅是一项技术、一种工具,更是一种思维…...
解读 Nginx 配置
tip:作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。 推荐:体系化学习Java(Java面试专题) 文章目录 1、Nginx 配…...
知识变现海哥:课程定价容易出现的三大误区
哈喽,大家好,我是海哥,知识付费变现创业教练,教育公司培训总监,从事知识付费变现咨询10年,已助力3000人实现知识付费变现。 很多做知识付费的老师都有定价方面的困惑。怕定太高,卖不出去&#…...
Android开发 LogDog (日志狗)V2.0.0
目录 一、简介 二、使用推荐 1、初始化LogDog 2、运行中如何更改初始化时的配置? 三、更改 四、新功能 1、Log过滤 2、自定义打印 3、提供占位符式打印 一、简介 LogDog V1.0 版本https://blog.csdn.net/Ym_quiet/article/details/130453232?spm1001.2014…...
JavaScript break
在JavaScript中,break语句用于提前退出或终止循环或switch语句。它允许您立即停止循环或switch的执行,并继续执行后面的代码。 以下是在循环中使用break的示例: javascript for (var i 0; i < 10; i) { if (i 5) { break; // 当…...
linux服务器使用curl命令处理常用es查询
目录 场景: 结果格式化显示: 验证服务启动: 单个参数变量查询: 分页查询: 日期范围查询: must中单个参数条件查询 must中多个参数条件查询 使用filter过滤查询 使用sort过滤查询 总结: 场景…...
Office Visio 2013安装
哈喽,大家好。今天一起学习的是Visio 2013的安装,这是一个绘制流程图的软件,用有效的绘图表达信息,比任何文字都更加形象和直观。Office Visio 是office软件系列中负责绘制流程图和示意图的软件,便于IT和商务人员就复杂…...
C++ 私有析构函数的作用
如果一个类的析构函数声明为私有(private),其他对象或函数将无法直接调用析构函数。这意味着如果你尝试使用delete操作符删除该类的对象,将会导致编译错误,因为析构函数是不可访问的。 将析构函数声明为私有是一种防止…...
【C++】deque的用法
目录 一、容器适配器二、deque的介绍三、deque的使用及缺陷1、deque的构造函数2、deque的元素访问接口3、deque的 iterator的使用4、deque的增删查改4、deque的缺陷5、为什么选择deque作为stack和queue的底层默认容器 一、容器适配器 在了解deque前,我们先讲一讲什…...
Live800:智能客服有哪些未来发展趋势?
智能客服,也称智能问答系统,是一种利用机器学习、自然语言处理等技术实现自主询问、自主应答、自主维护的自动化系统。它们可以通过文字形式,为用户提供个性化、一对一的服务,避免了人工客服的人力成本和等待时间。 未来ÿ…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...
2025.6.9总结(利与弊)
凡事都有两面性。在大厂上班也不例外。今天找开发定位问题,从一个接口人不断溯源到另一个 接口人。有时候,不知道是谁的责任填。将工作内容分的很细,每个人负责其中的一小块。我清楚的意识到,自己就是个可以随时替换的螺丝钉&…...
RabbitMQ 各类交换机
为什么要用交换机? 交换机用来路由消息。如果直发队列,这个消息就被处理消失了,那别的队列也需要这个消息怎么办?那就要用到交换机 交换机类型 1,fanout:广播 特点 广播所有消息:将消息…...
使用ch340继电器完成随机断电测试
前言 如图所示是市面上常见的OTA压测继电器,通过ch340串口模块完成对继电器的分路控制,这里我编写了一个脚本方便对4路继电器的控制,可以设置开启时间,关闭时间,复位等功能 软件界面 在设备管理器查看串口号后&…...
触发DMA传输错误中断问题排查
在STM32项目中,集成BLE模块后触发DMA传输错误中断(DMA2_Stream1_IRQHandler进入错误流程),但单独运行BLE模块时正常,表明问题可能源于原有线程与BLE模块的交互冲突。以下是逐步排查与解决方案: 一、问题根源…...
【见合八方平面波导外腔激光器专题系列】用于干涉光纤传感的低噪声平面波导外腔激光器2
----翻译自Mazin Alalus等人的文章 摘要 1550 nm DWDM 平面波导外腔激光器具有低相位/频率噪声、窄线宽和低 RIN 等特点。该腔体包括一个半导体增益芯片和一个带布拉格光栅的平面光波电路波导,采用 14 引脚蝶形封装。这种平面波导外腔激光器设计用于在振动和恶劣的…...
