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 本博客的文章如无特殊说明,均为原创,转载请注明出处。如未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然保留追究法律责任的权利。