QT 语言国际化
国际化、帮助系统和Qt插件
(3)使用Qt Assistant为程序定制帮助文档浏览器。
① 制作HTML格式的帮助文件。
帮助文档中的每一个页面用一个HTML文件来阐述,图片放在image文件 夹下。
② 编写qhp(Qt Help Project)文件。
qhp文件是XML格式的,负责描述用到的HTML帮助文件间的组织结构。
类的tr()函数,如QObject::tr()或qApp->translate()。 若要翻译的文本在不同的函数中重复出现,可以使用两个宏来标
记要翻译的内容:
QT_TR_NOOP(sourceText),sourceText是要翻译的内容 QT_TRANSLATE_NOOP(context, sourceText),context是声明处的类名
(2)QWhatsThis类:提供一个关于部件的一个简单描述, 通常比工具提示更详细。
①设计界面->右键->改变“这是什么”。 ②调用setWhatsThis(string)函数为部件设置一个这是什么信息。 运行时按“Shift+F1”显示信息。也可在工具栏中添加“这是什么”
动作按钮。 QAction *action = QWhatsThis::createAction(this); ui->mainToolBar->addAction(action);
完善.ts文件,在.ts文件中给出要“翻译内容”与“翻译结果”
之间的对应关系。此时ts文件中添加了翻译结果
第三步:使用lrelease工具从.ts获取.qm文件。
.qm文件是一个二进制文件。 .ts文件供翻译人员使用,而程序运行时只需要使用.qm文件。
编写需国际化源码的方法
(1)用户可见的文本,使用QString类型。
QT5实现语言国际化(中英文界面动态切换超详细)
QT5实现语言国际化(中英文界面动态切换超详细)QT是一款用于构建跨平台应用程序的开发框架,它支持多种编程语言,包括C++。
在QT中实现语言国际化,可以让我们的应用程序在不同语言环境下展示不同的界面文本和信息,以达到更好的用户体验。
本文将详细介绍如何在QT5中实现语言国际化,并提供一个示例。
首先,为了实现语言国际化,我们需要准备好多个翻译文件,每个文件对应一种语言。
这些文件使用Qt Linguist工具生成,可以通过以下命令创建一个翻译文件:```lupdate [项目文件] -ts [输出文件]```其中,[项目文件]是你的QT项目文件,[输出文件]是生成的翻译文件。
接下来,在QT项目中引入翻译文件。
我们可以通过以下代码将翻译文件加载到应用程序中:```cppQTranslator translator;translator.load("翻译文件路径");app.installTranslator(&translator);```在这段代码中,我们首先创建了一个QTranslator对象,然后使用load(函数加载翻译文件,最后通过installTranslator(函数将翻译文件安装到应用程序中。
假设我们的QT项目是一个简单的窗口应用程序,界面上有一个按钮,点击按钮可以切换语言。
首先,我们需要在界面上添加一个按钮,并为其添加槽函数。
槽函数的实现如下:```cppvoid MainWindow::changeLanguageQFileDialog dialog(this);dialog.setNameFilter("Translation files (*.qm)");dialog.setFileMode(QFileDialog::ExistingFile);if (dialog.exec()QString fileName = dialog.selectedFiles(.first(;QTranslator *translator = new QTranslator(this);if (translator->load(fileName))qApp->installTranslator(translator);}}```在这个槽函数中,我们首先创建了一个QFileDialog对象,用于选择翻译文件。
Qt5多国语言国际化
Prt Four
Qt5多国语言支持的实践案例
案例一:实现英文和中文的多国语言切换
需求分析:需要实现英文和中文的多国语言切换以满足不同用户的语言需求。
技术实现:使用Qt5的多国语言支持功能通过设置语言环境实现英文和中文的切换。
实践步骤:首先在项目中添加英文和中文的语言文件然后在代码中设置语言环境最后测试多国语言切换功能。
多国语言支持是指软件或应用程序能够支持多种语言以便不同语言的用户可以使用和理解。
Qt5的多国语言支持包括对多种语言的支持如英语、法语、德语、西班牙语等。
多国语言支持可以提高软件的可用性和可访问性使不同语言的用户可以更容易地使用和理解软件。
在Qt5中多国语言支持是通过翻译文件实现的这些文件包含了应用程序中各个元素的翻译。
语言文件格式:Qt5支持多种语言文件格式如.qm、.ts等
添加标题
加载方式:通过QTrnslr类加载语言文件如QTrnslr::lod("lnguge_file.qm")
添加标题
语言切换:通过Qppliction::instllTrnslr()函数安装语言文件实现语言切换
添加标题
国际化支持:Qt5提供了国际化支持如QObject::tr()函数可以方便地实现多语言支持
Qt5多国语言支持的特点
灵活性:支持多种编码格式适应不同国家和地区的字符集
扩展性:支持插件扩展方便开发者添加新的语言支持
国际化:支持多种语言满足不同国家和地区的需求
易用性:提供便捷的翻译工具方便开发者进行本地化
Qt5多国语言支持的必要性
国际化需求:满足不同国家和地区的用户需求
提高用户体验:提供本地化语言提高用户满意度和忠诚度
QT下实现多国语言
QT多国语言操作系统:Windows XP开发环境:Qt CreatorQt版本:对在tr(“”)位置里的字符串进行翻译qm文件的生成步骤:.cpp->.ts->.qm具体如何生成qm文件呢?1)首选打开工程文件*.pro,在最后一行添加如下内容:TRANSLATIONS += lang_CN.ts\lang_EN.ts有两个ts文件表示支持两种语言,如此类推可以再添加ts文件2)在命令行(DOS下)下进入到工程文件所在目录,运行”lupdata *.pro”。
此时查看工程目录,会发再生成了lang_CN.ts,lang_EN.ts进入命令行的方法如下图:进入工程目录后,输入命令:lupdata *.pro3)在命令行下继续输入命令:linguist *.ts会启动Linguist的图形界面(如下图所示),在该界面中把所有要翻译的tr()标记的字符串全部列出来,然后逐条添加与之对应的你想要国家语言的字符串,最后保存。
4)在命令行下继续输入命令:lrelease *.ts相应的*.qm文件就会出现在工程目录中。
5) 在main.c中添加翻译器#include<QtGui/QApplication>#include"m_serial.h"#include <QTranslator>int main(int argc,char*argv[]){QApplication a(argc,argv);QTranslator translator;translator.load("lang_EN.qm");a.installTranslator(&translator);m_serial w;w.show();return a.exec();}6)重新构建工程,并运行,就看到了你想要国家语言的界面。
Qt5多国语言国际化
14.2.1 简单测试
(9)运行程序,效果如图14.7所示。
2021/10/10 12
14.2.2 选择语言翻译文字
【例】(简单)(CH1402)用一个下拉菜单来选择语言,并且下面有一个需
要翻译文字的标签。
实现步骤如下。
(1)在头文件“LangSwitch.h”中定义类LangSwitch,创建用户界面。
QString m = tr("Mission status: " )+ x + tr("of ") + y +tr("are completed"); (4)利用QTranslator::load()和QCoreApplication::installTranslator()读取对应 的翻译之后的资源文件。翻译工作者将提供包含有翻译之后的字符串的资源文件 “*.qm”,程序员还需要做的是定义QTranslator对象,并使用load()函数读取相应 的“.qm”文件,利用QCoreApplication::installTranslator()函数安装QTranslator对 象。
2021/10/10 2
14.1.1 国际化支持的实现
(3)使用QString::arg()组织动态文本。有些时候,一段文本需要由一些静态 文本和动态变量组合起来,如常见的情况“printf("The value of i is: %d", i)”。对 于这种动态文本的翻译,由于语言习惯的问题,如果简单地采用这种连接字符串的 方法,则可能会带来一些问题,如下面的字符串用于表示任务的完成情况:
(2)使用tr()函数获取所有需要翻译的文本。在Qt的翻译机制下,QObject::tr() 函数可以帮程序员取得翻译之后的文本。对于从QObject继承而来的类, QObject::tr()函数最终由QMetaObject::tr()实现。在某些时候,如果无法使用 QObject::tr()函数,则还可以直接调用QCoreApplication::translate()取得翻译之后 的字符串。
Qt多国语言的实现与切换(国际化)
Qt多国语⾔的实现与切换(国际化)1、创建语⾔⽂件 打开.pro⽂件,加⼊以下:TRANSLATIONS+=cn.ts ⼯具->外部->Qt语⾔家->更新翻译,将⽣成翻译⽂件cn.ts2、编辑翻译⽂件 启动Linguist(Qt语⾔家),打开cn.ts,然后进⾏编辑,主要是将源⽂对应的译⽂填写上,最后保存3、部署翻译⽂件 ⼯具->外部->Qt语⾔家->部署翻译,将⽣成语⾔⽂件qm4、加载翻译⽂件QTranslator translator;bool b = false;b = translator.load("cn.qm");a.installTranslator(&translator);注:随时可以重复“2”~“3”步骤以便更新翻译5、切换不同多国语⾔void MainWindow::Refresh(){ui->listWidget->addItem(tr("item1"));ui->listWidget->addItem(tr("item2"));ui->listWidget->addItem(tr("item3"));}void MainWindow::on_pushButton_clicked(){QTranslator translator;bool b = false;b = translator.load("cn.qm");qApp->installTranslator(&translator);this->Refresh();}void MainWindow::on_pushButton_2_clicked(){QTranslator translator;bool b = false;b = translator.load("cn2.qm");qApp->installTranslator(&translator);this->Refresh();}经此⼀⽤,中⽂到控件上乱码的问题也顺带完美解决了,享受了⼀次轻松多国语实现的过程。
QT 语言国际化
动态切换语言(带源码)参照LeadDockProjectMgr类在编写国际化程序的时候,在很多情况下都是在系统启动的过程中选择语言,然后加载对应的地方语言翻译文件,实现语言的本地化。
但是也会有用户需要进行动态的语言切换(Dynamic Language Switching),也就是在程序主>体都运行起来后,需要改变语言的选项。
而用户不希望因为语言切换而引起程序的重启或者窗口的关闭。
Qt的国际化设计提供了这种可能。
要实现这种动态切换,只需要在程序里使用一点小小的技巧,就是把调用了Qt翻译语句tr的代码集中在某个和窗体变化无关的函数里,比如retranslateStrings()这样的函数里。
在改变语言的时候,调用这个函数就可以了。
下面是附带的一个演示程序,仅为证明功能使用。
没有过多考虑代码的严密性。
//dialog.cpp#include#include "dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent){label=new QLabel(this);okButton=new QPushButton(this);connect(okButton,SIGNAL(clicked()),this,SLOT(switchlang()));flag=0;retranslateStrings();QVBoxLayout *mainLayout = new QVBoxLayout;mainLayout->addWidget(label);mainLayout->addWidget(okButton);setLayout(mainLayout);}void Dialog::retranslateStrings(){label->setText(tr("Name:"));okButton->setText(tr("Switch Language"));setWindowTitle(tr("Switch Language ..."));}void Dialog::switchlang(){QTranslator translator;if(0==flag){translator.load("switchlang_zh");flag=1;}else{flag=0;}qApp->installTranslator(&translator);//QApplication:: installTranslator(&translator); 这句话不可以retranslateStrings(); //去掉则不能实现双语言}//dialog.h#ifndef DIALOG_H#define DIALOG_H#include <QDialog>class QLabel;class QPushButton;//! [0]class Dialog : public QDialog {Q_OBJECTpublic:Dialog(QWidget *parent = 0); private:QLabel *label;QPushButton *okButton;int flag;private slots:void retranslateStrings();void switchlang();};//! [0]#endif//main.cpp#include <QApplication>#include "dialog.h"int main(int argc, char *argv[]) {QApplication app(argc, argv);Dialog dialog;dialog.show();return app.exec();}//switchlang.proTEMPLATE = appTARGET =DEPENDPATH += .INCLUDEPATH += .# InputHEADERS += dialog.hSOURCES += dialog.cpp main.cppTRANSLATIONS+=switchlang_zh.ts多文件?动态实现语言切换比较麻烦,因为要把每个文件的tr()放入一个函数内。
前端开发实训案例实现多语言网页的国际化
前端开发实训案例实现多语言网页的国际化在当今全球化的时代背景下,越来越多的网站和应用程序被设计成可以支持多种语言,以迎合不同国家和地区的用户需求。
在前端开发领域,实现多语言网页的国际化是一项重要而有挑战性的任务。
本文将介绍一种实训案例,旨在展示如何通过前端开发技术来实现多语言网页的国际化。
一、案例概述本案例的目标是利用前端开发技术实现一个多语言网页,并通过用户选择的语言展示文字内容的国际化效果。
案例中包括以下几个关键环节:1. 准备多语言文本资源:为了实现国际化,我们需要准备多个语言版本的文本资源。
这些资源可以是一些包含键值对的JSON文件,例如:```json{"welcome": {"en": "Welcome","zh": "欢迎","es": "Bienvenido"},"greeting": {"en": "Hello","zh": "你好","es": "Hola"}}```其中,"en"代表英文,"zh"代表中文,"es"代表西班牙文。
2. 建立多语言选择界面:在网页中,我们需要提供一个多语言选择界面,让用户可以选择他们偏好的语言。
可以使用下拉菜单或其他形式来展示语言选项。
3. 实现语言切换功能:当用户选择了一种语言后,我们需要将网页上的文字内容根据用户选择的语言进行切换。
通过前端开发技术,我们可以动态替换网页中的文本内容。
二、实现步骤下面将逐步介绍实现多语言网页的国际化的具体步骤。
1. 准备多语言文本资源:按照上述的JSON格式,准备好多种语言的文本资源文件,并保存为独立的JSON文件。
前端开发中的国际化和本地化问题及解决方案
前端开发中的国际化和本地化问题及解决方案在全球化背景下,随着互联网的迅速发展,网站和应用程序在各个国家和地区的使用需求也越来越多样化。
在前端开发中,国际化和本地化成为了一个重要的问题。
本文将探讨前端开发中的国际化和本地化问题,并提供一些解决方案。
一、国际化问题国际化(Internationalization),简称i18n,指的是将产品(如网站、应用程序等)设计成适应不同语言、文化和地区的需求,使其能在全球范围内进行使用。
在前端开发中,国际化问题主要涉及以下两个方面。
1.1 多语言支持前端开发中最常见的国际化问题就是多语言支持。
不同地区使用不同的语言,因此在设计网站或应用程序时,需要考虑如何提供多语言的支持。
这需要前端开发者将固定的文本字符串从源代码中抽离出来,并根据用户的语言选择加载相应的文本。
在解决多语言支持问题时,可以使用以下几种方法:1.1.1 使用国际化库国际化库(Localization library)是一种用于处理多语言支持的工具。
在前端开发中,常见的国际化库有React-Intl、Vue-i18n等。
这些库提供了简洁易用的API,可以方便地实现多语言切换功能。
1.1.2 使用语言文件另一种常见的解决方案是使用语言文件(Language file)。
开发者可以将各个语言的翻译文本存储在不同的语言文件中,然后根据用户的语言选择加载相应的语言文件。
这种方式需要事先准备好各个语言的翻译文本,但可以更灵活地处理各个语言之间的差异。
1.2 日期和时间格式除了多语言支持外,另一个国际化问题是日期和时间格式。
不同地区有不同的日期和时间格式,因此在前端开发中,需要考虑如何正确地显示和解析日期和时间。
对于日期和时间格式的处理,可以采取以下几种方法:1.2.1 使用国际化库国际化库中通常会提供日期和时间格式化函数,用于将日期和时间对象转换为特定格式的字符串。
开发者可以使用这些函数来正确地显示和解析日期和时间。
QT中文显示
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,ISO 8859-9,和ISO 8859-15(对于阿拉伯语和希伯来语的支持正在开发之中),中文GBK/Big5,日文eucJP/JIS/ShiftJIS,韩文eucKR,俄文KOI8-R。
当然也可以直接使用UTF8编码。
Qt 使用了自己定义的Locale机制,在编码支持和信息文件(Message File)的翻译上弥补了目前Unix 上所普遍采用Locale和gettext的不足之处。
Qt 的这种机制可以使Qt 的同一组件(QWidget)上同时显示不同编码的文本。
比如,Qt 的标签上可以同时使用中文简体和中文繁体文本。
在文本输入上,Qt 采用了XIM(X Input Method)标准协议,可以直接使用XIM输入服务器。
由于目前的绝大多数输入服务器都是针对单一语言的,所以在Qt 的标准输入组件( QLineEdit,QMultiLineEdit)中的输入受到单一编码的限制,Qt 还不支持动态切换编码输入的支持,这是它的不足之处。
Qt 的文本显示使用Qt 编写国际化的程序,最好不要在程序中直接使用特殊编码的文本。
比如要编写一中文界面的Qt 程序,应该在程序中使用英文,程序编写完成后,把文本提取出来翻译。
这样,程序还可以根据Locale的不同,支持多种语言。
下面介绍如何在Qt 程序中标注字符串,如何提取并翻译文本。
像普通的国际化过程一样,Qt 使用了类似GNU gettext一样的函数QObject::tr(),它用于从Qt的信息文件.qm 中取出信息,这些信息是经过Qt 的工具处理的。
Qt 5开发及实例 第15章 Qt 5多国语言国际化
第15章 Qt 5多国语言国际化
——【实例】语言国简单)(CH1501)多国语言国际化。 操作步骤如下。 (1)新建一个GUI工程“TestHello.pro”,在UI界面上添加两个按钮,并分别将文本修改为hello、 china,如图15.1所示。
(2)修改“TestHello.pro”文件,添加如下代码:
时用到的“.pro”文件,只需定义好变量TRANSLATIONS即可。
(2)利用linguist工具来协助完成翻译工作,即打开前面用lupdate生成的“.ts”文件,对其中的字符串 逐条进行翻译并保存。由于“.ts”文件采用了XML格式,所以也可以使用其他编辑器来打开“.ts”文件并翻 译。 (3)利用lrelease工具处理翻译好的“.ts”文件,生成格式更为紧凑的“.qm”文件。这便是翻译工作 者最终需要提供的资源文件,它所占的空间比“.ts”文件小,但基本不具有可读性,只有QTranslator能够正 确地识别它。
第15章 Qt 5多国语言国际化
——基本概念
01
国际化支持的实现
国际化支持的实现
(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对象。
前端开发技术中的国际化与多语言支持的实现方法与工具推荐
前端开发技术中的国际化与多语言支持的实现方法与工具推荐在前端开发中,国际化和多语言支持是非常重要的功能,它可以帮助应用程序在不同地区和语言环境中更好地适应用户的需求。
下面是一些实现国际化和多语言支持的方法和工具的推荐。
方法一:手动管理手动管理是一种常见的实现多语言支持的方法。
它基本上是在代码中直接使用包含翻译文本的对象或变量,在需要显示翻译文本的地方进行手动替换。
这种方法的优点是灵活性高,可以直接控制翻译文本的显示方式。
但是,这种方法在大型项目中往往会变得冗长和复杂,需要不断地手动维护翻译文本。
方法二:使用国际化库使用国际化库是一种更高效的实现多语言支持的方法。
这些库提供了一些特定的函数和工具,用于管理和处理多语言文本。
一些常用的国际化库包括:1. react-intl:用于React应用程序的国际化解决方案,提供了强大的国际化功能和简单易用的API。
2. i18next:一个功能强大的国际化库,支持多种前端框架,包括React、Angular和Vue。
3. vue-i18n:用于Vue.js的国际化库,提供了易于使用的API和强大的功能。
这些库通常提供了一些便捷的功能,比如自动检测用户的语言环境、动态加载不同语言的翻译文本等。
方法三:使用翻译平台使用翻译平台是一种更灵活和可扩展的多语言支持方法。
翻译平台是一种在线工具,可以帮助开发团队管理和翻译多语言文本。
开发团队只需要将文本上传到翻译平台,然后翻译人员可以在平台上进行翻译,最后将翻译好的文本导出到前端代码中使用。
一些常用的翻译平台包括:1. Transifex:一个功能强大的翻译管理平台,支持多种前端开发框架和文件格式。
2. Crowdin:一个易于使用和扩展的翻译平台,支持多种文件格式和版本控制系统。
这些翻译平台通常提供了一些便捷的功能,比如自动导入和导出翻译文本、翻译人员协作等。
不论选择哪种方法和工具来实现国际化和多语言支持,以下是一些推荐的最佳实践:2.提供默认值:当找不到或加载失败翻译文本时,始终提供一个默认值以确保用户能够看到正确的信息。
qt 面试题
qt 面试题QT面试题在软件开发领域,QT是一种功能强大且广泛应用的跨平台开发框架。
它提供了各种工具和函数库,用于开发GUI应用程序、移动应用程序和嵌入式系统等。
作为一名程序员,在面试过程中可能会遇到关于QT的相关问题。
本文将为您介绍一些常见的QT面试题及其答案,帮助您在面试中更好地准备和应对。
1. QT是什么?QT是一款由挪威Trolltech公司开发的C++应用程序开发框架。
它提供了一套全面的工具和类库,用于开发跨平台的软件应用程序。
2. 请介绍一下QT的特点。
- 跨平台性:QT可以在多个操作系统平台上运行,包括Windows、macOS、Linux等。
- 高效性:QT的代码经过优化,能够高效地利用计算机硬件资源,提供卓越的性能。
- 简单易用:QT提供了直观的API和丰富的文档,使开发者能够快速上手。
- 可扩展性:QT允许开发者通过集成各种插件和拓展库,实现更多的功能和特性。
- 强大的GUI开发工具:QT提供了一套完整的GUI开发工具,开发者可以通过可视化界面设计、拖拽和设置属性等方式,快速构建用户界面。
3. QT框架的基本组成部分有哪些?QT框架由以下几个基本组成部分构成:- QT核心模块(QtCore):提供了基本的非GUI功能和类,例如字符串操作、文件IO、信号槽机制等。
- QT GUI模块(QtGui):包含了各种图形相关的类和函数,用于创建和管理用户界面。
- QT网络模块(QtNetwork):提供了网络编程所需的类和函数,用于实现网络通信。
- QT多媒体模块(QtMultimedia):用于处理音频和视频等多媒体数据。
- QT数据库模块(QtSql):用于数据库操作,支持多种数据库后端(如MySQL、SQLite等)。
- 其他模块:QT还提供了一些补充功能的模块,如XML处理(QtXml)、Web服务(QtWebServices)等。
4. 什么是信号槽(Signal-Slot)机制?信号槽是QT框架中一种用于对象间通信的机制。
配置CLion管理Qt项目国际化支持
配置CLion管理Qt项目国际化支持随着Qt 6的发布,cmake也正式宣告接管qmake的工作了。
在之前的一篇博客里我介绍了如何使用cmake管理你的qt项目,不过有一点我没有讲,那就是对国际化(i18n)的处理。
今天我们就来介绍下如何使用cmake+clion配置管理一个包含了国际化支持的项目。
准备工作你需要准备下面的工具1.Qt 5.13+(我使用的是Qt 5.15.2)2.CLion 2020.3+3.GCC 9.0+ (最好支持c++17,最低要求是支持c++11)其中GCC一般自己安装的Qt会有附带,否则在Windows上使用vs2019的编译器也是可以的。
在Linux上如果不想自己下载安装Qt的话也可以使用系统仓库打包好的:# ubuntusudo apt-get install build-essential libglu1-mesa-dev libpulse-dev libglib2.0-devsudo apt-get --no-install-recommends install libqt*5-dev qt*5-dev qml-module-qtquick-* qt*5-doc-html# Arch/Manjatosudo pacman -S base-develsudo pacman -S --needed qt5选择CLion的2020.3及以上版本是因为它提供了自带的Qt项目模板,省去了我们自己搭框架的麻烦。
当然如果你还在使用旧版CLion的话可以参考这篇文章配置Qt项目。
Qt 6在cmake的配置上是类似的,只需要修改几个函数的名称即可,后面会提及。
创建项目前置工作完成之后就可以创建项目了,如下图所示:默认是c++14标准,我个人更喜欢用c++17,不过今天的例子使用c++14也是可以的。
创建完成后你会得到如下的CMakeLists.txt文件:cmake_minimum_required(VERSION 3.17)project(untitled1)set(CMAKE_CXX_STANDARD 17)set(CMAKE_AUTOMOC ON)set(CMAKE_AUTORCC ON)set(CMAKE_AUTOUIC ON)set(QT_VERSION 5)# 设置需要用到的Qt modulesset(REQUIRED_LIBS Core Gui Widgets)set(REQUIRED_LIBS_QUALIFIED Qt5::Core Qt5::Gui Qt5::Widgets)add_executable(${PROJECT_NAME} main.cpp)# 提示你应该指定qt的cmake模块的路径,使用系统默认配置时无需关心# 嫌这个警告啰嗦的话完全可以注释掉或者删除if (NOT CMAKE_PREFIX_PATH)message(WARNING "CMAKE_PREFIX_PATH is not defined, you may need to set it ""(-DCMAKE_PREFIX_PATH=\"path/to/Qt/lib/cmake\" or -DCMAKE_PREFIX_PATH=/usr/include/{host}/qt{version}/ on Ubuntu)")endif ()# 引入并链接用到的Qt modulesfind_package(Qt${QT_VERSION} COMPONENTS ${REQUIRED_LIBS} REQUIRED)target_link_libraries(${PROJECT_NAME} ${REQUIRED_LIBS_QUALIFIED})CLion就是靠cmake来组织项目的,对于cmake的配置自然是必不可少的。
Qt中tr()的作用
Qt中tr()的作⽤
函数 tr()全名是QObject::tr(),被它处理的字符串可以使⽤⼯具提取出来翻译成其他语⾔, 也就是做国际化使⽤。
只要记住,Qt 的最佳实践:如果你想让你的程序国际化的话,那么,所有⽤户可见的字符串都要使⽤ QObject::tr()!
但是,为什么我们没有写 QObject::tr(),⽽仅仅是 tr()呢?原来,tr()函数是定义在 Object⾥⾯的,所有使⽤了 Q_OBJECT 宏的类都⾃动具有 tr()函数。
在书中看到的⼀句话,如果想要你做的程序国际化,就把所有⽤户可见的字符串写到tr()中去,可直接⽤⼯具翻译成多语⾔的版本.
为什么有些字符串前⾯会有&号呢?⽐如像下⾯这样:
openAction = new QAction(tr("&Open"), this);
为什么会出现呢?因为这是⼀个定义action的初始化字符串,“&”主要⽤于快捷键,就好⽐按下alt的时候我们使⽤的桌⾯程序也会有快捷键⼀样。
⽽且这个快捷键与字符串的⾸字母有关,⾸字母是什么快捷键就是 alt+什么。
c++国际化实现方式
c++国际化实现方式
C++ 的国际化实现主要依赖于标准库中的<locale>和<codecvt>,以及第三方库如POCO 或Qt。
以下是几种主要的方式:
1.使用C 库函数:
C++ 可以通过调用C 库函数实现本地化。
例如,使用setlocale函数设置程序的地区设置,使用printf和scanf等函数以特定地区设置的方式显示或读取数据。
2.使用<codecvt>库:
<codecvt>库提供了一种方式将宽字符和多字节字符相互转换,这对于处理Unicode 和其他非ASCII 字符集非常有用。
3.使用POCO 库:
POCO(Portable Components)是一个用于构建网络和基于互联网的应用程序的C++ 类库。
它包含用于国际化和本地化的工具。
4.使用Qt 库:
Qt 是一个跨平台的C++ 应用程序框架,它也提供了强大的国际化支持。
Qt 使用一种称为“翻译文件”的机制,允许开发者将应用程序的文本翻译成不同的语言。
5.使用C++20 的std::format:
C++20 引入了一个新的格式化库,其中包括对国际化和本地化的支持。
例如,你可以使用std::format函数,并为其提供一个格式化字符串,该字符串包含一个或多个参数,这些参数会被插入到相应的位置。
qt的语言家翻译
qt的语言家翻译
Qt是一种跨平台的C++应用程序开发框架,它提供了丰富的类库和工具,用于构建高性能、可扩展和易于维护的图形用户界面(GUI)应用程序。
由于Qt拥有简洁的API设计和完善的文档支持,使得开发人员可以更加高效地进行软件开发。
Qt的语言家翻译是指Qt提供的国际化和本地化特性,使开发人员可以将Qt应用程序翻译成多种语言,以满足不同地区和用户的需求。
Qt提供了一种称为“Qt Linguist”的工具,用于管理和翻译应用程序中的文本字符串。
开发人员可以使用Qt Linguist将应用程序界面中的文本提取出来,并将其存储在翻译文件中。
然后,可以通过翻译文件将应用程序翻译成不同的语言版本。
Qt的语言家翻译功能还支持动态切换语言,即在应用程序运行时根据用户的选择或系统设置切换显示语言。
这样,用户可以在应用程序中选择自己熟悉的语言,提供更好的用户体验。
总之,Qt的语言家翻译功能提供了强大的国际化和本地化支持,使得开发人员可以轻松地将应用程序翻译成多种语言,以满足全球用户的需求。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动态切换语言(带源码)参照LeadDockProjectMgr类在编写国际化程序的时候,在很多情况下都是在系统启动的过程中选择语言,然后加载对应的地方语言翻译文件,实现语言的本地化。
但是也会有用户需要进行动态的语言切换(Dynamic Language Switching),也就是在程序主>体都运行起来后,需要改变语言的选项。
而用户不希望因为语言切换而引起程序的重启或者窗口的关闭。
Qt的国际化设计提供了这种可能。
要实现这种动态切换,只需要在程序里使用一点小小的技巧,就是把调用了Qt翻译语句tr的代码集中在某个和窗体变化无关的函数里,比如retranslateStrings()这样的函数里。
在改变语言的时候,调用这个函数就可以了。
下面是附带的一个演示程序,仅为证明功能使用。
没有过多考虑代码的严密性。
//dialog.cpp#include#include "dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent){label=new QLabel(this);okButton=new QPushButton(this);connect(okButton,SIGNAL(clicked()),this,SLOT(switchlang()));flag=0;retranslateStrings();QVBoxLayout *mainLayout = new QVBoxLayout;mainLayout->addWidget(label);mainLayout->addWidget(okButton);setLayout(mainLayout);}void Dialog::retranslateStrings(){label->setText(tr("Name:"));okButton->setText(tr("Switch Language"));setWindowTitle(tr("Switch Language ..."));}void Dialog::switchlang(){QTranslator translator;if(0==flag){translator.load("switchlang_zh");flag=1;}else{flag=0;}qApp->installTranslator(&translator);//QApplication:: installTranslator(&translator); 这句话不可以retranslateStrings(); //去掉则不能实现双语言}//dialog.h#ifndef DIALOG_H#define DIALOG_H#include <QDialog>class QLabel;class QPushButton;//! [0]class Dialog : public QDialog {Q_OBJECTpublic:Dialog(QWidget *parent = 0); private:QLabel *label;QPushButton *okButton;int flag;private slots:void retranslateStrings();void switchlang();};//! [0]#endif//main.cpp#include <QApplication>#include "dialog.h"int main(int argc, char *argv[]) {QApplication app(argc, argv);Dialog dialog;dialog.show();return app.exec();}//switchlang.proTEMPLATE = appTARGET =DEPENDPATH += .INCLUDEPATH += .# InputHEADERS += dialog.hSOURCES += dialog.cpp main.cppTRANSLATIONS+=switchlang_zh.ts多文件?动态实现语言切换比较麻烦,因为要把每个文件的tr()放入一个函数内。
动态语言切换(续)-designer中的retranslateUi(带源码)前篇动态语言切换文中提到了动态切换语言的一点技巧。
其实在desigener设计UI的时候也考虑到了这一点。
在将xxx.ui文件转换为ui_xxx.h文件的系统,uic工具为.h文件添加了retranslateUi(QWidget *) 这样的一个函数,就是专门做的一个重新设>置翻译文件的操作,不需要关闭或者隐藏任何一个窗体。
我们来看一个简单的hello.ui文件<?xml version="1.0" encoding="UTF-8"?><ui version="4.0"><class>LangForm</class><widget class="QWidget" name="LangForm"><property name="geometry"><rect><x>0</x><y>0</y><width>378</width><height>110</height></rect></property><property name="windowTitle"><string>Lang Switch</string></property><layout class="QHBoxLayout" name="horizontalLayout_2"> <item><layout class="QHBoxLayout" name="horizontalLayout"> <item><widget class="QPushButton" name="EnButton"><property name="text"><string>Display English</string></property></widget></item><item><widget class="QPushButton" name="CnButton"><property name="text"><string>Display Chinese</string></property></widget></item></layout></item></layout></widget><resources/><connections/></ui>这个文件在一个QWidget和两个QPushButton里都有和text相关的属性。
我们来看这3个text在ui_hello.h中retranslateUi()函数中是怎样的void retranslateUi(QWidget *LangForm){LangForm->setWindowTitle(QApplication::translate("LangForm", "Lang Switch", 0, QApplication::UnicodeUTF8));EnButton->setText(QApplication::translate("LangForm", "Display English", 0, QApplication::UnicodeUTF8));CnButton->setText(QApplication::translate("LangForm", "Display Chinese", 0, QApplication::UnicodeUTF8));Q_UNUSED(LangForm);} // retranslateUi所以在写动态语言切换程序时,只要把翻译语言加载进来,然后再调用retranslateUi()函数就可以实现用designer设计ui文件的动态无缝切换了。
演示代码如下: hello.ui文件前面贴过,不再重复//widget.h#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include "ui_hello.h"class Widget:public QWidget,public Ui::LangForm{Q_OBJECTpublic:Widget(QWidget *parent=0);private slots:void loadChinese();void loadEnglish();private:bool lang_is_english;};#endif//widget.cpp#include <QtGui>#include "widget.h"Widget::Widget(QWidget *parent):QWidget(parent){setupUi(this);connect(CnButton,SIGNAL(clicked()),SLOT(loadChinese()));connect(EnButton,SIGNAL(clicked()),SLOT(loadEnglish()));lang_is_english=true;}void Widget::loadChinese(){if(!lang_is_english)return;QTranslator translator;translator.load("i18n_zh");qApp->installTranslator(&translator);lang_is_english=false;retranslateUi(this);}void Widget::loadEnglish(){if(lang_is_english)return;QTranslator translator;qApp->installTranslator(&translator);lang_is_english=true;retranslateUi(this);}//main.cpp#include <QApplication>#include <QWidget>#include "widget.h"int main(int argc, char *argv[]){QApplication app(argc,argv);Widget *ww=new Widget;ww->show();return app.exec();}//i18n.proTEMPLATE = appTARGET =DEPENDPATH += .INCLUDEPATH += .# InputHEADERS += widget.hFORMS += hello.uiSOURCES += main.cpp widget.cppTRANSLATIONS += i18n_zh.tsQt的国际化和本地化国际化是指在代码设计上加入能方便的移植到其他国家和地区的特性。