Ресурсы переводов не добавляются вручную в исполняемый файл

Написал небольшой тестовый проект для демонстрации моей проблемы.

Вся суть в том, что, судя по официальной документации к 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 шт):

Автор решения: AvidCoder

В вызов функции 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})
→ Ссылка