Qt学习之路(34): 国际化(下)

实现QT的多语言切换(静态+动态) 如何更好实现软件的多语言切换功能,便于管理多人的项目共同开发。 阅读详情
上次说了国际化的过程,现在来看一下具体的国际化的相关代码。
 
在代码中,我们使用tr()将需要翻译的字符串标记出来。lupdate工具就是提取出tr()函数中的相关字符串。tr()函数是QObject类的一个static函数,其签名如下:
 
static QString tr( const  char *sourceText,  const  char *comment = 0,  int n = -1);
 
虽然我们只传了一个参数,但是实际上tr()函数是接受3个参数的。第一个参数是我们需要翻译的文字,如果使用qm文件有对应的字符串,则使用对应的字符串进行替换,否则将显示sourceText参数指定的字符串。第二个参数是一个注释,用于解释前面的sourceText的含义,比如table一词既可以当做桌子翻译,又可以当成表格翻译,这时你就需要提供这个注释。或许你会问,使用翻译工具的时候不是有源代码吗?问题是,有可能人家不使用这个翻译工具,而使用别的工具,这样就不能保证会有这个源代码的预览;并且,你的程序不一定必须要发布源代码的;翻译人员往往只得到我们导出的ts文件,如果你加上注释,就可以方便翻译人员进行翻译。最后一个参数n用于指定字符串是否为复数。我们知道,很多语言,比如英语,很多名词的单复数形式是不相同的,为了解决这个问题,Qt在tr()函数中提供了一个参数n。请看如下代码:
 
int n = messages.count(); 
showMessage(tr( "%n message(s) saved", "", n));
 
对于n的值的不同,Qt会翻译成不同的文字,例如:
 
 n 翻译结果 
 0 0 message saved 
 1 1 message saved
 2 2 messages saved
 5 5 messages saved
 
tr()函数是QObject的函数,如果你的类不是继承自QObject,就不能直接使用tr()函数。比如我们在main()函数中希望增加一句设置MainWindow的title的代码:
 
w.setWindowTitle(tr( "MyApp"));
 
直接这样写是无法通过编译的,因为main()函数是全局函数,所以这个tr()是找不到的。解决办法一是显式地调用QObject的函数:
 
w.setWindowTitle(QObject::tr( "MyApp"));
 
或者,你可以使用QCoreApplication的translate()函数。你一定还记得,我们的main()函数的第一句总是QApplication app;,其实,QApplication就是QCoreApplication的子类。所以,我们也能这样去写:
 
w.setWindowTitle(app.translate( "MyApp"));
 
由于在Qt程序中,QCoreApplication是一个单例类,因此,Qt提供了一个宏qApp,用于很方便的访问QCoreApplication的这个单例。所以,在其他文件中,我们也可以直接调用qApp.translate()来替换tr(),不过这并没有必要。
 
如果你的翻译文本中包含了需要动态显示的数据,比如我们上次代码中的
 
QMessageBox::information(NULL, tr( "Path"), tr( "You selected\n%1").arg(path));
 
这句你当然可以写成
 
QMessageBox::information(NULL, tr( "Path"),  "You selected\n" + path);
 
但这种连接字符串的方式就 不能够使用tr()函数了!因此,如果你需要像C语言的printf()函数这种能够格式化输出并且需要翻译时,你必须使用我们例子中的%1加arg()函数!
 
如果你想要翻译函数外部的字符串,你需要使用两个宏QT_TR_NOOP()和QT_TRANSLATE_NOOP()。前者是用来翻译一个字符串,后者可以翻译多个字符串。它们的使用方法如下:
 
QString FriendlyConversation::greeting( int type) 
 { 
          static  const  char *greeting_strings[] = { 
                 QT_TR_NOOP( "Hello"), 
                 QT_TR_NOOP( "Goodbye") 
         }; 
          return tr(greeting_strings[type]); 
 }
 
static  const  char *greeting_strings[] = { 
         QT_TRANSLATE_NOOP( "FriendlyConversation",  "Hello"), 
         QT_TRANSLATE_NOOP( "FriendlyConversation",  "Goodbye") 
 }; 
 
 QString FriendlyConversation::greeting( int type) 
 { 
          return tr(greeting_strings[type]); 
 } 
 
 QString global_greeting( int type) 
 { 
          return qApp->translate( "FriendlyConversation", 
                                                        greeting_strings[type]); 
 }
 
好了,以上就是我们用到的大部分函数和宏。除此之外,如果我们运行前面的例子就会发现,实际上我们只是翻译了菜单等内容,打开文件对话框并没有被翻译。原因是我们没有给出国际化的信息。那么,怎么才能让Qt翻译这些内建的文字呢?我们要在main()函数中添加几句:
 
