zoukankan      html  css  js  c++  java
  • 在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)。


     
  • 相关阅读:
    WCF步步为营(三):使用配置文件改变使用服务的方式
    WCF步步为营(五):数据契约
    弹性工作制下的IT项目管理
    C#拾遗系列(8):异常
    WCF步步为营(一):简单示例
    敏捷的 "道"
    从中国男足看项目管理
    WCF步步为营(二):使用配置文件改变发布服务的方式
    WCF步步为营(四):客户端使用代理类使用服务
    C#拾遗系列(9):继承、接口、扩展方法、分部类、类操作、Ref and Out、可空类型
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6314595.html
Copyright © 2011-2022 走看看