簡介
Qt 多語言支援很強大,很好用。
首先要強調的是程式中需要翻譯的字串最好都用 tr("message")
這種形式,這裡的 "message" 就是需要翻譯的字串,統一用英文來表示,也就是說開發過程中程式的預設語言是英文,
開發完成後,用 Qt 多語言工具將程式翻譯成不同的語言。
需要用到的工具就是 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 路徑,那麼就需要填寫完整的路徑來啟動可執行檔案。
三個工具的作用
- lupdate 工具用來提取程式中由
tr()
等函式包含的帶翻譯的字串到一個文字檔案proXXX_zh_CN.ts
中,例如這裡需要翻譯成中文簡體,開發過程中需要用到此 ts 檔案; - linguist 工具會開啟上一步的 ts 檔案,然後讓開發人員翻譯,例如 "hello world" 翻譯成中文,需要填寫對應的單詞表,如果不填寫,那麼就不會產生翻譯,程式最終輸出的就是原始的 "hello world";
- lrelease 工具會把上一步的 ts 檔案轉換為 QM 檔案,例如
proXXX_zh_CN.qm
,這個檔案才是應用讀取的翻譯檔案,釋出應用程式應當提供這個檔案。
一個簡單的 helloworld 程式
命令列程式,開發完成後,需要翻譯的字串就是這一行程式碼中的字串:
qDebug().noquote() << QObject::tr("hello world") << endl;
翻譯過程,大致步驟如下:
- 用預設語言(例如英語)開發應用;
- 應用開發完成,用 lupdate 工具提取待翻譯的字串到 TS 檔案,用 linguist 工具開啟 TS 檔案,翻譯文字;
- 翻譯完成用 lrelease 工具把 TS 檔案轉換為 QM 檔案;
- 程式中載入 QM 檔案,並安裝翻譯物件。
- 打包釋出應用程式。
手把手示例
0. 用預設語言開發應用
新建一個控制檯應用 helloworld,用 qDebug()
輸出一句話即可。
1. 用工具 lupdate 提取待翻譯的字串生成 ts 檔案,並用 linguist 工具開啟並翻譯
這一連串的動作,我用指令碼實現了,程式碼如下:
:: @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 檔案。
在這個應用中只有一個單詞需要翻譯,示例如下:
2. 翻譯完成,用 lrelease 工具把 TS 檔案轉換為 QM 檔案
這個動作我也用指令碼實現了,程式碼如下:
:: 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%
3. 修改程式碼,程式中載入 QM 檔案
這個步驟才是重點,劃分為以下幾個小步驟:
- 標頭檔案包含
#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);
4. 釋出應用程式
不是本文重點,以後再說。
附上原始檔
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
本部落格的文章如無特殊說明,均為原創,轉載請註明出處。如未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。