翻译资源没有手动添加到可执行文件中

问题描述 投票:0回答:1

我创建了一个小型测试项目来演示我的问题。

问题的本质是,根据

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
c++ qt cmake localization resources
1个回答
0
投票

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})
© www.soinside.com 2019 - 2024. All rights reserved.