我编写了一个小型测试项目来演示我的问题。
重点是,根据 的官方文档来看qt_add_translations,我在下面给出的两个代码应该大致相同。qt_add_lupdate那么,根据函数、qt_add_lrelease和的含义qt_add_resources,翻译文件必须添加到可执行文件中。
但由于某种原因,在使用时,второго варианта翻译文件没有添加到可执行文件中。
cmake_minimum_required(VERSION 3.27)
set(CMAKE_CXX_STANDARD 23)
project(TestQtWidgetsProject)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
# Executable
add_executable(${PROJECT_NAME} main.cpp)
# Library
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets)
target_link_libraries(${PROJECT_NAME} Qt::Core Qt::Gui Qt::Widgets)
# Translations
find_package(Qt6 REQUIRED LinguistTools)
# =======================================
# Variant 1
#qt_add_translations(TestQtWidgetsProject
# INCLUDE_DIRECTORIES
# ${PROJECT_SOURCE_DIR}
# TS_FILES
# translation_ru.ts)
# Variant 2
qt_add_lupdate(${PROJECT_NAME} INCLUDE_DIRECTORIES ${PROJECT_SOURCE_DIR} TS_FILES translation_ru.ts)
qt_add_lrelease(${PROJECT_NAME} TS_FILES translation_ru.ts QM_FILES_OUTPUT_VARIABLE QM_FILES)
qt_add_resources(${PROJECT_NAME} "translations" PREFIX "/i18n" FILES ${QM_FILES})
# =======================================
# Dependencies
add_dependencies(${PROJECT_NAME} ${PROJECT_NAME}_lupdate)
add_dependencies(${PROJECT_NAME} ${PROJECT_NAME}_lrelease)
main.cpp
#include <QApplication>
#include <QPushButton>
#include <QTranslator>
int main(int argc, char* argv[]) {
QApplication a(argc, argv);
QTranslator translator;
qDebug() << translator.load(":/i18n/translation_ru");
qDebug() << QApplication::installTranslator(&translator);
QPushButton button(QApplication::tr("Hello, World!") + QApplication::tr(" qwe"), nullptr);
button.resize(200, 100);
button.show();
return QApplication::exec();
}
使用第一个选项时的输出:
true
true
使用第二个选项时的输出:
false
false
在函数调用中,
qt_add_resources您必须添加一个BASE等于计算资源文件别名的文件夹路径的参数。例如,如果
BASE设置等于${CMAKE_CURRENT_BINARY_DIR},则将返回
true,如果设置
BASE等于${PROJECT_SOURCE_DIR},那么为了加载翻译文件,您将必须编写(显示此选项是为了理解示例)
所以第二个选项的正确代码是: