1 首先所有需要翻譯的文本都必須用tr包裹。
如果是在繼承了某個QOjbect類裏面使用比如 QWidget 等。可以直接使用tr。例如setText(tr("StopCapture"));
如果沒有繼承自QObject就必須帶上QObject 例如 setText(QObject::tr("StopCapture"));
這裏的 StopCapture就是 SourceText
2
生成一個TS文件
在VS當中,點擊QT->Create NewTranslate File 選擇語言 (假設中文 )會生成一個zh.ts文件。
在QCreator中 linux下要先安裝一些tools。sudo apt-get install qttools5-dev-tools
在
xxx.pro文件中
添加
TRANSLATIONS = hm_en.ts hm_zh.ts
填幾個最後就有幾個
然後點擊tools->external->linguist->update translation files 產生ts文件
命令行中輸入linguist 打開ts文件進行編輯
TS文件描述了 這個需要被翻譯的SourceText的位置,信息 等等。並不是真正編譯時需要的文件。
雙擊這個Ts文件會用Qt語言家打開這個文件。
可以看到上下文 原文以及位置
下面的輸入框可以輸入你的 譯文。輸入完畢後。字符串原文前面帶有的疑問號會 變色 表明已經有譯文了。可以為空也沒關係
3將ts文件生成程序需要的 qm文件。qm文件是真正編譯時需要的文件資源
QT語言家中點擊文件->發佈 會在當前目錄中生成zh.qm文件。這個文件就是我們需要的資源文件。通過qrc可以導入這個資源文件。
如果需要產生多個語言。可以再生成一個ts文件。按照前面的步驟生成qm文件。再用qrc導入。
4在代碼中需要實現的語句。
QApplication app(argc, argv);
QTranslator tr; 產生一個翻譯對象
加載翻譯文件
tr.load(":/xxx/zh.qm");
整個程序加載翻譯文件。
app.installTranslator(&tr)
加載後再調用包含tr的語句。每次動態切換或者Load的時候都需要調用 包含tr的地方。使其生效。
setText(QObject::tr("StopCapture"));
installTranslator可以調用多次。安裝多個翻譯文件。翻譯的時候查找是按照安裝的逆順序。就是先安裝的後查找。只要一找到某個符合的翻譯就返回
要保證指針的有效性。installTranslator不會複製這個數據。而是隻使用指針。所以創建完畢不要刪除這個指針。。如果刪除了,不會崩潰。只是app就沒有這個翻譯文件了。
QTranslator析構時會調用app的removeTranslator移除自己喲
installTranslator(zhtr);
installTranslator(entr);
先安裝 zhtr 再entr 查找時先查找entr 如果沒有找到再查找zhtr.在沒有就使用sourceText.
假設 sourceText 也就是源碼中的是 SSS zh翻譯是ZZZ en翻譯是 EEE
查找的順序是 EEE--->ZZZZ---->SSSS 找到任意一個符合的就返回,不再繼續查找。
zh AAA 0 BBB 0
en 0 CCC 0 0
src 0 0 0 DDD
那麼最終翻譯結果是 AAA CCC BBB DDD
removeTranslator會移除某個翻譯文件。但是不從系統中刪除他。也就是指針不刪除,你要自己刪除。