?? i18n.html
字號(hào):
<!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國(guó)際化</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">主頁(yè)</font></a> | <a href="classes.html"><font color="#004faf">所有的類(lèi)</font></a> | <a href="mainclasses.html"><font color="#004faf">主要的類(lèi)</font></a> | <a href="annotated.html"><font color="#004faf">注釋的類(lèi)</font></a> | <a href="groups.html"><font color="#004faf">分組的類(lèi)</font></a> | <a href="functions.html"><font color="#004faf">函數(shù)</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國(guó)際化</h1> <p> <!-- index internationalization --><a name="internationalization"></a><p>應(yīng)用的國(guó)際化就是使應(yīng)用成為能被非本國(guó)的人使用的過(guò)程。<p>有的情況下,國(guó)際化很簡(jiǎn)單,例如,使一個(gè)US應(yīng)用可被Australian或者British用戶(hù)理解,工作可能少于幾個(gè)拼寫(xiě)修正。但是使一個(gè)US應(yīng)用可以被Japanese用戶(hù)使用,或者一個(gè)Korean應(yīng)用可被German用戶(hù)使用,就會(huì)需要軟件不僅工作于不同語(yǔ)言下,還要使用不同的輸入技術(shù)、字符編碼和表達(dá)習(xí)慣。<p>也參見(jiàn)<a href="linguist-manual.html">Qt語(yǔ)言學(xué)家</a>手冊(cè)。<p> <h2>Step by Step</h2><a name="1"></a><p>以Qt來(lái)編寫(xiě)多平臺(tái)國(guó)際化的軟件是一個(gè)和緩的、逐步增加的過(guò)程。你的軟件可以按下面的幾個(gè)階段實(shí)現(xiàn)國(guó)際化:<p> <h3>對(duì)所有用戶(hù)可見(jiàn)的文本使用<a href="qstring.html">QString</a></h3><a name="1-1"></a><p>既然QString內(nèi)部就使用Unicode編碼,那么使用常見(jiàn)的文本處理手段,就可以透徹地處理世界上的每種語(yǔ)言。同時(shí),既然所有向用戶(hù)呈現(xiàn)文本的Qt函數(shù)都把QString作為參數(shù),也就沒(méi)有了char*到QString的轉(zhuǎn)換的時(shí)間開(kāi)銷(xiāo)。<p>在“程序員空間”(例如<a href="qobject.html">QObject</a>的名稱(chēng)和文件格式文本)的字符串不需要使用QString;傳統(tǒng)的char*或者<a href="qcstring.html">QCString</a>類(lèi)就夠用了。<p>你不大可能注意到你在使用Unicode;QString和<a href="qchar.html">QChar</a>就如同早期版本的傳統(tǒng)C中的粗糙的const char*和char。<p> <h3>對(duì)所有文字形式的文本使用<a href="qobject.html#tr">tr()</a></h3><a name="1-2"></a><p>無(wú)論你的程序在哪里對(duì)將會(huì)呈現(xiàn)給用戶(hù)的文本使用了<tt>"quoted text"</tt>,要確保它被<a href="qapplication.html#translate">QApplication::translate</a>()函數(shù)處理過(guò)。其實(shí)做到這一點(diǎn)只需要使用<a href="qobject.html#tr">QObject::tr</a>()。例如,假設(shè)<tt>LoginWidget</tt>是QWidget的一個(gè)子類(lèi):<p> <pre> LoginWidget::LoginWidget() { <a href="qlabel.html">QLabel</a> *label = new <a href="qlabel.html">QLabel</a>( tr("Password:"), this ); ... }</pre> <p>這就解決了你可能要寫(xiě)的用戶(hù)可見(jiàn)的字符串的99%。<p>如果這些quoted text不是在<a href="qobject.html">QObject</a>子類(lèi)的成員函數(shù)中,可以使用一個(gè)適當(dāng)?shù)念?lèi)的tr()函數(shù),或者直接使用<a href="qapplication.html#translate">QApplication::translate</a>()函數(shù):<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-><a href="qapplication.html#translate">translate</a>("LoginWidget", "Password:"), logwid ); }</pre><p>如果你需要不在函數(shù)里的可翻譯文本,有兩個(gè)宏可以幫忙:QT_TR_NOOP()和QT_TRANSLATE_NOOP()。它們僅僅標(biāo)示出文本,以便于被下面描述的<em>lupdate</em>工具提取。宏擴(kuò)展為只是文本(沒(méi)有上下文)。<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-><a href="qapplication.html#translate">translate</a>( "FriendlyConversation", greeting_strings[greet_type] ); }</pre><p>如果你使用定義的宏QT_NO_CAST_ASCII編譯你的軟件,從而關(guān)閉了從const char*到<a href="qstring.html">QString</a>的自動(dòng)轉(zhuǎn)換,你很可能會(huì)捕捉到你錯(cuò)過(guò)的字符串。更多信息參見(jiàn)<a href="qstring.html#fromLatin1">QString::fromLatin1</a>()。關(guān)閉這個(gè)轉(zhuǎn)換會(huì)使編程有點(diǎn)兒麻煩。<p>如果你的源碼語(yǔ)言使用Latin-1之外的字符集,你會(huì)發(fā)現(xiàn)<a href="qobject.html#trUtf8">QObject::trUtf8</a>()比<a href="qobject.html#tr">QObject::tr</a>()更好用,因?yàn)閠r()依賴(lài)于<a href="qapplication.html#defaultCodec">QApplication::defaultCodec</a>(),這使它比QObject::trUtf8()更脆弱。<p> <h3>對(duì)于加速鍵值(Accelerator value)使用<a href="qkeysequence.html">QKeySequence</a>()</h3><a name="1-3"></a><p>加速鍵值,例如Ctrl+Q或者Alt+F,也需要翻譯。如果你的應(yīng)用給“Quit”直接編碼(hardcode)為<tt>CTRL+Key_Q</tt>,翻譯者就不能重載它了。正確的習(xí)慣用法是<p> <pre> <a href="qpopupmenu.html">QPopupMenu</a> *file = new <a href="qpopupmenu.html">QPopupMenu</a>( this ); file-><a href="qmenudata.html#insertItem">insertItem</a>( tr("&Quit"), this, SLOT(quit()), QKeySequence(tr("Ctrl+Q", "File|Quit")) );</pre><p> <h3>對(duì)簡(jiǎn)單參數(shù)使用<a href="qstring.html#arg">QString::arg</a>()</h3><a name="1-4"></a><p>對(duì)于國(guó)際化的文本,在字符串中類(lèi)似printf()風(fēng)格的插入?yún)?shù)一般是不好的選擇,因?yàn)橛袝r(shí)候有必要在翻譯時(shí)改變參數(shù)的順序。不管怎樣,QString::arg()函數(shù)為參數(shù)替換提供了一種簡(jiǎn)單的途徑:<pre> void FileCopier::showProgress( int done, int total, const <a href="qstring.html">QString</a>& current_file ) { label.setText( tr("%1 of %2 files copied.\nCopying: %3") .arg(done) .arg(total) .arg(current_file) ); }</pre><p> <h3>創(chuàng)作譯本</h3><a name="1-5"></a><p>在應(yīng)用中通篇使用tr()之后,你就可以開(kāi)始創(chuàng)作程序中用戶(hù)可見(jiàn)的文本的譯本了。<p> <a href="linguist-manual.html">Qt語(yǔ)言學(xué)家</a>手冊(cè)提供了關(guān)于Qt翻譯工具、<em>Qt語(yǔ)言學(xué)家</em>、<em>lupdate</em>和<em>lrelease</em>的進(jìn)一步信息。<p>Qt應(yīng)用的翻譯過(guò)程分為三步:<p> <ol type=1><li>運(yùn)行<em>lupdate</em>,以提取出Qt應(yīng)用的C++源代碼中的可翻譯文本,會(huì)產(chǎn)生一個(gè)給翻譯者的信息文件(.ts文件)。該工具識(shí)別出tr()結(jié)構(gòu)和上面描述的QT_*_NOOP宏,產(chǎn)生.ts文件(通常每種語(yǔ)言一個(gè))。<li>使用Qt語(yǔ)言學(xué)家提供.ts文件中源文本的譯文。既然.ts文件是XML格式,你也可以手工編輯它們。<li>運(yùn)行<em>lrelease</em>,以從.ts文件中得到只適用于最后使用的輕量級(jí)的信息文件(.qm文件)。你可以把.ts文件看成“源文件”,把.qm文件看成“目標(biāo)文件”。翻譯者編輯的是.ts文件,可是你的應(yīng)用的用戶(hù)只需要.qm文件。這兩種文件都是平臺(tái)和地區(qū)(locale)無(wú)關(guān)的。</ol><p>典型地,你將對(duì)應(yīng)用地每個(gè)發(fā)表版本重復(fù)這幾步。<em>lupdate</em>工具會(huì)盡力重用以前的發(fā)表版本的譯文。<p>在你運(yùn)行<em>lupdate</em>之前,你應(yīng)該準(zhǔn)備一個(gè)項(xiàng)目文件。這是一個(gè)項(xiàng)目文件(.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>當(dāng)你運(yùn)行<em>lupdate</em>或者<em>lrelease</em>時(shí),你必須以命令行參數(shù)給出項(xiàng)目文件的名稱(chēng)。<p>在本例中,支持四種語(yǔ)言:Danish、Finnish、Norwegian和Swedish。如果你使用qmake(或者tmake),你一般不需要給<em>lupdate</em>的附加項(xiàng)目文件;只要你加上TRANSLATIONS條目,你的qmake項(xiàng)目文件就會(huì)正常工作。<p>在應(yīng)用中,你必須使用<a href="qtranslator.html#load">QTranslator::load</a>()來(lái)裝載對(duì)應(yīng)用戶(hù)語(yǔ)言的譯文文件,再使用<a href="qapplication.html#installTranslator">QApplication::installTranslator</a>()來(lái)安裝它們。<p>如果你一直使用以前的Qt工具(findtr、msg2qm和mergetr),可以使用<em>qm2ts</em>來(lái)轉(zhuǎn)換你以前的.qm文件。<p> <em>語(yǔ)言學(xué)家</em>、<em>lupdate</em>和<em>lrelease</em>安裝在<tt>$QTDIR/bin</tt>。在Qt語(yǔ)言學(xué)家中點(diǎn)擊Help|Manual,就可訪(fǎng)問(wèn)用戶(hù)手冊(cè),它包含了讓你起步的演示教程。
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -