我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Qt 多语言程序设计的实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Qt 多语言程序设计的实现

简介

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

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

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

   (2)  在项目配置文件 (.pro 文件)中设置需要导出的翻译文件 (.ts 文件)名称,使用lupdate工具扫描项目文件中需要翻译的字符串,并生成翻译文件 。
   (3)  使用 Qt 的 Linguist 程序打开生成的翻译文件,将程序中的字符串翻译为需要的语 言 ,如将所有中文字符串翻译为英文 。
  ( 4)  使用 lrelease 工具编译翻译好的翻译文件, 生成更为紧凑的 ". qm" 文件 。
  ( 5)  在应用程序中用 QTranslator 调用不同的 " .qm" 文件,实现不同的语 言界面。

1.tr()函数使用

        为了让 Qt 能自动提取程序中用户可见的字符串,对千每个字符串都需要使用 tr()函数封装 。tr()是 QObject 的 一个静态函数 ,在使用了 Q—OBJECT 宏定义的类或 QObject 的子类中,都可以直接使用 tr()函数,否则需要使用 QObject::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()函数,需要注意以下事项。

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

char *errorStr="不能删除记录";
QString str2=tr(errorStr); 

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

canst char *cities[4]={Qt_TR_NOOP("Beijing"),
    Qt_TR_NOOP(" Shanghai"), 
    Qt_TR_NOOP("Qingdao"), 
    Qt_TR_NOOP("Wuhan")}; 
 
for (int i=O; i<4; i++) 
{
    comboBox->additem(tr(cities[i])) ;
}

        ③tr()不能使用拼接的动态字符串。 tr()不能使用拼接的动态字符串,例如,下面的用法是错误的:

LabCellPos->setText(tr("第") + QString::number(current.row())+ tr("行");

正确的方式如下:

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

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

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

DEFINES+= Qt_NO_CAST_FROM_ ASCII

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

2.生成语言翻译文件

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

        在项目的配置文件(*.pro)中增加如下的设置语句:

         TRANSLATIONS += lang_Chs.ts     \

                                           lang_Eng.ts

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

3.使用 Qt Linguist 翻译 ts 文件

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

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

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

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

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

 4.调用翻译文件改变界面语言

4.1. 生成 qm 文件

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

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

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

#include "mainwindow.h"
#include <QApplication> 
#include <QTranslator> 
#include <QSettings> 
 
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 ("lang_Eng.qm"); 
     }
    else 
    {
        trans->load("lang_Chs.qm"); 
    }
 
    app.installTranslator(trans); 
 
    MainWindow w; 
    w.show(); 
    return app.exec(); 
}
 
QString readSetting() 
{
    //注册表读取上 次设置的语言
    QString organization = "Language"; 
    QString appName= "test"; 
    QSettings settings(organization, appName) ; 
    QStri n g Language=settings.value ("Language"," EN").toString(); 
    return Language ; 
}

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

 3. 动态切换语言

        在软件运行时可以动态切换语 ,即 启软件就可以切换界面语言,测试程序的主窗 口上有“中文”和 “English" 两个工具栏按钮,用千实现中文和英文界面的切换。 下面是这两个 按钮的响应代码: 

void MainWindow::on_actLang_CN_triggered() 
{//中文界面
 
    qApp->removeTranslator(trans); 
    
    if (trans)
    {
        delete trans;
        trans = NULL;
    } 
 
    trans = new Qtranslator; 
    trans->load("lang_Chs.qm"); 
    qApp->installTranslator(trans); 
 
    //这一步很关键
    ui->retranslateUi(this);  //刷新界面字符串
 
    QSettings settings("WWB-Qt", "test"); 
    settings.setValue ("Language ", "CN") ; 
}
 
void Maindow::on_actLang_EN_triggered()
{//英文界面
    qApp->removeTranslator(trans) ; 
    if (trans)
    {
        delete trans;
        trans = NULL;
    } 
 
    trans=new Qtranslator; 
    trans->load( " sampl6_l_en.qm"); 
    qApp->installTranslator(trans) ; 
    
    //这一步很关键
    ui->retranslateUi(this) ; //刷新界面字符串
    QSettings settings( "WWB-Qt","test"); 
    settings.setValue ("Language", "EN");
}

        一个应用程序只能加载一个翻译器 ,因为在 main()函数里已 经加载了一个翻译器 ,所以需 要先移除当前的翻译器,才能重新创建新的翻译器,加载翻译文件,并为应用程序重新加载新翻译器。

        完成这些后还必须调用 UI的retranslateUi() 函数来刷新界面。

        retranslateUi()函数是在窗口的 ui _" 头文件中自动生成的 ,如 mainwindow. ui 主窗口对应的 头文件 ui _mainwindow.h 里就有函数 retranslateUi(),这个函数使用 QApplication::translate() 函数将 所有界面字符串进行翻译 ,类似于 tr()函数的功能。

        窗口在被创建时会自动调用此 retranslateUi() 函数,在程序运行中动态切换界面语言时,必须 手工调用此 retranslateUi() 函数,才可以立即更新界面语言。

        若不是用 Designer 设计的窗口,而是完全由代码实现的窗口界面,需要专门设计一个 retranslateUi() 函数,将所有界面字符串用 tr() 函数进行翻译,并在动态切换语言时调用此函数。  很显然 这样做比较麻烦,特别是当软件比较大窗口非常多时。所以,大型的软件在重新设置语言版本后 一般要求重新启动软件才生效 ,在程序启动时根据上次的设置加载一次翻译器即可。

        按钮响应代码的最后是将设置的语言版本写入本地配置文件 ,以便下次程序启动时自动加载相应的语言。

到此这篇关于Qt 多语言程序设计的实现的文章就介绍到这了,更多相关Qt 多语言程序设计内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Qt 多语言程序设计的实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

oracle是程序设计语言吗

否,oracle 不是程序设计语言。它是数据库管理系统,用于创建和管理数据库,但它提供了一种特定于数据库操作的专门编程语言 pl/sql。Oracle 是程序设计语言吗?否。Oracle 是一种数据库管理系统(DBMS),用于创建和管理
oracle是程序设计语言吗
2024-04-19

C语言利用goto语句设计实现一个关机程序

今天给大家分享一个非常有趣的知识——用goto语句编写一个关机小程序。主要用到了shutdown命令语句、goto语句、strcmp函数等知识点,感兴趣的可以了解一下
2023-01-28

软件设计师多种程序语言特点考点

  软件设计师多种程序语言特点考点有哪些?为了方便考生及时有效的备考,编程学习网小编为大家精心整理了软考中级软件设计师多种程序语言特点考试知识点,供大家参考和学习。如想获取更多计算机软件水平考试的模拟题及备考资料,请关注编程学习网网站的更新。  【考法分析】  1、本知识点的主要考查形式有:给出特定描述指出其对应的程序语言;或
软件设计师多种程序语言特点考点
2024-04-18

c语言与c语言程序设计一样吗

否。c语言是开发软件的编程语言,而c语言程序设计是使用c语言创建程序的过程,包括编写代码、编译和运行。C语言与C语言程序设计是否相同?答案:否详细说明:C语言和C语言程序设计虽然名称相似,但它们是两个不同的概念:C语言:一种计算机编
c语言与c语言程序设计一样吗
2024-04-13

Python语言程序设计之二--用tur

这篇笔记依然是在做《Python语言程序设计》第5章循环的习题。其中有两类问题需要记录下来。第一是如何画围棋棋盘。围棋棋盘共有19纵19横。其中,位于(0,0)的星位叫天元,其余8个星位坐标分别是:(-6,6),(0,6),(6,6),(-
2023-01-30

c语言程序设计怎么换行

在 c 语言程序设计中,可以使用以下方法换行:转义字符 '\n'puts() 函数fputs() 函数fputc() 函数(逐个字符打印,使用字符 '\n' 打印换行符)如何使用 C 语言程序设计换行在 C 语言程序设计中,可以通过以下方
c语言程序设计怎么换行
2024-04-05

Python语言程序设计之一--for循

最近学到了Pyhton中循环这一章。之前也断断续续学过,但都只是到了函数这一章就停下来了,写过的代码虽然保存了下来,但是当时的思路和总结都没有记录下来,很可惜。这次我开通了博客,就是要把这些珍贵的学习思考总结记录下来。从现在开始。关于这一章
2023-01-30

C语言如何设计并行程序

设计并行程序的关键在于充分利用计算机处理器的多核心和多线程能力,以提高程序的性能和效率。以下是设计并行程序的一般步骤:分析程序的计算密集型部分:首先确定程序中哪些部分是计算密集型的,即需要较长时间才能完成的计算任务。这些部分是并行化的潜在
2023-10-27

PHP 设计模式的跨语言实现

什么是设计模式:提供解决常见编程问题的可重用代码解决方案,提升代码可读性、可维护性和可重用性。php 设计模式:提供内置模式,如单例模式、工厂模式、观察者模式。跨语言实现:设计模式不受语言限制,可通过识别其本质并转化为对应语言语法来实现。实
PHP 设计模式的跨语言实现
2024-05-07

2021年软件设计师考点:多种程序语言特点

  2021年软件设计师考试包含哪些知识点?今天编程学习网小编为大家整理了2021年软件设计师考点:多种程序语言特点,希望对在备考软件设计师的考生会有帮助。  【考法分析】  本知识点的主要考查形式有:给出特定描述指出其对应的程序语言;或给出程序语言指出其对应描述的正误。  【要点分析】  常见的程序设计语言:  (1)F
2021年软件设计师考点:多种程序语言特点
2024-04-18

java语言是一种面向对象的程序设计语言吗

java语言是一种面向对象的程序设计语言吗java语言是面向对象的程序设计语言。(相关视频教程分享:java视频教程)支持部分或绝大部分面向对象特性(类和实例、封装性、继承、多态)的语言即可称为基于对象的或面向对象的语言。Java跟C#是目前最流行的两门面向对
java语言是一种面向对象的程序设计语言吗
2021-09-12

c语言程序设计和编程一样吗

不,c语言程序设计是编程的一部分,但两者并不相同:c语言程序设计关注c语言特性,如语法和数据类型。编程涵盖所有编程语言,涉及算法设计和软件工程。c语言程序设计用于编写特定应用程序,而编程用于解决广泛的问题。C语言程序设计和编程是一样的吗?
c语言程序设计和编程一样吗
2024-04-13

c语言程序设计和c++一样吗

c++kquote>c 语言程序设计与 c++ 并不相同。它们在以下方面存在差异:语法差异:c++ 引入名称空间、对象、流操作符和模板。功能差异:c++ 提供异常处理、stl、高级内存管理和多重继承。概念差异:c++ 是面向对象的,强调数据
c语言程序设计和c++一样吗
2024-04-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录