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

栏目:资讯发布:2023-10-31浏览:2收藏

如何使用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既有弹簧的意思,又有春天的意思。designer里面选组建的时候,有一个blue spring(蓝色的弹簧)是用于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工程文件,比如在apppro里加入

TRANSLATIONS+=app_ents app_zh_CNts app_zh_TWts #后面你可以加你想要翻译的各种版本

CONFIG += localize_deployment

SYMBIAN_SUPPORTED_LANGUAGES += zh_CN

SYMBIAN_LANGzh_CN = 31

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

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

$ lupdate apppro

$ linguist app_zh_CNts

$linguist app_zh_TWts

$ lrelease ts

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

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( usersettingslanguage == SimpleChinese ) {

// Qt’s own translations

qt_translatorload("qt_zh");

qApp->installTranslator( &qt_translator );

// application translation

app_translatorload("myprogram_zh");

qApp->installTranslator( &app_translator );

}

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

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

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

QTranslator translator;

translatorload(QString("trollprint_") + locale);

appinstallTranslator(&translator);

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

symbian: {

addFilessources = helloworld_ents helloworld_zh_CNqm helloworld_zh_TWqm helloworld_zh_HKqm

addFilespath =

DEPLOYMENT += addFiles

}

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

一个极其简单的例子 //maincpp

int main(int argc, char argv[])

{

QApplication app(argc, argv);

QTranslator translator;

translatorload("hellotr_zh");

appinstallTranslator(&translator);

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

helloresize(100, 30);

helloshow();

return appexec();

}

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

远程编译

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

OTHER_FILES += helloworld_ents helloworld_zh_CNts helloworld_enqm helloworld_zh_CNqm

参见Remote Compiler troubleshooting

相关文档

Internationalization with Qt

Java的特点

1平台无关性

平台无关性是指Java能运行于不同的平台。Java引进虚拟机 原理,并运行于虚拟机,实现不同平台的Java接口之间。使用Java编写的程序能在世界范围内共享。Java的数据类型与 机器无关,Java虚拟机(Java Virtual Machine)是建立在硬件和操作系统之上,实现Java二进制代码的解释执行功能, 提供于不同平台的接口的。

2安全性

Java的编程类似C++,学习过C++的读者将很快掌握Java的精髓。Java舍弃了C++的指针对存储器地址的直接操作,程序运行时,内存由操作系统分配,这样可以避免病毒通过指针侵入系统。Java对程序提供了安全管理器,防止程序的非法访问。

3面向对象

Java吸取了C++面向对象的概念,将数据封装于类中,利用类的优点,实现了程序的简洁性和便于维护性。类的封装性、继承性等有关对象的特性,使程序代码只需一次编译,然后通过上述特性反复利用。程序员只需把主要精力用在类和接口的设计和应用上。Java提供了众多的一般对象的类,通过继承即可使用父类的方法。在Java中,类的继承关系是单一的非多重的,一个子类只有一个父类,子类的父类又有一个父类。Java提供的Object类及其子类的继承关系如同一棵倒立的树形,根类为Object类,Object类功能强大,经常会使用到它及其它派生的子类。

4分布式

Java建立在扩展TCP/IP网络平台上。库函数提供了用HTTP和FTP协议传送和接受信息的方法。这使得程序员使用网络上的文件和使用本机文件一样容易。

5健壮性

Java致力于检查程序在编译和运行时的错误。类型检查帮助检查出许多开发早期出现的错误。Java自己操纵内存减少了内存出错的可能性。Java还实现了真数组,避免了覆盖数据的可能,这些功能特征大大提高了开发Java应用程序的周期。并且Java还提供了Null指针检测、数组边界检测、异常出口、Byte code校验等功能。

Java与C/C++语言

Java提供了一个功能强大语言的所有功能,但几乎没有一点含混特征。C++安全性不好,但C和C++被大家接受,所以Java设计成C++形式,让大家很容易学习。Java去掉了C++语言中的指针运算、结构、typedefs、#define、需要释放内存等功能,减少了平常出错的50%,让Java的语言功能很精炼。而且,因为Java很小,所以整个解释器只需215K的RAM,并增加了一些很有用的功能,如自动收集碎片。Java实现了C++的基本面象对象技术并有一些增强,(为了语言简单,删除了一些功能)。Java处理数据方式和用对象接口处理对象数据方式一样。

Java与C和C++直接相关Java继承了C的语法,Java 的对象模型是从C++改编而来的现代程序设计始于C,而后过渡到C++,现在则是JAVA通过大量的继承,JAVA提供了一个强大的,可以更好地利用已有成果的,逻辑一致的程序设计环境,并且增加了在线环境需求的新功能或许最重要的一点在于,由于它们的相似性,C,C++和JAVA为专业程序员定义了一个统一的概念架构程序员从其中的一种语言转到另一种语言时,不会遇到太大的困难

Qt软件

Qt 是一个跨平台的 C++ 图形用户界面库,由挪威 TrollTech 公司于1995年底出品。

Trolltech 公司在 1994 年成立,但是在 1992 年,成立 Trolltech 公司的那批程序员 就已经开始设计 Qt 了,Qt 的第一个商业版本于 1995 年推出然后 Qt 的发展就很快了,下面是 Qt 发展史上的一 些里程碑:

1996 Oct KDE 组织成立

1998 Apr 05 Trolltech 的程序员在 5 天之内将 Netscape50 从 Motif 移植到 Qt 上

1998 Apr 08 KDE Free Qt 基金会成立

1998 Jul 09 Qt 140 发布

1998 Jul 12 KDE 10 发布

1999 Mar 04 QPL 10 发布

1999 Mar 12 Qt 144 发布

