在 main函數中使用 installTranslator,即可讓程序在啓動時自動判斷語言環境,加載相應語言。
至此,靜態語言切換已經完成,下面要做的是動態切換(即不需要重啓軟件)。
基本步驟:
參考:qt 語言家的使用https://www.cnblogs.com/mzy-google/p/5162118.html
參考教程1:Qt翻譯文件結合VS實現語言切換(多語言國際化)https://blog.csdn.net/u012043391/article/details/76684727
參考教程2:在使用Qt5.8完成程序動態語言切換時遇到的問題
一般步驟:
1、創建新的.ts文件
(1)在vs中的工程右鍵——Creat new translation File
(2)選擇要創建的翻譯文件,即完成.ts文件的創建
2、lupdate .ts文件即可獲取需要翻譯的文本,格式如下:
<message>
<location filename="guiforuser.cpp" line="1125"/>
<location filename="guiforuser.cpp" line="1126"/>
<source>上頜牙可見與否</source>
<translation type="unfinished">Upper visible or not</translation>
</message>
source:保存源字符文本,translation 中放入自己的翻譯
幾個問題:
(1)如何自動識別程序中的文本,需要在qstring前加tr(),纔會自動更新在.ts文件中
(2).ts文件亂碼問題:vs的字符集要與.ts字符集一致,一般vs中自動生成的.ts字符集爲utf-8,那麼也需要將相關的源文件字符集設置爲utf-8:
設置方式爲:選中相應文件——File——Advanced Save Options(高級保存選項)——帶符號utf-8(據有些教程說帶符號的編碼更不容易出錯),這裏注意需要選中相應源文件(.cpp,.h等),否則找不到這個選項,如下所示:
這裏注意每個源文件要單獨設置(我沒有找到同一設置的方法),否則設置一個對其他源文件無效,可能還是有亂碼問題。
編碼一致後,就沒有亂碼的問題了
(3)翻譯文本的寫入:a\可以直接用文本方式打開.ts文件直接在相應位置寫入,b\也可以用Qt Linguist打開進行編輯
3、lrelease,生成.qm文件後加載即可
(1).qm文件的加載代碼如下所示:
- QTranslator* translator = NULL;
- //qm文件的加載:
- translator = new QTranslator;
- if (translator->load("test_zh.qm"))
- qApp->installTranslator(translator);
- }
- ui.retranslateUi(this);
(2).qm文件的刪除
- //qm文件的刪除:
- QTranslator* translator = NULL;
- translator = new QTranslator;
- if (translator->load("test_zh.qm"))
- if (translator != NULL)
- {
- qApp->removeTranslator(translator);
- delete translator;
- translator = NULL;
- }
- ui.retranslateUi(this);
(3)注意:如果源文件語言爲中文,加載.qm文件,設置爲英文後,想要換爲中文的兩種方式:
a\創建一箇中文的qm文件後加載
b\刪除加載的英文文件,但是刪除時需要注意translator要是同一個,將其設爲類的私有變量,需要刪除時刪除,否則,重新定義一個變量,加載同一個.qm文件,也刪除不成功(原因??)
幾個問題:
1、動態切換與靜態切換問題
參考:qt多國語言及其動態切換的學習筆記 https://blog.csdn.net/prompty/article/details/51442130
(1)靜態切換:
在main函數中寫上加載翻譯文件語句(在設計文件中也可以,但是要比與ui設計相關的語句先運行)
- QTranslator *translator = new QTranslator;
- if (translator->load("E:/GuiForUser/GuiForUser/guiforuser_en.qm"))
- {
- qApp->installTranslator(translator);
- }
(2)動態切換的問題:
在動態切換中,純代碼設計的語句,比如settext語句,加載翻譯文件切換語言之後,settext設計的ui並沒有改變,需要重寫函數,再加載一次。