Qt 多语言界面设计概述

news2025/1/16 5:03:49

1、多语言界面设计概述

有些软件需要开发多语言界面版本,如中文版和英文版,并且在软件里可以方便地切换界面语言。Qt 为多语言界面提供了很好的支持,使用 Qt 的一些规则和工具,可以很方便地为应用程序开发提供多语言界面支持。

用 Qt 开发多语言界面应用程序,主要包括以下几个步骤:

(1)在程序设计阶段,程序代码中每一个用户可见的字符串都用 tr()函数封装,以便 Qt 提取界面字符串用于生成翻译资源文件。用UI设计器可视化设计窗体时统一用一种语言,如汉语。

(2)在项目配置文件 (.pro 文件)中设置需要导出的翻译文件 (.ts 文件)名称,使用 lupdate工具扫描项目文件中需要翻译的字符串,并生成翻译文件。

(3)使用 Qt 的 Linguist程序打开生成的翻译文件,将程序中的字符串翻译为需要的语言,如将所有中文字符串翻译为英文。

(4)使用 lrelease工具编译翻译好的翻译文件,生成更为紧凑的“.qm”文件。

(5)在应用程序中用QTranslator 调用不同的“.qm”文件,实现不同的语言界面。

2、tr()函数的使用

为了让 Qt 能自动提取程序中用户可见的字符串,对于每个字符串都需要使用 tr()函数封装。tr()是 QObject 的一个静态函数,在使用了Q_OBJECT 宏定义的类或QObiect 的子类中,都可以直接使用 tr()函数,否则需要使用 QObiect::tr()进行调用。或者在类定义中用 Q_DECLARE_TR_FUNCTIONS 宏把tr()函数添加到类中之后,再直接调用 tr()函数。

tr()函数的定义是:

QString QObject::tr(const char *sourceText, const char *disambiguation = Q_NULLPTR, int n = -1)

其中,sourceText 是源字符串,disambiguation 是为翻译者提供额外信息的字符串,用于对些容易混淆的地方作说明,内容如下:

LabCellPos = new QLabel(tr("当前单元格:"),this);
QMessageBox::information(this,tr("信息"),tr("信息提示?“),QMessageBox::Yes);
QString strl=tr("左右","大约的意思”) ;
QString str2=tr("左右”,"掌握、控制的意思") ;


使用 tr()函数,需要注意以下一些事项。

(1)尽量使用常量字符串,不要使用字符串变量。在 tr()函数中应直接传递字符串常量,而不是用变量传递字符串,如下面的代码使用了字符串变量,使用 lupdate 工具提取项目中的字符串时,将不能提取“不能删除记录”这个字符串。

char *errorStr="不能删除记录”;

QString str2=tr(errorStr);

(2)使用字符串变量时需要用 Qt_TR_NOOP()宏进行标记。若要在tr()函数中使用字符串变量,需要在定义字符串的地方用 Qt_TR_NOOP()宏进行标记,这在使用字符串数组时比较有用,例如:

const char *cities[4]={Qt_TR_NOOP("Beijing"),
Qt_TR_NOOP("Shanghai"),
Qt_TR_NOOP("Qingdao"),
Ot_TR_NOOP("Wuhan")};
for (int i=0; i<4; i++)
    comboBox->addItem(tr(cities[il));


tr()不能使用拼接的动态字符串。tr()不能使用拼接的动态字符串,例如,下面的用法是错误的:LabCellPos->setText(tr("第"+ QString::number(current.row()) +"行");正确的方式如下。

正确的方式如下:

LabCellPos->setText(tr("第 %1 行”).arg(current.row()));

翻译的字符串是"第 %1 行",然后再用 QString 的arg()去替换占位符“%1”的内容。

(3)Qt_NO_CAST_FROM_ASCII 的作用。在一个需要翻译为多语言的应用程序中,如果编写程序时忘了对某个字符串使用 tr()函数,lupdate 生成的翻译资源文件就会遗漏这个字符串为了避免这种疏忽错误,可以在项目配置文件 (.pro 文件) 中添加如下的定义:

DEFINES += Qt_NO_CAST_FROM_ASCII

这样在编译时,会禁止从const char* 到QString 的隐式转换,强制每个字符串都必须使用tr()或QLatin1String()封装,避免出现遗漏未翻译的字符串。

3、生成语言翻译文件

要生成多语言界面相关的翻译文件,除了之前所说的在对每个字符串都使用 tr()函数封装之外,还需要在项目配置文件 (.pro 文件)中使用TRANSLATIONS 定义语言翻译文件 (.ts 文件),并使用 lupdate 工具生成语言翻译文件。

在项目的配置文件中增加如下的设置语句:

TRANSLATIONS =samp_cn.ts
samp_en.ts

这里设置生成两个语言翻译文件“samp_cn.ts”和“samp_en.ts”,分别是中文和英文翻译文件。文件名称可以任意设计,只要有所区分即可。

在项目设计期间,任何时候都可以使用 lupdate 工具生成或更新翻译文件,方法是单击 QtCreator 主菜单的“Tools”→“External”→“Qt 语言家”→“Update Translations(lupdate)”菜单项若项目的源程序目录下没有 samp_cn.ts 和 samp_en.ts 这两个文件,就会自动生成,如果文件已经存在,则会更新这两个文件的内容。

4、使用 Qt Linguist 翻译 ts 文件

生成的 samp_cn.ts 和 samp_en.ts 文件内包含了项目源程序和 UI界面里的所有字符串,使用 QtLinguist 可以将这些字符串翻译为需要的语言版本。在 Qt 安装后的程序组里可以找到Qt Linguist 软件。

samp_cn.ts 是中文界面的翻译文件,由于源程序的界面就是用中文设计的,所以无需再翻译。samp_en.ts 是英文翻译文件,需要将提取的所有中文字符串翻译为英文。

在 Linguist 软件中打开文件 samp_en.ts,当第一次打开一个 ts 文件时,Linguist 会出现如下图所示的语言设置对话框,用于设置目标语言和所在国家和地区。这个对话框也可以通过Linguist主菜单的“编辑”-“翻译文件设置”菜单项调出。samp_en.ts 是用英文界面的翻译文件,所以选择语言“English”,国家/地区可选择“UnitedStates”。

打开samp_en.ts 文件后的Linguist软件界面如下图所示。左侧“上下文”列表里列出了项目中的所有窗口或类,这个项目有 4个窗口。“字符串”列表里列出了从项目的 UI语言窗口和代码文件中提取的字符串,右侧“短语和表单”会显示窗口界面的预览或字符串在源程序中出现的代码段。 

在“字符串”列表中选择一个源文后,在下方会出现译文编辑框,在此填写字符串对应的英文译文。Linguist 可以同时打开项目的多个 ts 文件,在选中一个源文后,在下方会出现对应的多个语言的译文编辑框,可以同时翻译为多个语言版本。

5、调用翻译文件改变界面语言

1)生成 qm文件

使用 Linguist 软件编辑翻译文件,将所有字符串都翻译后,在 Qt Creator 中单击主菜单项“Tools”→“External”→“Qt 语言家”→“Release Translations(lrelease)”,会在项目源程序目录下生成与ts 文件对应的 qm 文件,这是更为紧凑的翻译文件。本实例生成的是 samp_cn.qm和samp_en.qm。

2)项目启动时设置界面语言

使用QTranslator 类设置界面的不同语言版本,需在应用程序启动时设置界面语言翻译文件,即在main()函数中进行处理。main.cpp的代码如下: 

#include "mainwindow.h"
#include <QApplication>
#include <QTranslator>
#include <OSettings>
QTranslator*trans=NULL;
QString  readSetting();
int main(int argc, char *argv[])
{
    QApplication app(argc,  argv);
    trans = new QTranslator;
    QString curLang = readSetting(); //读取语言设置
    if (curLang=="EN")
    {
        trans->load("samp16_en.qm");
    }
    else
    {
        trans->load("samp_cn.qm");
    }
    app.installTranslator(trans);
    MainWindow w;
    w.show();
    return app.exec();
}
QString readsetting()
{//从注册表读取上次设置的语言
    QString organization="WWB-Qt";
    QString appName="samp";
    QSettings settings(organization,appName);
    QString   Lanquage=settings.value("Lanquaqe","EN").toString();
    return Lanquage;
}

这里定义了一个全局变量trans,在 main.cpp 里定义了一个函数readSetting(),用于从注册表里读取上次设置的界面语言版本。注册表里数据的读取和写入使用到 QSetings 类。在 main()函数中,创建QTranslator 类的对象trans 后,调用readSetting()函数从注册表里读取上次的语言版本,若为“EN”,就用 load()函数载入编译后的英文翻译文件 samp_en.qm,否则就载入中文翻译文件 samp_cn.qm。然后再执行 app.installTranslator(trans),就可以给应用程序安装翻译器,实现需要的界面版本。

samp_en.qm和samp_cn.qm 文件是被编译到项目的可执行文件中的,无需将这两个文件复制到可执行文件目录下。

在 main()函数里加载翻译器是相比之下一劳永逸的方法,这样一来,随后应用程序的任何窗口都会自动应用开始设置的语言。所以,一些大型的软件在重新设置了语言版本后,通常都会要求重新启动软件才生效。

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

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

相关文章

Shell脚本函数简介及运用(喜欢,适合,能在一起,是三码事)

一、函数的作用 语句块定义成函数约等于别名&#xff0c;定义函数&#xff0c;再引用函数 封装的可重复利用的具有特定功能的代码 二、定义函数 定义函数就是只将一段实现某个任务的命令序列封装进一个函数&#xff0c;便于使用和后期维护。 function 函数名() { 命令序列 }…

快速原型设计工具(Axure)的安装、汉化

〇、一些名词解释&#xff1a; 1. 草图 一般主要用于产品整理思路&#xff0c;寻找灵感&#xff0c;或者在产品团队内部互相讨论碰撞火花时使用。画 给自己看的&#xff0c;想怎么画就怎么画。 2. 低保真 打个比喻来说就像&#xff0c;用于“生产的图纸”&#xff0c;要简单易读…

Postgres:Win/Linux环境安装及一键部署脚本

1.Win安装Postgres &#xff08;1&#xff09;下载安装包 &#xff08;2&#xff09;开始安装 修改安装目录 选择要安装的组件 data也就是库表及数据的.dba文件存放目录 密码设置 端口设置 next next 开始安装 安装完成&#xff0c;Stack Builder 根据需要选择是否安装。仅仅是…

03-Docker容器命令

新建启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]常用的参数&#xff1a; --namenew_name&#xff1a;为容器指定一个名称-d&#xff1a;后台运行容器并返回容器ID&#xff0c;即启动守护式容器-i&#xff1a;以交互模式&#xff08;interactive&#xff09;运行…

【三十天精通Vue 3】第二十九天 Vue 3中的Mock数据模拟详解

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 引言一、Mock数据模拟的概述1.1 为什么需要Mock数据模拟?1.2 Mock数据模拟的优点和缺点二、安装和配置Mock.js库2.1 使用NPM安…

TIA博途Wincc通过区域指针中的作业信箱功能实现自动写入配方数据的具体方法

TIA博途Wincc通过区域指针中的作业信箱功能实现自动写入配方数据的具体方法 前面和大家分享了博途Wincc中配方功能的具体使用方法,具体内容可参考以下链接中的内容: TIA博途Wincc中自定义配方画面的具体方法示例 上面的例子中,向PLC写入数据时是通过点击屏幕上的按钮来实现…

scrapy爬虫标准流程

Scrapy爬虫的标准流程一般包括以下几个步骤&#xff1a; 1、明确需求和目标网站的结构&#xff0c;确定需要爬取的数据以及爬取规则。 2、创建一个Scrapy项目&#xff0c;使用命令行工具创建一个新的Scrapy项目。 3、定义数据模型和item&#xff0c;即确定要爬取的数据结构。…

基于SpringBoot开发的仓库管理系统

系统概要 仓库管理系统总共分为两个大的模块&#xff0c;分别是系统模块和业务模块。其中系统模块和业务模块底下又有其子模块。 功能模块 一、业务模块 1、客户管理 客户列表 客户分页和模糊查询 客户添加、修改、删除、批量删除 2、供应商管理 供应商列表 供应商分…

sql注入合集

1.Access注入 http://110.40.154.212:8002/Production/PRODUCT_DETAIL.asp?id1513 and exists(select count(*) from admin) #存在admin表&#xff0c;继续爆&#xff0c;还存在job,email,product等http://110.40.154.212:8002/Production/PRODUCT_DETAIL.asp?id1513 and e…

软考A计划-重点考点-专题二(程序语言)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

GP04丨网格框架初版

量化策略开发&#xff0c;高质量社群&#xff0c;交易思路分享等相关内容 正文 大家好&#xff0c;今天我们分享股票社群第4期量化策略——网格策略。 在上一期中&#xff0c;我们分享了ETF轮动策略Plus版本&#xff08;基于资金管理的ETF增强策略&#xff09;&#xff0c;本…

Linux-Day02

Linux-Day02 课程内容 软件安装 项目部署 1. 软件安装 1.1 软件安装方式 在Linux系统中&#xff0c;安装软件的方式主要有四种&#xff0c;这四种安装方式的特点如下&#xff1a; 安装方式特点二进制发布包安装软件已经针对具体平台编译打包发布&#xff0c;只要解压&am…

哪种蓝牙耳机音质最好佩戴舒服?佩戴舒适音质好的蓝牙耳机

蓝牙无线耳机基本成为了大家的标配&#xff0c;大多数 对于外观与舒适性十分看重&#xff0c;如今的蓝牙耳机市场已经很成熟了&#xff0c;基本能满足大多数人&#xff0c;下面就来分享几款佩戴并且音质表现也不错的蓝牙耳机。 一、南卡小音舱Lite2蓝牙耳机 参考价格&#xf…

【机器人仿真Webots教程】-控制器编程指南

Webots controller编程指南 文章目录 Webots controller编程指南1. controller程序设计流程1.1 controller与场景树节点1.2 进程角度分析1.3 仿真时间步长与控制器程序更新延时步长 2. 例解控制器编程2.1 Hello world 实例2.2 传感器读取实例2.3 执行器的使用2.4 传感器与执行器…

距离保护整定计算中分支系数公式理解

在一般的距离保护II段和III段的整定计算中&#xff0c;分支系数的计算是必须要的&#xff0c;本文选自电力系统继电保护&#xff08;第二版&#xff09;&#xff08;张保会老师主编&#xff09;P94-P97页的例题&#xff0c;分析其中分支系数的计算公式。 我们在前面的章节中知道…

springboot+jsp影院管理系统9ufid电影票预订管理系统

项目介绍开发语言&#xff1a;Java 框架&#xff1a;springboot 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏览器&#xff1a;谷歌浏览器 功能介绍 主要对…

HTB靶机08-Nineveh-WP

008-nineveh 靶机IP&#xff1a; 10.10.10.43 scan Nmap 扫描 ┌──(xavier㉿kali)-[~] └─$ sudo nmap -sSV -T4 10.10.10.43 -p- Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-07 17:40 CST Nmap scan report for nineveh.htb (10.10.10.43) Host is up (0.34s …

linux系统安装nginx 支持ssl

目录 1. 开放80端口和443端口 2. 安装nginx的基础环境 -> 2.1 安装gcc-c编译器 -> 2.2 安装pcre包 -> 2.3 安装zlib包(可能安装过) 3. 安装nginx -> 3.1 创建文件夹 -> 3.2 在官网下载nginx包到服务器内 -> 3.3 解压tar.gz,并进入nginx-1.19.9 -&g…

[数据库系统] 二、表的基本操作(educoder)

目录 第一关&#xff1a;修改表名 一、知识点 ①查看所有表&#xff1a;show tables; ②查看表基本结构&#xff1a;DESCRIBE 表名&#xff1b; 或 简写为 desc 表名; ③查看创建表的语句&#xff1a;SHOW CREATE TABLE 二、educoder 第二关&#xff1a; 修改表结构-1 一、…

面对AI“龙卷风”破坏力 白宫“软着陆”欧盟“硬防御”

ChatGPT的风靡与风险将OpenAI的CEO山姆奥特曼&#xff08;Sam Altman&#xff09;送进白宫&#xff0c;他被蹲守在美国总统府邸的记者们围追&#xff0c;面对5月4日白宫发起的AI风险治理会议&#xff0c;奥特曼很官方地给出“重要也很及时”的回应&#xff0c;自信的反复强调“…