Qt 国际化编程

 

在代码中用可以用英文命名各个元件,但是main.cpp中加入以下语句:
QTranslator translator;
translator.load("hellotr_la");
app.installTranslator(&translator);
然后运行qmake -project
在生成的.pro文件中加一下语句:
TRANSLATIONS=hellotr_la.ts
运行 qmake
运 行 lupdate -verbose hellotr_la.pro 生成.ts文件 (.ts format is human-readable XML that can be emailed directly and is easy to put under version control)
运行 linguist hellotr_la.ts 打开QT linguist Trolltech 选中你要改名的元件,在Translation下写要改成的中文名.
然后File->Release
File->Save
最后就可以make你的程序并运行了.
其实在qt4的assistant-Tutorial and Example-QT Linguist Examples中有详细介绍.本文参考它得来的.
QT中的例子:

 

 QApplication app(argc, argv);
QString locale = QLocale::system().name();
 QTranslator translator;
 translator.load(QString("arrowpad_") + locale);
 app.installTranslator(&translator);
 面说一下qt国际化编程的操作步骤:
1、编写源代码
2、在*.pro文件中添加TRANSLATIONS += *.ts ,有多少中语言就添加多少个ts文件。
3、运行lupdate *.pro 生成ts文件。lupdate会根据源代码中的内容提取出待翻译的字段,然后生成ts文件,ts文件是xml格式的。
4、用qt linguist打开ts文件,并翻译相应字段
5、运行lrelease *.pro生成qm文件。lrelease会根据ts文件生成二进制的qm翻译文件。
6、在*.qrc文件中添加qm文件的路径,并编译源代码
 

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 还不支持动态切换编码输入的支持,这是它的不足之处。

1. Qt 的文本显示

使用 Qt 编写国际化的程序,最好不要在程序中直接使用特殊编码的文本。 比如要 编写一中文界面的 Qt 程序,应该在程序中使用英文,程序编写完成后,把文本提取 出来翻译。 这样,程序还可以根据Locale的不同,支持多种语言。下面介绍如何在 Qt 程序中标注字符串,如何提取并翻译文本。

像普通的国际化过程一样,Qt 使用了类似GNU gettext一样的函数 QObject::tr(),它 用于从Qt的信息文件 .qm 中取出信息,这些信息是经过 Qt 的工具处理的。 Qt在处理 编码时还使用了 QTranslator 类,可用于指定整个应用软件的 的信息文件。

下面是一段使用了 QObject::tr()的代码,它建立了一个弹出菜单,菜单项是"Quit",它被放置在菜单条上,在菜单条上显示的是标签"File"。

 QPopupMenu* popup; popup = new QPopupMenu( this ); popup->insertItem( tr("&Quit"),qApp,SLOT(quit()) ); menubar->insertItem( tr("&File"),popup );

对于绝大多数情况,可以用上述方法处理。不过有时在定义某些变量中使用的字符串,不能使用上述方法,但是为了让Qt提取并翻译该字符串,必须用 某种方法标志出 来。Qt 定义了 QT_TR_NOOP() 和 QT_TRANSLATE_NOOP() 来标志它们。前者用于单个字 符串,后者用于多个字符串。比如,

 static const char* strings[] = { QT_TR_NOOP( "Hello" ), QT_TR_NOOP( "World" ) };

有时需要使用printf/sprintf之类的函数动态生成字符串,比如,

 QStings s; s.sprintf( "Button %d",i ); but->setText( s );

对这种使用方式的国际化是使用 arg() 函数。

 QString s = tr( "Button %1" ).arg(i); but->setText( s );

提取上述信息的方法是使用 Qt 提供的工具 findtr 命令:

 findtr [filename].cpp > i18n.po

它类似于GNU的 xgettext,上述文件的提取信息文件内包含,

 .... "Content-Type: text/plain; charset=iso-8859-1\n" #: i18n.cpp:34 msgid "ExampleWidget::&File" msgstr "" ...

接下来是文本翻译过程。 在Qt中翻译信息文件时应该注意以下事项: (1) 提取的信息文件的编码是iso-8859-1,在翻译成某种语言(编码)时应该 注意改动它的字符集,比如对中文GB2312和Big5编码,应该是, "Content-Type: text/plain; charset=gb2312\n"或者"Content-Type: text/plain; charset=big5\n"。 (2) 提取的信息有一个范围,比如上面的文件指定的范围是 ExampleWidget, 在翻译 前应该把它去掉,变成 msgid "::&File"。(3) 被翻译的字符串可能含有加速键 符号,如 "&File"中的"F",如果翻译成中文最好保留该信息,它可以翻译成 "文件(&F)"。

对于翻译后的文件(比如上面的翻译文件存为 i18n_gb.po),必须使用 Qt 提供的 工具 msg2qm 把它转换为 .qm 文件才能使用,

 > msg2qm i18n_gb.po i18n_gb.qm

它类似于GNU的 msgfmt 命令。翻译后的文件可以用Qt程序直接调用。

 QTranslator *translator = new QTranslator(0); translator->load("i18n_gb.qm","."); qApp->installTranslator(translator);

此外,Qt 还提供了类似于 msgmerge 的工具 mergetr,它用于把新提取的信息文件和已经翻译过的信息文件融合起来,在此不再赘述。

在 Qt 中也可以直接使用 QTextCodec 来转换字符串的编码,这为在Qt下开发纯中文软件带来了便利条件,不过这种方法不符和国际化/本地化的习惯,

 char *string = "中文和English混和字符串!" QTextCodec* gbk_codec = QTextCodec::codecByName("GBK"); QString gbk_string = codec->toUnicode(string); QLabel *label = new QLabel(gbk_string);

如果使程序只支持一种编码,也可以直接把整个应用程序的编码设置为GBK编码, 然后在字符串之前加tr(QObject::tr),

 qApp->setDefaultCodec( QTextCodec::codecForName("GBK") ); QLabel *label = new QLabel( tr("中文标签") );

如果使Qt根据Locale的环境变量取得字符集,可以使用 QString::fromLocal8Bit(str)。

本节的例子请参见 qt-i18n-example.tar.gz


2. Qt 的文本输入

在输入方面,Qt 的输入条(QLineEdit)和编辑区(QMultiLineEdit)都支持 XIM,只要配合相应的输入服务器,便可以输入中文/日文/韩文。目前有许多支持XIM的软件,比如 中文: Chinput/xcin/rfinput/q9,日文: kinput2/skkinput,韩文: ami/hanIM。

Qt程序的缺省输入风格是OverTheSpot风格,它也支持 OffTheSpot风格和 Root风格。用户可以在起动程序时在命令行指定输入风格,比如对程序app,

 ./app -inputstyle overthespot #缺省风格,光标跟随 ./app -inputstyle offthespot ./app -inputstyle root

经过 MiziLinux 补丁的Qt-2.2.0 支持 OnTheSpot 输入风格,并且把它作为 缺省的输 入风格。请参见 http://www.mizi.com/ko/kde/doc/onthespot/onthespot.html。

Qt 中的任何一个 Widget 都可以接受输入,只要它可以有键盘聚焦(Keyboard Focus)。所以对特殊 Widget 的输入处理只需要截获键盘输入,获取从XIM服务器 来的字符串。对于OverTheSport风格的支持,刷新XIM输入服务器的位置即可。


3. Qt 的打印

在打印方面,XWindow下的 Qt 生成PostScript并使用lpr打印。 它含有QPrinter类,可以方便地支持输出页面的控制。 对于中文打印,必须修正PostScript文件的输出 部分。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值