1999 Jun 25 Qt 20 发布

1999 Sep 13 KDE 112 发布

2000 Mar 20 嵌入式 Qt 发布

2000 Sep 06 Qt 22 发布

2000 Oct 05 Qt 221 发布

2000 Oct 30 Qt/Embedded 开始使用 GPL 宣言

2000 Sep 04 Qt free edition 开始使用 GPL

自从1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功的应用程序的基础。Qt也是流行的Linux桌面环境KDE 的基础,KDE是所有主要的Linux发行版的一个标准组件。

基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西,但是 Qt 具有下列优点:

1 优良的跨平台特性:

Qt支持下列操作系统: Microsoft Windows 95/98, Microsoft Windows NT, Linux, Solaris, SunOS, HP-UX, Digital UNIX (OSF/1, Tru64), Irix, FreeBSD, BSD/OS, SCO, AIX, OS390,QNX 等等。

2 面向对象

Qt 的良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,对于用户开发来说是非常 方便的。 Qt 提供了一种称为 signals/slots 的安全类型来替代 callback,这使得各个元件 之间的协同工作变得十分简单。

3 丰富的 API

Qt 包括多达 250 个以上的 C++ 类,还替供基于模板的 collections, serialization, file, I/O device, directory management, date/time 类。甚至还包括正则表达式的处理 功能。

4支持 2D/3D 图形渲染,支持 OpenGL

5大量的开发文档

6XML 支持

Qt支持下述平台:

MS/Windows - 95、98、NT 40、ME、2000、XP 、 Vista和Win7

Unix/X11 - Linux、Sun Solaris、HP-UX、Compaq Tru64 UNIX、IBM AIX、SGI IRIX和其它很多X11平台

Macintosh - Mac OS X

Embedded - 有帧缓冲(framebuffer)支持的Linux平台,Windows CE。

Symbian/S60 - 目前已经可以提供技术预览版本

2008年1月31日,Nokia公司宣布通过公开竞购的方式收购TrollTech公司,旗下包括Qt在内的技术都归入Nokia旗下。并且Nokia针对自己的移动设备平台规划的需要,将Qt按不同的版本发行:

Qt商业版 提供给商业软件开发。它们提供传统商业软件发行版并且提供在协议有效期内的免费升级和技术支持服务。

Qt开源版是Qt仅仅为了开发自由和开放源码软件, 提供了和商业版本同样的功能。GNU通用公共许可证下,它是免费的。

从2009年3月发布的Qt 45 起,诺基亚将为Qt增添新的开源LGPL授权选择。

关于如何正确的选择这三种授权协议,可以阅读[1]。

从2009年5月11日起,诺基亚Qt Software 宣布 Qt源代码库面向公众开放,Qt 开发人员可通过为 Qt 以及与 Qt 相关的项目贡献代码、翻译、示例以及其他内容,协助引导和塑造 Qt未来的发展。为了便于这些内容的管理,Qt Software 启用了基于 Git 和 Gitorious 开源项目的Web 源代码管理系统[2] 。

在推出开放式 Qt 代码库的同时,Qt Software 在其官方网站发布了其产品规划(Roadmap)。其中概述了研发项目中的最新功能,展现了现阶段对 Qt 未来发展方向的观点,以期鼓励社区提供反馈和贡献代码,共同引导和塑造 Qt 的未来。

请高手指教:如何将Qt程序移植到安卓系统中运行?

你的linux系统版本太低了,RHEL5?CentOS5?

QT是做桌面开发的,用更新快的linux发行版如Ubuntu,Fedora之类就没问题了。RHEL/CentOS6x应该也是可以的。

如果真想在你现在的linux系统上运行,并且linux比较熟的话,可以找个新版本的libstdc++so6,用它来运行QtSDK(设置LD_LIBRARY_PATH)。即使这样难保它不会再依赖其它库的新版本。

安卓手机能上QT吗?

有安卓版,不过问题太多,正常使用都很难,我安装了的,不过问题实在太多了

怎样才可以在别人的电脑上运行自己的QT程序?

你可以参考SQLiteStudio这个Qt写的跨平台SQLite管理工具,它自己打包了依赖的Qt库,可以做到解压即用,兼容不同Linux发行版道理其实跟Windows版Qt程序自带Qt库差不多

编译前给连接器传一个参数:

说明:

-Wl表示告诉编译器将后面的参数传递给链接器

rpath是gcc的一个参数,当程序被加载时,会搜寻rpath目录,寻找共享库

rpath添加的目录信息保存在可执行文件中

$ORIGIN表示可执行文件所在的目录

也就是运行时程序会先去自己所在的目录的lib里去加载依赖库,没有的话再去系统库里找

如果你的程序在编译时没有传递rpath参数,那你也可以用patchelf来修改你程序的rpath:

注意:patchelf修改文件后再strip会导致文件损坏

所以应该先用strip删除符号表缩小二进制文件,然后再用patchelf设置rpath

题外话,Android上既没有glibc库,也没有库链接器ld-linuxso3

如果你要把DebianARM(如树莓派Raspbian)上的软件放到Android上跑,你一样可以打包程序依赖的共享库,让程序也能跑在Android上,比如PHP:

也就是你把库链接器ld-linux-armhfso3和PHP依赖的库都放到/data/local/tmp/web/lib里,然后设置个别名,就能在Android的adbshell里运行树莓派的PHP了

当然,你也可以用patchelf设置PHP的interpreter和rpath,效果差不多:

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

国际化是指在代码设计上加入能方便的移植到其他国家和地区的特性。而本地化是指将具有国际化支持的代码翻译成本国或地区的语言,是本地用户...
点击下载
热门文章
    确认删除?
    回到顶部