⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i18n.html

📁 QT3的教程
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><!-- /home/reggie/tmp/qt-3.0-reggie-5401/qt-x11-commercial-3.0.5/doc/i18n.doc:36 --><html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><meta name="Translator" content="farfareast"><meta name="Qt zh_CN Documents Website" content="http://www.qiliang.net/qt"><title>以Qt国际化</title><style type="text/css"><!--h3.fn,span.fn { margin-left: 1cm; text-indent: -1cm; }a:link { color: #004faf; text-decoration: none }a:visited { color: #672967; text-decoration: none }body { background: #ffffff; color: black; font-family: "Times New Roman" }--></style></head><body><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr bgcolor="#E5E5E5"><td valign=center> <a href="index.html"><font color="#004faf">主页</font></a> | <a href="classes.html"><font color="#004faf">所有的类</font></a> | <a href="mainclasses.html"><font color="#004faf">主要的类</font></a> | <a href="annotated.html"><font color="#004faf">注释的类</font></a> | <a href="groups.html"><font color="#004faf">分组的类</font></a> | <a href="functions.html"><font color="#004faf">函数</font></a></td><td align="right" valign="center"><img src="logo32.png" align="right" width="64" height="32" border="0"></td></tr></table><h1 align=center>Qt国际化</h1> <p> <!-- index internationalization --><a name="internationalization"></a><p>应用的国际化就是使应用成为能被非本国的人使用的过程。<p>有的情况下,国际化很简单,例如,使一个US应用可被Australian或者British用户理解,工作可能少于几个拼写修正。但是使一个US应用可以被Japanese用户使用,或者一个Korean应用可被German用户使用,就会需要软件不仅工作于不同语言下,还要使用不同的输入技术、字符编码和表达习惯。<p>也参见<a href="linguist-manual.html">Qt语言学家</a>手册。<p> <h2>Step by Step</h2><a name="1"></a><p>以Qt来编写多平台国际化的软件是一个和缓的、逐步增加的过程。你的软件可以按下面的几个阶段实现国际化:<p> <h3>对所有用户可见的文本使用<a href="qstring.html">QString</a></h3><a name="1-1"></a><p>既然QString内部就使用Unicode编码,那么使用常见的文本处理手段,就可以透彻地处理世界上的每种语言。同时,既然所有向用户呈现文本的Qt函数都把QString作为参数,也就没有了char*到QString的转换的时间开销。<p>在“程序员空间”(例如<a href="qobject.html">QObject</a>的名称和文件格式文本)的字符串不需要使用QString;传统的char*或者<a href="qcstring.html">QCString</a>类就够用了。<p>你不大可能注意到你在使用Unicode;QString和<a href="qchar.html">QChar</a>就如同早期版本的传统C中的粗糙的const char*和char。<p> <h3>对所有文字形式的文本使用<a href="qobject.html#tr">tr()</a></h3><a name="1-2"></a><p>无论你的程序在哪里对将会呈现给用户的文本使用了<tt>"quoted text"</tt>,要确保它被<a href="qapplication.html#translate">QApplication::translate</a>()函数处理过。其实做到这一点只需要使用<a href="qobject.html#tr">QObject::tr</a>()。例如,假设<tt>LoginWidget</tt>是QWidget的一个子类:<p> <pre>    LoginWidget::LoginWidget()    {        <a href="qlabel.html">QLabel</a> *label = new <a href="qlabel.html">QLabel</a>( tr("Password:"), this );        ...    }</pre> <p>这就解决了你可能要写的用户可见的字符串的99%。<p>如果这些quoted text不是在<a href="qobject.html">QObject</a>子类的成员函数中,可以使用一个适当的类的tr()函数,或者直接使用<a href="qapplication.html#translate">QApplication::translate</a>()函数:<p> <pre>    void some_global_function( LoginWidget *logwid )    {        <a href="qlabel.html">QLabel</a> *label = new <a href="qlabel.html">QLabel</a>(                LoginWidget::tr("Password:"), logwid );    }    void same_global_function( LoginWidget *logwid )    {        <a href="qlabel.html">QLabel</a> *label = new <a href="qlabel.html">QLabel</a>(                qApp-&gt;<a href="qapplication.html#translate">translate</a>("LoginWidget", "Password:"),                logwid );    }</pre><p>如果你需要不在函数里的可翻译文本,有两个宏可以帮忙:QT_TR_NOOP()和QT_TRANSLATE_NOOP()。它们仅仅标示出文本,以便于被下面描述的<em>lupdate</em>工具提取。宏扩展为只是文本(没有上下文)。<p>QT_TR_NOOP()的例子:<pre>    QString FriendlyConversation::greeting( int greet_type )    {        static const char* greeting_strings[] = {            QT_TR_NOOP( "Hello" ),            QT_TR_NOOP( "Goodbye" )        };        return tr( greeting_strings[greet_type] );    }</pre> <p>QT_TRANSLATE_NOOP()的例子:<pre>    static const char* greeting_strings[] = {        QT_TRANSLATE_NOOP( "FriendlyConversation", "Hello" ),        QT_TRANSLATE_NOOP( "FriendlyConversation", "Goodbye" )    };    QString FriendlyConversation::greeting( int greet_type )    {        return tr( greeting_strings[greet_type] );    }    <a href="qstring.html">QString</a> global_greeting( int greet_type )    {        return qApp-&gt;<a href="qapplication.html#translate">translate</a>( "FriendlyConversation",                                greeting_strings[greet_type] );    }</pre><p>如果你使用定义的宏QT_NO_CAST_ASCII编译你的软件,从而关闭了从const char*到<a href="qstring.html">QString</a>的自动转换,你很可能会捕捉到你错过的字符串。更多信息参见<a href="qstring.html#fromLatin1">QString::fromLatin1</a>()。关闭这个转换会使编程有点儿麻烦。<p>如果你的源码语言使用Latin-1之外的字符集,你会发现<a href="qobject.html#trUtf8">QObject::trUtf8</a>()比<a href="qobject.html#tr">QObject::tr</a>()更好用,因为tr()依赖于<a href="qapplication.html#defaultCodec">QApplication::defaultCodec</a>(),这使它比QObject::trUtf8()更脆弱。<p> <h3>对于加速键值(Accelerator value)使用<a href="qkeysequence.html">QKeySequence</a>()</h3><a name="1-3"></a><p>加速键值,例如Ctrl+Q或者Alt+F,也需要翻译。如果你的应用给“Quit”直接编码(hardcode)为<tt>CTRL+Key_Q</tt>,翻译者就不能重载它了。正确的习惯用法是<p> <pre>    <a href="qpopupmenu.html">QPopupMenu</a> *file = new <a href="qpopupmenu.html">QPopupMenu</a>( this );    file-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( tr("&amp;Quit"), this, SLOT(quit()),                      QKeySequence(tr("Ctrl+Q", "File|Quit")) );</pre><p> <h3>对简单参数使用<a href="qstring.html#arg">QString::arg</a>()</h3><a name="1-4"></a><p>对于国际化的文本,在字符串中类似printf()风格的插入参数一般是不好的选择,因为有时候有必要在翻译时改变参数的顺序。不管怎样,QString::arg()函数为参数替换提供了一种简单的途径:<pre>    void FileCopier::showProgress( int done, int total,                                   const <a href="qstring.html">QString</a>&amp; current_file )    {        label.setText( tr("%1 of %2 files copied.\nCopying: %3")                        .arg(done)                        .arg(total)                        .arg(current_file) );    }</pre><p> <h3>创作译本</h3><a name="1-5"></a><p>在应用中通篇使用tr()之后,你就可以开始创作程序中用户可见的文本的译本了。<p> <a href="linguist-manual.html">Qt语言学家</a>手册提供了关于Qt翻译工具、<em>Qt语言学家</em>、<em>lupdate</em>和<em>lrelease</em>的进一步信息。<p>Qt应用的翻译过程分为三步:<p> <ol type=1><li>运行<em>lupdate</em>,以提取出Qt应用的C++源代码中的可翻译文本,会产生一个给翻译者的信息文件(.ts文件)。该工具识别出tr()结构和上面描述的QT_*_NOOP宏,产生.ts文件(通常每种语言一个)。<li>使用Qt语言学家提供.ts文件中源文本的译文。既然.ts文件是XML格式,你也可以手工编辑它们。<li>运行<em>lrelease</em>,以从.ts文件中得到只适用于最后使用的轻量级的信息文件(.qm文件)。你可以把.ts文件看成“源文件”,把.qm文件看成“目标文件”。翻译者编辑的是.ts文件,可是你的应用的用户只需要.qm文件。这两种文件都是平台和地区(locale)无关的。</ol><p>典型地,你将对应用地每个发表版本重复这几步。<em>lupdate</em>工具会尽力重用以前的发表版本的译文。<p>在你运行<em>lupdate</em>之前,你应该准备一个项目文件。这是一个项目文件(.pro文件)的例子:<p> <pre>    HEADERS         = funnydialog.h \                      wackywidget.h    SOURCES         = funnydialog.cpp \                      main.cpp \                      wackywidget.cpp    FORMS           = fancybox.ui    TRANSLATIONS    = superapp_dk.ts \                      superapp_fi.ts \                      superapp_no.ts \                      superapp_se.ts</pre><p>当你运行<em>lupdate</em>或者<em>lrelease</em>时,你必须以命令行参数给出项目文件的名称。<p>在本例中,支持四种语言:Danish、Finnish、Norwegian和Swedish。如果你使用qmake(或者tmake),你一般不需要给<em>lupdate</em>的附加项目文件;只要你加上TRANSLATIONS条目,你的qmake项目文件就会正常工作。<p>在应用中,你必须使用<a href="qtranslator.html#load">QTranslator::load</a>()来装载对应用户语言的译文文件,再使用<a href="qapplication.html#installTranslator">QApplication::installTranslator</a>()来安装它们。<p>如果你一直使用以前的Qt工具(findtr、msg2qm和mergetr),可以使用<em>qm2ts</em>来转换你以前的.qm文件。<p> <em>语言学家</em>、<em>lupdate</em>和<em>lrelease</em>安装在<tt>$QTDIR/bin</tt>。在Qt语言学家中点击Help|Manual,就可访问用户手册,它包含了让你起步的演示教程。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -