Qt 多語言支持很強大,很好用。html
首先要強調的是程序中須要翻譯的字符串最好都用 tr("message")
這種形式,這裏的 "message" 就是須要翻譯的字符串,統一用英文來表示,也就是說開發過程當中程序的默認語言是英文,c++
開發完成後,用 Qt 多語言工具將程序翻譯成不一樣的語言。app
須要用到的工具就是 Qt 自帶的 lupdate, lrelease, linguist 這3個,不一樣的二進制發佈版本會存放在不一樣的安裝目錄。函數
例如個人編譯器版本是 mingw53_32,那麼它們存放的路徑以下:工具
D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\lupdate.exe D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\linguist.exe D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\lrelease.exe
若是沒有把這個 bin 路徑添加到系統的 PATH 路徑,那麼就須要填寫完整的路徑來啓動可執行文件。ui
tr()
等函數包含的帶翻譯的字符串到一個文本文件 proXXX_zh_CN.ts
中,例如這裏須要翻譯成中文簡體,開發過程當中須要用到此 ts 文件;proXXX_zh_CN.qm
,這個文件纔是應用讀取的翻譯文件,發佈應用程序應當提供這個文件。命令行程序,開發完成後,須要翻譯的字符串就是這一行代碼中的字符串:this
qDebug().noquote() << QObject::tr("hello world") << endl;
翻譯過程,大體步驟以下:命令行
新建一個控制檯應用 helloworld,用 qDebug()
輸出一句話便可。翻譯
這一連串的動做,我用腳本實現了,代碼以下:c++11
:: @ECHO OFF SET LUPDATE_BIN=D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\lupdate.exe SET LINGUIST_BIN=D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\linguist.exe SET PRO_NAME=helloworld.pro SET TS_FILENAME=helloworld_zh_CN.ts START %LUPDATE_BIN% -pro %PRO_NAME% -ts %TS_FILENAME% START %LINGUIST_BIN% %TS_FILENAME% EXIT
功能很簡單,首先設置 lupdate 和 linguist 工具路徑,而後根據項目設置工程的文件名字和須要翻譯的文件名字,而後啓動程序,第一步生成 TS 文件,第二步用 linguist 打開剛剛生成的 TS 文件。
在這個應用中只有一個單詞須要翻譯,示例以下:
這個動做我也用腳本實現了,代碼以下:
:: convert *.ts to *.qm file. SET LRELEASE_BIN=D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\lrelease.exe SET TS_FILENAME=helloworld_zh_CN.ts SET QM_FILENAME=helloworld_zh_CN.qm START %LRELEASE_BIN% %TS_FILENAME% -qm %QM_FILENAME%
這個步驟纔是重點,劃分爲如下幾個小步驟:
#include <QTranslator>
,注意在 PRO 文件中添加這一句話 TRANSLATIONS = helloworld_zh_CN.ts
QTranslator translator_zh_CN
示例,而後加載QM文件,相關代碼以下:QTranslator translator_zh_CN; // [1] tries to load a file called helloworld_zh_CN.qm //translator_zh_CN.load("helloworld_zh_CN"); // not work translator_zh_CN.load(":/translations/helloworld_zh_CN");
這裏的 QM 文件我是添加到 QRC 文件中,因此引用的路徑是以 :/prefix/filename
形式。
QRC 文件如何使用之後再說。
app.installTranslator(&translator_zh_CN);
不是本文重點,之後再說。
helloworld.pro 內容以下:
QT -= gui CONFIG += c++11 console CONFIG -= app_bundle # The following define makes your compiler emit warnings if you use # any feature of Qt which as been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ main.cpp # [3] add this file to the project. TRANSLATIONS = helloworld_zh_CN.ts RESOURCES += \ helloworld.qrc
main.cpp 內容以下:
#include <QCoreApplication> // it MUST be included if you want to support multiple languages. #include <QTranslator> #include <QObject> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QTranslator translator_zh_CN; // [1] tries to load a file called helloworld_zh_CN.qm //translator_zh_CN.load("helloworld_zh_CN"); // not work translator_zh_CN.load(":/translations/helloworld_zh_CN"); // [2] install the translator app.installTranslator(&translator_zh_CN); qDebug().noquote() << QObject::tr("hello world") << endl; return app.exec(); }
helloworld.qrc 內容以下:
<RCC> <qresource prefix="/translations"> <file alias="helloworld_zh_CN">helloworld_zh_CN.qm</file> </qresource> </RCC>
最後是調用 lupdate, linguist 和 lrelease 的腳本.
lupdate_helloworld.bat 內容以下:
:: @ECHO OFF SET LUPDATE_BIN=D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\lupdate.exe SET LINGUIST_BIN=D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\linguist.exe SET PRO_NAME=helloworld.pro SET TS_FILENAME=helloworld_zh_CN.ts START %LUPDATE_BIN% -pro %PRO_NAME% -ts %TS_FILENAME% START %LINGUIST_BIN% %TS_FILENAME% EXIT
lrelease_helloworld.bat 內容以下:
:: convert *.ts to *.qm file. SET LRELEASE_BIN=D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\lrelease.exe SET TS_FILENAME=helloworld_zh_CN.ts SET QM_FILENAME=helloworld_zh_CN.qm START %LRELEASE_BIN% %TS_FILENAME% -qm %QM_FILENAME%
歡迎轉載,請註明出處和做者,同時保留聲明。 做者:LinTeX9527 出處:https://www.cnblogs.com/LinTeX9527/p/10988561.html 本博客的文章如無特殊說明,均爲原創,轉載請註明出處。如未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。