Qt多國語言QT_TR_NOOP和QT_TRANSLATE_NOOP


文章來源:http://devbean.blog.51cto.com/448512/245063/

 

在代碼中,我們使用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一詞既可以當做桌子翻譯,又可以當成表格翻譯,這時你就需要提供這個注釋。或許你會問,使用翻譯工具的時候不是有源代碼嗎?問題是,有可能人家不使用這個翻譯工具,而使用別的工具,這樣就不能保證會有這個源代碼的預覽;並且,你的程序不一定必須要發布源代碼的;翻譯人員往往只得到我們導出的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(),不過這並沒有必要。
 
如果你的翻譯文本中包含了需要動態顯示的數據,比如我們上次代碼中的
 
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]); 
 }
 
好了,以上就是我們用到的大部分函數和宏。除此之外,如果我們運行前面的例子就會發現,實際上我們只是翻譯了菜單等內容,打開文件對話框並沒有被翻譯。原因是我們沒有給出國際化的信息。那么,怎么才能讓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所在目錄。現在再運行一下程序:哈哈已經完全變成中文了吧!
http://blog.csdn.net/libaineu2004/article/details/40189327


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM