记录QT6.3使用CMake完成国际化
参照网上和教材的例子,产生的ts文件一直只有一个空的框架,无法在linguist中加载。绕了很多路,最后才发现是有编译项目没勾选。
第一步:在CMake文件中添加内容,参考https://doc.qt.io/qt-6/qtlinguist-cmake-qt-add-translations.html。
qt_add_lupdate(TestHello TS_FILES TestHello.ts)
qt_add_lrelease(TestHello
TS_FILES TestHello.ts
QM_FILES_OUTPUT_VARIABLE qm_files)
qt_add_resources(TestHello "translations"
PREFIX "/"
BASE "${CMAKE_CURRENT_BINARY_DIR}"
FILES "${qm_files}")
以上3条命令实际可以用以下命令替代,但qt_add_translations有可能会变更,所以不采用。
qt_add_translations(TestHello TS_FILES TestHello.ts)
添加完以上内容后,会在源代码目录下生成ts文件TestHello.ts,在编译目录生成qm文件TestHello.qm。 但这时的TestHello.ts只有一个框架,无法在linguist中加载。
第二步: 勾选lupdate 和 lrelease目标
在编译的”概要"里面有显示 :
CMake Warning at D:/Qt/6.3.0/mingw_64/lib/cmake/Qt6LinguistTools/Qt6LinguistToolsMacros.cmake:241 (message):
Translation file 'E:/QT/QT6/CH15/TestHello/TestHello.ts' does not exist.
Consider building the target 'TestHello_lupdate' to create an initial
version of that file.
Call Stack (most recent call first):
D:/Qt/6.3.0/mingw_64/lib/cmake/Qt6LinguistTools/Qt6LinguistToolsMacros.cmake:371 (qt6_add_lrelease)
CMakeLists.txt:54 (qt_add_lrelease)
这里提示TestHello_lupdate目标没有编译。
在项目->Build->Build的步骤->Targets中勾选TestHello_lupdate和TestHello_lrelease两个目标后,再次Build, 就会在编译输出中出现令人期待的结果:
[1/5 3.7/sec] cmd.exe /C "cd /D E:\QT\QT6\CH15\build-TestHello-Desktop_Qt_6_3_0_MinGW_64_bit-Debug && D:\Qt\Tools\CMake_64\bin\cmake.exe -DIN_FILE=E:/QT/QT6/CH15/build-TestHello-Desktop_Qt_6_3_0_MinGW_64_bit-Debug/.lupdate/TestHello_project.cmake -DOUT_FILE=E:/QT/QT6/CH15/build-TestHello-Desktop_Qt_6_3_0_MinGW_64_bit-Debug/.lupdate/TestHello_project.json -P D:/Qt/6.3.0/mingw_64/lib/cmake/Qt6LinguistTools/GenerateLUpdateProject.cmake && D:\Qt\6.3.0\mingw_64\bin\lupdate.exe -project E:/QT/QT6/CH15/build-TestHello-Desktop_Qt_6_3_0_MinGW_64_bit-Debug/.lupdate/TestHello_project.json"
Updating '../TestHello/TestHello.ts'...
Found 3 source text(s) (3 new and 0 already existing)
第三步: 在linguist中修改ts文件
这个时候再用linguist加载生成的TestHello.ts文件,就可以正常翻译了。再次编译就会使用修改后的ts文件。
第四处:在main.cpp中安装qm文件
最后,在main.cpp中安装qm文件即可。
#include <QApplication>
#include <QTranslator>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator *tr = new QTranslator;
bool test = tr->load(":/TestHello.qm");
qDebug()<<test;
a.installTranslator(tr);
MainWindow w;
w.show();
return a.exec();
}
如果没有将qm文件作为资源编译到项目中,则需要在QTranslator的load中指定qm方件的绝对路径。其它更多用法参考https://doc.qt.io/qt-6/qtlinguist-cmake-qt-add-translations.html。