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

Qt Quick应用中qsTr()字符串无法翻译的问题求助

Qt Quick多语言切换失效问题排查与解决

问题描述

按照官方步骤创建极简多语言Qt Quick应用,构建运行正常,但点击切换语言按钮后,qsTr()包裹的字符串无翻译效果。构建时的Vulkan相关警告、QtQml私有头文件警告不影响运行,但翻译切换完全失效。

系统环境

  • 操作系统:Windows 11
  • Qt版本:6.8.1 MinGW 64-bit
  • 构建命令:
cmake.exe --build C:/Users/<MyName>/Desktop/QT_Projects/multilingual_demo/build/Desktop_Qt_6_8_1_MinGW_64_bit-Debug --target all multilingual_demo_lrelease multilingual_demo_lupdate

核心代码文件

Main.qml

import QtQuick
import QtQuick.Controls

Window {
    width: 640
    height: 480
    visible: true
    title: "Basic Multilingual App" // We choose the app title to be language indifferent

    Component.onCompleted: Qt.uiLanguage = "en" // Set the UI language to English (so that we all start in the same place)

    Column {
        anchors.centerIn: parent
        spacing: 10

        Text {
            id: stringToTranslate
            //: Example string to translate
            text: qsTr("This string must be translated on button click")
        }

        Button {
            id: translateText
            //: Clicking this button translates the text fields
            text: qsTr("Translate text")
            onClicked: {
                Qt.uiLanguage = Qt.uiLanguage === "en" ? "de" : "en" // If UI is English translate to German. Else translate to English
                console.log(Qt.uiLanguage) // Print the UI language to console so we can monitor its changes
            }
        }
    }
}

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    QObject::connect(
        &engine,
        &QQmlApplicationEngine::objectCreationFailed,
        &app,
        []() { QCoreApplication::exit(-1); },
        Qt::QueuedConnection);
    engine.loadFromModule("BasicMultilingualApp", "Main");

    return app.exec();
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.16)

project(BasicMultilingualApp VERSION 0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt6 REQUIRED COMPONENTS Quick LinguistTools)

qt_standard_project_setup(REQUIRES 6.5 I18N_TRANSLATED_LANGUAGES de_DE)

qt_add_executable(appBasicMultilingualApp
    main.cpp
)

qt_add_qml_module(appBasicMultilingualApp
    URI BasicMultilingualApp
    VERSION 1.0
    QML_FILES
        Main.qml
)

qt_add_translations(appBasicMultilingualApp
    TS_FILE_BASE qml
    TS_FILE_DIR i18n
    RESOURCE_PREFIX qt/qml/BasicMultilingualApp/i18n
    LRELEASE_OPTIONS -idbased
)

# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
set_target_properties(appBasicMultilingualApp PROPERTIES
#    MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appBasicMultilingualApp
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

target_link_libraries(appBasicMultilingualApp
    PRIVATE Qt6::Quick
)

include(GNUInstallDirs)
install(TARGETS appBasicMultilingualApp
    BUNDLE DESTINATION .
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

qml_de_DE.ts(i18n文件夹下)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="de_DE">
<context>
    <name>Main</name>
    <message>
        <location filename="../Main.qml" line="19"/>
        <source>This string must be translated on button click</source>
        <extracomment>Example string to translate</extracomment>
        <translation>Diese Zeichenfolge muss beim Klicken auf die Schaltfläche übersetzt werden</translation>
    </message>
    <message>
        <location filename="../Main.qml" line="25"/>
        <source>Translate text</source>
        <extracomment>Clicking this button translates the text fields</extracomment>
        <translation>Text übersetzen</translation>
    </message>
</context>
</TS>

解决方法

1. 修正翻译文件资源路径配置

当前qt_add_translations中的RESOURCE_PREFIX设置可能导致Qt无法正确识别翻译文件路径,移除该参数或调整为简化路径:

qt_add_translations(appBasicMultilingualApp
    TS_FILE_BASE qml
    TS_FILE_DIR i18n
    # 移除RESOURCE_PREFIX,让Qt默认处理路径
    LRELEASE_OPTIONS -idbased
)

2. 手动触发QML组件翻译更新

修改Qt.uiLanguage后,已加载的QML组件不会自动重新翻译,需绑定uiLanguageChanged信号触发组件更新:
修改Main.qml,添加Connections组件:

Window {
    // ... 原有代码 ...

    Component.onCompleted: Qt.uiLanguage = "en"

    Connections {
        target: Qt
        function onUiLanguageChanged() {
            stringToTranslate.retranslate()
            translateText.retranslate()
        }
    }

    // ... 原有代码 ...
}

3. 确保翻译文件正确编译

检查构建目录的i18n文件夹下是否生成了qml_de_DE.qm文件,若未生成,重新执行multilingual_demo_lrelease目标,确保.ts文件被编译为.qm并嵌入资源。

4. 完善CMake语言配置

在qt_standard_project_setup中添加英文作为基础语言,确保默认语言翻译被正确处理:

qt_standard_project_setup(REQUIRES 6.5 I18N_TRANSLATED_LANGUAGES en de_DE)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 08:28:11