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會移除某個翻譯文件。但是不從系統中刪除他。也就是指針不刪除,你要自己刪除。