int main( int argc,  char *argv[]) 
{ 
        QApplication a(argc, argv); 
        QTranslator qtTranslator; 
        qtTranslator.load( "myapp.qm"); 
        a.installTranslator(&qtTranslator); 
        QTranslator qtTranslator2; 
        qtTranslator2.load( "qt_zh_CN.qm"); 
        a.installTranslator(&qtTranslator2); 
        MainWindow w; 
        w.resize(800, 600); 
        w.show(); 
         return a.exec(); 
}
 
我们又增加了一个QTranslator对象。Qt实际上是提供了内置字符串的翻译qm文件的。我们需要在Qt安装目录下的translations文件夹下找到qt_zh_CN.qm,然后同前面一样,将它复制到exe所在目录。现在再运行一下程序:哈哈已经完全变成中文了吧!
 
至此,我们的Qt程序的国际化翻译部分就结束啦!

本文出自 “豆子空间” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/245063

Qt国际化详细介绍 Qt 国际化 阅读详情

相关推荐

Qt 多语化--国际化

QT除了采用英语和许多欧洲语系中的拉丁字母之外,它还提供了许多其他的位子系统。QT的整个应用程序编程的接口及其内部都是用的Unicode,这样无论用户采用什么样的语言应用程序都可以给用户提供支持。 QT文本引擎--主要处理非拉丁文字其中包括阿拉伯文,中文,日文,韩文,泰文,希伯来文还有印度文。 QT布局引擎--可以为从右到左的文本布局提供支持,比如阿拉伯文和希伯来文。

@奮 鬥@的专栏 1621

QT 的国际化支持操作要点.

---------------------------------------- author: hjjdebug date: Fri Aug 14 13:11:15 CST 2020 ---------------------------------------- 本篇文章帮助你理解如下几个问题: 1. 翻译过程是如何进行的? 2. 翻译的上下文是指的什么? 3. 如何使用QT_TR_NOOP, QT_TRANSLATE_NOOP 4. QObject::tr() 是如何工作的. 5. lupdate 工

hjjdebug的专栏 1749

Qt 国际化编程

Qt 目前的版本(2.2.4)对国际化的支持已经相当完善。 在文本显示上,Qt 使用了Unicode 作为内部编码,可以同时支持多种编码。 为 Qt 增加一种编码的支持也比较方便,只要 增加该编码和Unicode的转换编码便可以了。 Qt 目前支持ISO标准编码ISO 8859-1, ISO 8859-2,ISO 8859-3,ISO 8859-4,ISO 8859-5,ISO 8859-7,IS

333

暗影精灵8游戏本选购验机与性能测试全指南:从配置取舍到双烤实测

游戏本性能释放取决于功耗与散热设计,而非仅显卡型号。通过系统化验机流程,可排查屏幕坏点、SSD颗粒降级等暗病,并利用双烤测试摸清CPU与GPU的真实功耗墙与温度墙。这些方法能帮助用户确认硬件健康度、评估持续性能边界,适用于新机开箱检测与长期使用维护。围绕暗影精灵8,本文详解配置取舍逻辑、开箱检查清单及性能测试实操,助你避开选购与使用中的常见坑。

weixin_33831673的博客 360

Labview数据存储与读取——TDMS文件的创建与写入

Labview数据存储与读取——TDMS文件的创建与写入 你好,这是我在自学Labview编写软件过程中使用的一些功能。我在存储采集卡数据时,通过阅读大量他人的程序,发现TDM及TDMS文件十分适合波形数据的记录,TDMS文件比TDM文件在存储动态类型数据时读写速度更快,而且TDMS 文件没有容量限制,适合存储数据量庞大的测试数据。 前言少叙,书归正传 这一篇博客,说明一下如何使用基本的TDMS功能实现数据文件的存储。 所需要的控件如上图所示,在程序框图——编程——文件I\O——TDMS 中,写入TDMS

滑板小帅程序开发 2万+

中文实体关系抽取数据集大盘点:从百度Duie2.0到医疗CBLUE,哪个更适合你的NLP项目?

本文全面分析了中文实体关系抽取领域的主流数据集,包括百度DuIE 2.0、医疗CBLUE等,帮助开发者根据项目需求选择最适合的数据集。文章详细对比了各数据集的特点、适用场景及优化策略,为自然语言处理项目提供实用指南。

weixin_29284657的博客 121

Qt 国际化编程解决汉字显示方块、乱码问题!

时间:2009-07-01 14:44:01来源:Linux联盟作者: 首先,先要说明一点,网上许多的方案都是针对新版QT的(3.1以上),而我这篇文章旧版QT也适用,希望能够帮助在QT中文问题上还很茫然的你,雪中送炭。 Qt 自从版本(2.2.4)以来,实际上就对国际化的支持已经相当完善。 在文本显示上,Qt 使用了Unicode 作为内部编码,可以同时支持多种编...

weixin_30951231的博客 455

【SOC 芯片设计 DFT 学习专栏 -- DFT DRC规则检查】

在现代半导体设计中,DFT(Design for Test)技术的重要性不言而喻。它确保了芯片在制造完成后能够进行高效和可靠的测试。DFT设计规则检查(DRC)作为DFT流程中的一个关键环节,通过一系列自动化工具检测设计中的潜在问题,从而保证设计的可测试性和整体质量。在本文中,我们将详细探讨DFT DRC的概念、重要性、检查流程以及具体的规则和应用。Tessent是业界领先的DFT解决方案之一,其DRC工具通过一系列自动化检查,确保设计符合DFT要求。

CodingCos的博客 4167

QT的多语言国际化

QT的多语言国际化 大匡先生关注 0.1142021.04.10 13:17:18字数 629阅读 34 实现多语言的思路: 为每种语言建立一张映射字典,即能够通过指定的KEY找到对应的语言文字。 程序初使化时或者运行过程中根据需要加载某种语言的映射字典。 界面窗体初使化时或者语言发生变更时,每个界面元素根据需要从映射字典提取对应的语言文字,并展示在界面上。 QT本身自带类似的解决方案,执行以下步骤: 修改工程文件,在尾部加入: TRANSLATIONS = i18n_zh_cn.ts

qq_20312079的博客 626

Eplan P8 API二次开发--插入符号(Symbol)功能(Function)并定义属性

1、目的 使用Eplan API在页中自动插入某个符号并按约定规则自动设置好属性 2. 步骤 一、基础信息 比如要在Eplan中自动插入一个电机的符号并定制属性,我们先要确定要插入的符号名,可以在Eplan中获取如下符号(Symbol)信息 可以知道我们待插入的符号名称为M3_1, 接下来,使用Visual Studio建立类库项目,并引用Eplan Api库 二、获取符号变量(SymbolVariant) 在Eplan中,当一个符号(Symbol)被插入到页中,这个符号的引用即变为一个(Function

如是道程序人生 4524

【Windows Server 2019】存储服务器的配置和管理——iSCSI的安装和配置(下)

博文介绍了如何使用Windows 10 和 ESXi 验证iSCSI服务器部署成功以及如何管理iSCSI服务 。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 8000

Qt国际化2

本篇讨论 Qt 库对国际化的支持,将介绍 Qt 对文本显示,输入和打印的支持,和如何 使用Qt 开发国际化的软件。Qt 目前的版本(2.2.4)对国际化的支持已经相当完善。 在文本显示上,Qt 使用了Unicode 作为内部编码,可以同时支持多种编码。 为 Qt 增加一种编码的支持也比较方便,只要 增加该编码和Unicode的转换编码便可以了。 Qt 目前支持ISO标准编码ISO 8859

Claude's Vision 1358

多层环境室内定位系统综述总结

本文是一篇发表于2025年《IEEE Access》期刊的综述论文,由埃及开罗美国大学与卡塔尔卡内基梅隆大学团队合作完成,聚焦多层环境室内定位系统的核心挑战、技术方案及未来方向,填补了该领域缺乏全面综述的空白。

程序员石磊 443

Qt 国际化编程,真正解决汉字显示方块、乱码问题!

首先,先要说明一点,网上许多的方案都是针对新版QT的(3.1以上),而我

sealbird的专栏 3481

Windows版TASSEL5的下载及安装

TASSEL5是一款用于研究表型和基因型关系的软件,由美国康奈尔大学Buckler实验室所研发。,选择Windows环境安装包下载并安装。1.安装成功后TASSEL5界面。

沉香best的博客 8188

YOLO26改进策略【YOLO和Mamba】| 替换骨干 Mamba-YOLO26-L !!! 最新的发文热点

Vision Clue Merge模块在Mamba - YOLO模型中同样重要,主要负责在模型的下采样过程中处理特征图,为后续的特征融合和目标检测任务提供更有效的信息。

Limiiiing的博客 472

Qt学习之路

Qt学习之路(1):前言 131274/17 FinderCheng 2009-08-20 Qt学习之路(2):Hello, world! 129097/23 FinderCheng 2009-08-20 Qt学习之路(3):Hello, world!(续) 76679/10 FinderCheng 2009

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 5162

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: Qt学习之路(33): 国际化(上)
下一篇: Qt学习之路(35): Qt容器类之顺序存储容器
flowingFire2012
博客等级 码龄14年 6粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值