我创建了一个小型测试项目来演示我的问题。
问题的本质是,根据
qt_add_translations
的官方文档,我在下面提供的两个代码示例应该大致相同。而且,根据功能qt_add_lupdate
、qt_add_lrelease
、qt_add_resources
,翻译文件应该添加到可执行文件中。
但是,由于某种原因,当使用
second variant
时,翻译文件不会添加到可执行文件中。
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}
,则
translator.load(":/i18n/translation_ru")
将返回
true
,
而如果您将 BASE
设置为 ${PROJECT_SOURCE_DIR}
,要加载翻译文件,您需要编写:
translator.load(":/i18n/cmake-build-debug/translation_ru");
(提供此示例是为了更好地理解)
因此第二个变体的正确代码是:
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" BASE ${CMAKE_CURRENT_BINARY_DIR} FILES ${QM_FILES})