在Qtopia中添加国际化支持

使用 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的分析,  发现实际上qt的原理是将各种文字编码先转化为utf8编码,然翻译为qm文件来显示本地字符!
这里不使用findstr、msg2qm工具,而采用另外的qt工具lupdate 、lrelease、linguist来完成本地化操作


以qt2/tutorial/t1 作为中文翻译例子
进行了少部分修改,加入了中文字体支持
#include <qapplication.h>
#include <qpushbutton.h>
#include <qtranslator.h>

int main( int argc, char **argv )
{
    QApplication a( argc, argv );

   //加载中文字体
    //QFont font("wenquanyi",14,50,FALSE,QFont::Unicode);
    QFont font("unifont",14,50,FALSE,QFont::Unicode);

    a.setFont( font );

    //关键代码 ,加载qm
    QTranslator *translator = new QTranslator(0);
    translator->load( "t1_zh.qm", "." );

    a.installTranslator( translator );
    QPushButton hello( QPushButton::tr("Hello world!"), 0 );
    hello.resize( 100, 30 );

    a.setMainWidget( &hello );
    hello.show();
    return a.exec();
}

1. 先修改t1.pro文件,添加TRANSLATIONS
lupdate与findstr功能差不多,只是生成XML格式的文字采集文本
TEMPLATE    = app
CONFIG      += qt warn_on release
HEADERS     =
SOURCES     = main.cpp
TARGET      = t1
REQUIRES=small-config
#  加入需要生成的翻译文件,这里采用中文
TRANSLATIONS = t1_zh.ts

执行
lupdate t1.pro
就会在当前目录下生成t1_zh.ts采集的文本文件了,修改为你采用的编码文本!

修改后的t1_zh.ts
<!DOCTYPE TS><TS>
<context>
    <name>QPushButton</name>
    <message>
        <source>Hello world!</source>
        <translation>你好!</translation>
    </message>
</context>
</TS>

 

2. 使用linguist修改t1_zh.ts生成qm翻译文件
这个工具是完全图形话操作的,这里就不再赘述
在文件菜单选择release, 提示保存为qm翻译文件即可

 
3.另类方法实现
使用iconv与lrelease结合来完成linguist的功能
既然知道qt是采用utf8编码才操作各种文本, 我们就可以借助iconv强大的编码转换功能完成同样的工作! 我是因为linguist在我平台上无法翻译才只好这么做!
修改t1_zh.ts后转换编码,这里采用gb2312->utf8转换.
iconv -f gb2312 -t utf8  t1_zh.ts t1.ts
lrelease翻译编码文件
lrelease t1.ts -qm t1_zh.qm
运行t1
./t1 -qws
显示中文
要注意的是ts文件中<translation></translation>不能有空格,
<translation ></translation> 翻译成的qm文件是不能够显示的!

 


参考:
[1]Internationalization with Q thttp://doc.trolltech.com/qtopia2.2/html/i18n.htm
[2]Qt 国际化编程 http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/i18n/index.html

-
查看最新精华文章 请访问博客首页相关文章
Qt/Embedded中文化qt林林总总(1)QT/E 2.3.7 国际化步骤qt国际化qt中文翻译步骤qt 翻译应用程序Qt 笔记: 多语言qt国际化

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/force_eagle/archive/2007/05/29/1629753.aspx

 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/force_eagle/archive/2007/05/29/1629713.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值