You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt中qt_add_translations两种写法异常:变体2未嵌入翻译资源

Qt翻译资源加载失败问题:qt_add_translations拆分写法不生效

我创建了测试项目复现问题:根据Qt官方文档,qt_add_translations的两种写法应大致等效,但使用qt_add_lupdate、qt_add_lrelease、qt_add_resources组合配置时,翻译文件未被正确打包进可执行文件,导致加载失败。

CMake配置代码

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();
}

运行结果

  • 使用变体1时输出:
true
true
  • 使用变体2时输出:
false
false

问题原因及解决方法

问题核心在于QM_FILES是qt_add_lrelease生成的目标级变量,CMake配置阶段它还没有实际文件路径值,导致qt_add_resources无法识别待打包的QM文件;同时qt_add_lrelease默认将QM文件生成到构建目录,配置阶段CMake找不到这些未生成的文件,资源编译器自然不会打包。

修复方案

方案1:固定QM文件输出路径

给qt_add_lrelease指定OUTPUT_LOCATION,让QM文件生成到源码目录,确保CMake能识别到:

qt_add_lrelease(${PROJECT_NAME} 
    TS_FILES translation_ru.ts 
    QM_FILES_OUTPUT_VARIABLE QM_FILES
    OUTPUT_LOCATION ${PROJECT_SOURCE_DIR}
)
qt_add_resources(${PROJECT_NAME} "translations" PREFIX "/i18n" FILES ${QM_FILES})

方案2:通过模板生成qrc文件

创建模板文件translations.qrc.in:

<RCC>
    <qresource prefix="/i18n">
        @QM_FILES@
    </qresource>
</RCC>

在CMake中通过configure_file生成实际qrc文件,延迟处理QM文件路径:

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)

# 生成qrc文件
configure_file(translations.qrc.in ${PROJECT_BINARY_DIR}/translations.qrc @ONLY)
# 添加资源
qt_add_resources(${PROJECT_NAME} "translations" FILES ${PROJECT_BINARY_DIR}/translations.qrc)

另外,add_dependencies无需手动添加,qt_add_lupdate和qt_add_lrelease已自动设置目标依赖,保留也不影响。修改后变体2即可像变体1一样正确打包翻译文件,加载返回true。

内容的提问来源于stack exchange,提问作者AvidCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 21:17:16