Ресурсы переводов не добавляются вручную в исполняемый файл
Написал небольшой тестовый проект для демонстрации моей проблемы.
Вся суть в том, что, судя по официальной документации к 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
Ответы (1 шт):
В вызов функции 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})