在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ C/ 國(guó)際化(下)
Qt 容器和算法拾遺
自定義 model 之一
反走樣
Hello, world!
Qt 容器類之關(guān)聯(lián)存儲(chǔ)容器
QStringListModel
拖放技術(shù)之一
狀態(tài)欄
QTreeWidget
拖放技術(shù)之二
通用算法
event()
Qt 學(xué)習(xí)之路(18): Qt 標(biāo)準(zhǔn)對(duì)話框之 QInputDialog
Qt 容器類之遍歷器和隱式數(shù)據(jù)共享
QListWidget
Meta-Object 系統(tǒng)
事件接收與忽略
Qt 學(xué)習(xí)之路(tip): parent 參數(shù)
Qt 標(biāo)準(zhǔn)對(duì)話框之 QColorDialog
QPainter(續(xù))
國(guó)際化(下)
漸變填充
自定義委托
創(chuàng)建 shared library
model-view 架構(gòu)
Graphics View Framework
自定義拖放數(shù)據(jù)對(duì)象
QSortFilterProxyModel
國(guó)際化(上)
組件布局
自定義 Model 之三
事件過(guò)濾器
QDirModel
Hello, world!(續(xù))
Qt 標(biāo)準(zhǔn)對(duì)話框之 QFileDialog
自定義 model 之二
深入了解信號(hào)槽
坐標(biāo)變換
剪貼板操作
QTableWidget
QByteArray 和 QVariant
創(chuàng)建一個(gè)對(duì)話框(下)
Qt 學(xué)習(xí)之路(32): 一個(gè)簡(jiǎn)易畫板的實(shí)現(xiàn)(Graphics View)
文本文件讀寫
自定義事件
編寫跨平臺(tái)的程序
MainWindow
初探信號(hào)槽
Qt 學(xué)習(xí)之路(17): Qt 標(biāo)準(zhǔn)對(duì)話框之 QMessageBox
繪圖設(shè)備
菜單和工具條(續(xù))
二進(jìn)制文件讀寫
QString
事件(event)
菜單和工具條
QPainter
Qt 容器類之順序存儲(chǔ)容器
進(jìn)程間交互
API 文檔的使用
創(chuàng)建一個(gè)對(duì)話框(上)
一個(gè)簡(jiǎn)易畫板的實(shí)現(xiàn)(QWidget)

國(guó)際化(下)

上次說(shuō)了國(guó)際化的過(guò)程,現(xiàn)在來(lái)看一下具體的國(guó)際化的相關(guān)代碼。

在代碼中,我們使用 tr()將需要翻譯的字符串標(biāo)記出來(lái)。lupdate 工具就是提取出 tr()函數(shù)中的相關(guān)字符串。tr()函數(shù)是 QObject 類的一個(gè) static 函數(shù),其簽名如下:


static QString tr(const char *sourceText, const char *comment = 0, int n = -1); 

雖然我們只傳了一個(gè)參數(shù),但是實(shí)際上 tr()函數(shù)是接受3個(gè)參數(shù)的。第一個(gè)參數(shù)是我們需要翻譯的文字,如果使用 qm 文件有對(duì)應(yīng)的字符串,則使用對(duì)應(yīng)的字符串進(jìn)行替換,否則將顯示 sourceText 參數(shù)指定的字符串。第二個(gè)參數(shù)是一個(gè)注釋,用于解釋前面的 sourceText 的含義,比如 table 一詞既可以當(dāng)做桌子翻譯,又可以當(dāng)成表格翻譯,這時(shí)你就需要提供這個(gè)注釋?;蛟S你會(huì)問(wèn),使用翻譯工具的時(shí)候不是有源代碼嗎?問(wèn)題是,有可能人家不使用這個(gè)翻譯工具,而使用別的工具,這樣就不能保證會(huì)有這個(gè)源代碼的預(yù)覽;并且,你的程序不一定必須要發(fā)布源代碼的;翻譯人員往往只得到我們導(dǎo)出的 ts 文件,如果你加上注釋,就可以方便翻譯人員進(jìn)行翻譯。最后一個(gè)參數(shù) n 用于指定字符串是否為復(fù)數(shù)。我們知道,很多語(yǔ)言,比如英語(yǔ),很多名詞的單復(fù)數(shù)形式是不相同的,為了解決這個(gè)問(wèn)題,Qt 在 tr()函數(shù)中提供了一個(gè)參數(shù) n。請(qǐng)看如下代碼:


int n = messages.count(); 
showMessage(tr("%n message(s) saved", "", n)); 

對(duì)于 n 的值的不同,Qt 會(huì)翻譯成不同的文字,例如:

n 翻譯結(jié)果
0 0 message saved
1 1 message saved
2 2 messages saved
5 5 messages saved

tr()函數(shù)是 QObject 的函數(shù),如果你的類不是繼承自 QObject,就不能直接使用 tr()函數(shù)。比如我們?cè)?main()函數(shù)中希望增加一句設(shè)置 MainWindow 的 title 的代碼:


w.setWindowTitle(tr("MyApp")); 

直接這樣寫是無(wú)法通過(guò)編譯的,因?yàn)?main()函數(shù)是全局函數(shù),所以這個(gè) tr()是找不到的。解決辦法一是顯式地調(diào)用 QObject 的函數(shù):


w.setWindowTitle(QObject::tr("MyApp")); 

或者,你可以使用 QCoreApplication 的 translate()函數(shù)。你一定還記得,我們的 main()函數(shù)的第一句總是 QApplication app;,其實(shí),QApplication 就是 QCoreApplication 的子類。所以,我們也能這樣去寫:


w.setWindowTitle(app.translate("MyApp"));

由于在 Qt 程序中,QCoreApplication 是一個(gè)單例類,因此,Qt 提供了一個(gè)宏 qApp,用于很方便的訪問(wèn) QCoreApplication 的這個(gè)單例。所以,在其他文件中,我們也可以直接調(diào)用 qApp.translate()來(lái)替換 tr(),不過(guò)這并沒(méi)有必要。

如果你的翻譯文本中包含了需要?jiǎng)討B(tài)顯示的數(shù)據(jù),比如我們上次代碼中的


QMessageBox::information(NULL, tr("Path"), tr("You selected\n%1").arg(path)); 

這句你當(dāng)然可以寫成


QMessageBox::information(NULL, tr("Path"), "You selected\n" + path); 

但這種連接字符串的方式就不能夠使用 tr()函數(shù)了!因此,如果你需要像 C 語(yǔ)言的 printf()函數(shù)這種能夠格式化輸出并且需要翻譯時(shí),你必須使用我們例子中的%1加 arg()函數(shù)!

如果你想要翻譯函數(shù)外部的字符串,你需要使用兩個(gè)宏 QT_TR_NOOP()和 QT_TRANSLATE_NOOP()。前者是用來(lái)翻譯一個(gè)字符串,后者可以翻譯多個(gè)字符串。它們的使用方法如下:


QString FriendlyConversation::greeting(int type) 
 { 
         static const char *greeting_strings[] = { 
                 QT_TR_NOOP("Hello"), 
                 QT_TR_NOOP("Goodbye") 
         }; 
         return tr(greeting_strings[type]); 
 } 
static const char *greeting_strings[] = { 
         QT_TRANSLATE_NOOP("FriendlyConversation", "Hello"), 
         QT_TRANSLATE_NOOP("FriendlyConversation", "Goodbye") 
 }; 

 QString FriendlyConversation::greeting(int type) 
 { 
         return tr(greeting_strings[type]); 
 } 

 QString global_greeting(int type) 
 { 
         return qApp->translate("FriendlyConversation", 
                                                        greeting_strings[type]); 
 }

好了,以上就是我們用到的大部分函數(shù)和宏。除此之外,如果我們運(yùn)行前面的例子就會(huì)發(fā)現(xiàn),實(shí)際上我們只是翻譯了菜單等內(nèi)容,打開(kāi)文件對(duì)話框并沒(méi)有被翻譯。原因是我們沒(méi)有給出國(guó)際化的信息。那么,怎么才能讓 Qt 翻譯這些內(nèi)建的文字呢?我們要在 main()函數(shù)中添加幾句:


int main(int argc, char *argv[]) 
{ 
        QApplication a(argc, argv); 
        QTranslator qtTranslator; 
        qtTranslator.load("myapp.qm"); 
        a.installTranslator(&qtTranslator); 
        QTranslator qtTranslator2; 
        qtTranslator2.load("qt_zh_CN.qm"); 
        a.installTranslator(&qtTranslator2); 
        MainWindow w; 
        w.resize(800, 600); 
        w.show(); 
        return a.exec(); 
}

我們又增加了一個(gè) QTranslator 對(duì)象。Qt 實(shí)際上是提供了內(nèi)置字符串的翻譯 qm 文件的。我們需要在 Qt 安裝目錄下的 translations 文件夾下找到 qt_zh_CN.qm,然后同前面一樣,將它復(fù)制到 exe 所在目錄?,F(xiàn)在再運(yùn)行一下程序:哈哈已經(jīng)完全變成中文了吧!

至此,我們的 Qt 程序的國(guó)際化翻譯部分就結(jié)束啦!

本文出自 “豆子空間” 博客,請(qǐng)務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/193918