QT在QML下實現多國語言翻譯
在某些情況下,我們使用QT開發的介面需要完成多國語言的翻譯工作。QT在這方面其實已經給出了支援,本文主要講述在使用QML編寫介面的情況下如何實現多國語言的翻譯。
若要實現QT多國語言翻譯,必須要搞清楚兩個檔案: xx.ts和xx.qm檔案。xx.ts是翻譯的原始檔,這個檔案其實是一個xml檔案,裡面寫的是源語言和對應的翻譯語言。xx.qm檔案是最終的釋出檔案,也是應用程式執行時需要載入的外部檔案。下面看一下兩種檔案的內容:
xx.ts可以使用ultraEdit開啟,注意不要轉換為DOC格式....,可以看到如下:
其中,每一對<context></context>之間為一個.qml或.cpp所包含的所有字串。兩個messag之間為一個翻譯區,包含源語言文字和翻譯後語言文字。<source>為源語言(此處為英語),<translation type="vanished"> 為要翻譯的語言(此處為西班牙語)。若需要增加新的翻譯語句,只需要在增加一對<message>xxxx</message>,最簡單的方法是複製一對<message>xxxx</message>之間的內容,然後修改源字串內容和修改後字串內容。
xx.qm檔案為二進位制檔案,此處不再展示。
下面重點講一下使用QT完成翻譯工作的步驟:
1. QML中所有要翻譯的字串地方需要使用qsTr(字串),Widget中應該使用tr(字串)。只要這樣才能被QT的翻譯工具所識別。
2. 使用命令lupdate生成.ts檔案。lupdate會掃描程式中用qsTr()和tr()所指定的字串,並寫入到相應的.ts檔案中。此處需注意:使用QTCreator自帶的工具-外部-QT語言家-更新翻譯功能可能不好用,無法正確的生成完備的.ts檔案。(可以下載最新的QT版本試試)。建議使用命令列lupdate命令來實現。windows下的lupdate命令一般位於mingw下(使用QTCreator自帶的工具-外部-QT語言家-更新翻譯可以找到lupdate所在的路徑)。命令使用方式如下:
Linux下: 使用./lupdate test.pro -ts cn.ts, 則會掃描整個工程,並把對應的字串寫入cn.ts檔案中。
windows下,使用lupdate test1.qml test2.qml test3.qml -ts cn.ts,則會掃描test1.qml,test2.qml,test3.qml,將三個原始檔中的字串寫入cn.ts檔案中。windows下對pro檔案可能不識別,此時需要對每一個.qml檔案單獨操作,lupdate預設可以追加填寫cn.ts檔案。
lupdate, test.pro 與 test1.qml的路徑必須要正確,否則找不到對應的命令或檔案。
3. 手動進行翻譯。第2步操作只是將程式中待翻譯的字串全部彙集到一個xx.ts檔案中。還需要對xx.ts中的每一個字串進行手動翻譯。畢竟自動翻譯的功能太過強大,目前尚不具備條件。此處有兩種方法:
(1) 使用QT的自帶的工具進行翻譯。使用QT的工具:Linguist。此工具可以開啟ts檔案,進行逐一翻譯。如下圖所示:源文是程式中掃描到的字串,譯文是需要自己手動翻譯後填寫翻譯的結果。此處需逐一將待翻譯的內容翻譯完成並填寫至譯文處並進行儲存。
(2) 使用ultraEdit開啟xx.ts檔案(注意不要轉換格式),填寫所有的<translation type="vanished"></translation>之間的內容。
4. 生成qm檔案:使用命令列 lrelease cn.ts -qm cn.qm。或者直接使用QTCreator的工具-QT語言家-lrease進行釋出生成。會自動在當前程式路徑下生成cn.qm檔案。
5. 在QT工程的Pro檔案中增加TRANSLATIONS += cn.ts。 cn.ts只是示例,你可以改成你自己的.ts檔名。
6. 在main函式中使用如下語句進行載入,注意此時載入的是外部cn.qm檔案,如下所示:
QTranslator tsor;
tsor.load("cn.qm");
app.installTranslator(&tsor);
注意事項:
必須在main函式中的load qml檔案之前載入翻譯檔案cn.qm,否則無法進行翻譯。如果qml介面已經執行起來,然後需要翻譯。除了重新載入翻譯檔案外,需重新載入qml檔案,否則無法完成翻譯。
7. 釋出可執行程式時,記得將xx.ts與xx.qm一併與可執行程式釋出,否則程式找不到對應的檔案,無法完成翻譯工作。另外,建議使用絕對路徑查詢xx.qm檔案,因為你設定自啟動程式時,依靠當前路徑是找不到cn.qm的。