如何使用qt的国际化,本地化支持 步骤

如何使用qt的国际化,本地化支持 步骤,第1张

国际化是指在代码设计上加入能方便的移植到其他国家和地区的特性。而本地化是指将具有国际化支持的代码翻译成本国或地区的语言,是本地用户更容易使用。 I18n是Internationalization的简写,l10n是Localization的简写。

在Qt中创建可以国际化的代码

最常见的是将要翻译的字符串加上tr语句,tr语句的标准语法是:

Context::tr(sourceText,comment), 比如 QString str2 = QTextEdit::'''tr'''(“Letter”,”paper size”)

Context(上下文)和comment(注释)是可以省略的,它们的意思分别是 Context:用于指明该翻译文字所在的上下文,一般为类名。因为同样的一个字串在不同的环境中翻译出来是不一样的,比如都是死,皇帝是崩,普通老百姓就是死翘。 comment: 用于指明要翻译文字的一个注释。因为作翻译的可能并不是写代码的人。比如spring既有d簧的意思,又有春天的意思。designer里面选组建的时候,有一个blue spring(蓝色的d簧)是用于addStretch()的,如果没加说明,有可能被翻译成蓝色的春天。

在写代码的时候,我们可能希望把所有的字符串都放在一个地方,而方便于我们自己集中作改动。真正用到的时候,用一个字符常量指针去访问。那么我们可能想到这样写代码

/银笑羡/ Wrong,这种实现Qt不认识,无法作翻译

const char *appName=“OpenDrawer 2D”

QString translated=tr(appName)

//ok, 需要使用QT_TR_NOOP字串来提醒Qt系统该翻译的字串

const char *appName=QT_TR_NOOP(“OpenDrawer 2D”)

QString translated=tr(appName)

QT_TR_NOOP的语法是QT_TR_NOOP(sourceText),它还有两锋拍个变体,语法如下

QT_TRANSLATE_NOOP ( context, sourceText )

QT_TRANSLATE_NOOP3 ( context, sourceText, comment )

对应介绍的context和comment,其意思应该不难理解

还有一种情况是在一个字串中有一部分来源于变量。那我们看看两种正误的写法

// wrong 这种写法无法被正确识别

statusBar()->showMessage('''tr'''(“Host ” + hostName+“ found”);

//ok 利用了QString的arg()函数。在翻译时,需保留%1

statusBar()->showMessage('''tr'''(“Host %1 found”).arg(hostName)

在书写了含可翻译语句的程序后,我们来看看如何生成翻译文件

生成翻译文件

首先要修改.pro工程文件,比如在app.pro里加入

TRANSLATIONS+=app_en.ts app_zh_CN.ts app_zh_TW.ts #后面你可以加你想要翻译的各种版本

CONFIG += localize_deployment

SYMBIAN_SUPPORTED_LANGUAGES += zh_CN

SYMBIAN_LANG.zh_CN = 31

注:其中SYMBIAN_SUPPORTED_LANGUAGES ,SYMBIAN_LANG.zh_CN 两行是localize_deployment.prf 中缺少的两行,简体中文qs 文件只使用语言代号zh时 与系统解析的" 语言_区域"区域格式不符,请先这样设置。

然后在shell, 里执行如下语句( 在Qt SDK 中请打开Qt for Desktop的升滚命令行,目前lupdate 命令没有为Qt for symbian生成的版本)

$ lupdate app.pro

$ linguist app_zh_CN.ts

$linguist app_zh_TW.ts

$ lrelease *.ts

$ lupdate app.pro #会根据.pro里指示的内容,生成app_zh_CN.ts和app_zh_TW.ts $ linguist app_zh_CN.ts 翻译其中一个文件,linguist是一个图形化的工具, $linguist app_zh_TW.ts 翻译另一个, $ lrelease *.ts 将.ts文本文件转换成.qm二进制文件,会生成app_zh_CN.qm和app_zh_TW.qm,方便应用加载

.ts 是Text String的缩写;.qm是Qt Message的缩写所以翻译文件生成的流程就是 .cpp —>.ts —>.qm lupdate是负责找出qt源代码中需要翻译的字符串的。会搜tr/QT_TR_NOOP/QT_TRANSLATE_NOOP /QT_TRANSLATE_NOOP3等语句 linguist是手动翻译.ts文件的一个工具,真正加入本地语言是在这一步 lrelease是将.ts转换成.qm的一个工具。需要提醒一下的,lupdate生成的.ts文件不会覆盖掉已经翻译过的.ts文件,只会更新其中的内容。所以其名字为languange update

有了翻译文件,我们看看系统是怎么加载翻译文件的。

加载翻译文件

一个例子,很简单的说明问题

QTranslator qt_translator

QTranslator app_translator

if( usersettings.language == SimpleChinese ) {

// Qt’s own translations

qt_translator.load("qt_zh")

qApp->installTranslator( &qt_translator )

// application translation

app_translator.load("myprogram_zh")

qApp->installTranslator( &app_translator )

}

这里,我们看到有两个翻译加载器,其中一个是加载应用程序的翻译文件,也就是我们在第二个步骤中生成的文件。另外一个是Qt系统的翻译文件,比如 Qt的版权信息,designer的一些菜单等,名字叫qt_后带一个语言版本。

有时候我们在系统启动的时候,就需要判断本地的语言,然后加载不同的翻译文件,那么代码就是如下结构

QString locale = QLocale::system().name()

QTranslator translator

translator.load(QString("trollprint_") + locale)

app.installTranslator(&translator)

在pro文件中部署qm文件,使得在symbian系统下能方便的检索到qm文件,而不用再load方法中设置路径

symbian: {

addFiles.sources = helloworld_en.ts helloworld_zh_CN.qm helloworld_zh_TW.qm helloworld_zh_HK.qm

addFiles.path = .

DEPLOYMENT += addFiles

}

本地设置的语言,和我们的.qm前面部分并不完全一样,有一个.qm查询的过程,假如本地字语言名字是fr_CA.ISO8859-15,加载程序会按照 trollprint_fr_CA.ISO8859-15.qm,trollprint_fr_CA.qm,trollprint_fr.qm顺序来加载,如果以上都没有,将使用默认的语言

一个极其简单的例子 //main.cpp

int main(int argc, char *argv[])

{

QApplication app(argc, argv)

QTranslator translator

translator.load("hellotr_zh")

app.installTranslator(&translator)

QPushButton hello(QPushButton::tr("Hello world!"))

hello.resize(100, 30)

hello.show()

return app.exec()

}

本地化中文例程:File:HelloWorld.zip, 语言代码可以在ISO 639-1 codes中找到(two-letter ISO 639 language code)。

远程编译

远程编译需要在pro文件中如下声明ts qm,否则远程编译器找不到 ts和 qm 文件

OTHER_FILES += helloworld_en.ts helloworld_zh_CN.ts helloworld_en.qm helloworld_zh_CN.qm

参见Remote Compiler troubleshooting

相关文档

Internationalization with Qt

引言:目前,Qt作为图形开发软件闹冲使用的人群越来越多,很多公司的产品有多国语言支持的需求,笔者就教学与项目开发中的经历,小结了Qt多国语言(国际化)液皮歼问题,仅供参考。

假设我们已经建好一个工程,且可以运行握敬出基本的界面。

1、打开项目工程文件QTDemo.pro,添加如下语句:

TRANSLATIONS += en.ts zh_CN.ts zh_TW.ts

2、然后在命令行窗口中输入以下命令:

lupdate QTDemo.pro

这样就生成了3个语言文件:en.ts,zh_CN.ts,zh_TW.ts

3、用linguist(在QT安装目录下的bin目录中)打开zh_CN.ts(简体中文),选择“编辑”->“翻译文件设置…”,选择Chinese/China:选中某一个字符串,在译文文本框

中输入对应于中文的字符串:

同理,进行zh_TW.ts(繁体中文)文件的翻译,en.ts(英文)文件不用翻译。

4、用 lrelease QTDemo.pro 将对应的.ts文件生成.qm文件,.qm文件比较紧凑、体积小。

5、在程序中添加对国际化的支持,将main.cpp修改为如下内容:

#include <QApplication>

#include <QTranslator>

#include "QtDemo.h"

int main(int argc, char **argv)

{

QApplication app(argc, argv)

//以下3句话是装载的程序

QTranslator translator

translator.load(QString(argv[1]))

app.installTranslator(&translator)

QtDemo *dlg = new QtDemo

dlg->show()

return app.exec()

}

重新执行make命令,生成可执行程序。

在运行程序时通过传递命令行参数指定所使用的语言,注意不需要指定扩展名.qm,例如:

./QTDemo zh_CN 就出现中文的界面了,其他的依次类推。

分类: 医疗健滚陪康

问题描述:

Qt有什么作用,可以用来做什么??

解析:

QT是一个完全的C++程序开发框架,包含类库纤告和跨平台国际化开发工具。QT API和开发工具对所毁备明有支持平台都是一致的,从而可以进行独立于平台的程序开发和配置。使得跨平台软件编程直观、简易和方便。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12518803.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-25
下一篇2025-08-25

发表评论

登录后才能评论

评论列表(0条)

    保存