W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
上次說了國際化的過程,現在來看一下具體的國際化的相關代碼。
在代碼中,我們使用 tr()將需要翻譯的字符串標記出來。lupdate 工具就是提取出 tr()函數中的相關字符串。tr()函數是 QObject 類的一個 static 函數,其簽名如下:
static QString tr(const char *sourceText, const char *comment = 0, int n = -1);
雖然我們只傳了一個參數,但是實際上 tr()函數是接受3個參數的。第一個參數是我們需要翻譯的文字,如果使用 qm 文件有對應的字符串,則使用對應的字符串進行替換,否則將顯示 sourceText 參數指定的字符串。第二個參數是一個注釋,用于解釋前面的 sourceText 的含義,比如 table 一詞既可以當做桌子翻譯,又可以當成表格翻譯,這時你就需要提供這個注釋?;蛟S你會問,使用翻譯工具的時候不是有源代碼嗎?問題是,有可能人家不使用這個翻譯工具,而使用別的工具,這樣就不能保證會有這個源代碼的預覽;并且,你的程序不一定必須要發(fā)布源代碼的;翻譯人員往往只得到我們導出的 ts 文件,如果你加上注釋,就可以方便翻譯人員進行翻譯。最后一個參數 n 用于指定字符串是否為復數。我們知道,很多語言,比如英語,很多名詞的單復數形式是不相同的,為了解決這個問題,Qt 在 tr()函數中提供了一個參數 n。請看如下代碼:
int n = messages.count();
showMessage(tr("%n message(s) saved", "", n));
對于 n 的值的不同,Qt 會翻譯成不同的文字,例如:
n | 翻譯結果 |
---|---|
0 | 0 message saved |
1 | 1 message saved |
2 | 2 messages saved |
5 | 5 messages saved |
tr()函數是 QObject 的函數,如果你的類不是繼承自 QObject,就不能直接使用 tr()函數。比如我們在 main()函數中希望增加一句設置 MainWindow 的 title 的代碼:
w.setWindowTitle(tr("MyApp"));
直接這樣寫是無法通過編譯的,因為 main()函數是全局函數,所以這個 tr()是找不到的。解決辦法一是顯式地調用 QObject 的函數:
w.setWindowTitle(QObject::tr("MyApp"));
或者,你可以使用 QCoreApplication 的 translate()函數。你一定還記得,我們的 main()函數的第一句總是 QApplication app;,其實,QApplication 就是 QCoreApplication 的子類。所以,我們也能這樣去寫:
w.setWindowTitle(app.translate("MyApp"));
由于在 Qt 程序中,QCoreApplication 是一個單例類,因此,Qt 提供了一個宏 qApp,用于很方便的訪問 QCoreApplication 的這個單例。所以,在其他文件中,我們也可以直接調用 qApp.translate()來替換 tr(),不過這并沒有必要。
如果你的翻譯文本中包含了需要動態(tài)顯示的數據,比如我們上次代碼中的
QMessageBox::information(NULL, tr("Path"), tr("You selected\n%1").arg(path));
這句你當然可以寫成
QMessageBox::information(NULL, tr("Path"), "You selected\n" + path);
但這種連接字符串的方式就不能夠使用 tr()函數了!因此,如果你需要像 C 語言的 printf()函數這種能夠格式化輸出并且需要翻譯時,你必須使用我們例子中的%1加 arg()函數!
如果你想要翻譯函數外部的字符串,你需要使用兩個宏 QT_TR_NOOP()和 QT_TRANSLATE_NOOP()。前者是用來翻譯一個字符串,后者可以翻譯多個字符串。它們的使用方法如下:
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]);
}
好了,以上就是我們用到的大部分函數和宏。除此之外,如果我們運行前面的例子就會發(fā)現,實際上我們只是翻譯了菜單等內容,打開文件對話框并沒有被翻譯。原因是我們沒有給出國際化的信息。那么,怎么才能讓 Qt 翻譯這些內建的文字呢?我們要在 main()函數中添加幾句:
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();
}
我們又增加了一個 QTranslator 對象。Qt 實際上是提供了內置字符串的翻譯 qm 文件的。我們需要在 Qt 安裝目錄下的 translations 文件夾下找到 qt_zh_CN.qm,然后同前面一樣,將它復制到 exe 所在目錄?,F在再運行一下程序:哈哈已經完全變成中文了吧!
至此,我們的 Qt 程序的國際化翻譯部分就結束啦!
本文出自 “豆子空間” 博客,請務必保留此出處 http://devbean.blog.51cto.com/448512/193918
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: