无法让 Qt/QML 加载我的翻译(i18n)

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

我希望有人能告诉我我在这里做错了什么,但我有一个示例项目,我尝试使用 qsTrIds 进行翻译,并且我在弄清楚为什么我的翻译无法正确加载时遇到问题- QML 对话框元素仅显示 qsTrId,例如“press-me”和“hello-world”,而不是翻译后的文本。

来源:https://github.com/StumpDragon/QtExampleApp

使用 Visual Studio 2022 社区和 Qt 6.7

我已经在项目上运行了配置,并编辑了翻译文件,然后运行:

cmake --build ..\build-QtExampleApp-Desktop_Qt_6_7_0_MSVC2019_64bit-Debug\ --target update_translations

cmake --build ..\build-QtExampleApp-Desktop_Qt_6_7_0_MSVC2019_64bit-Debug\ --target release_translations

知道我哪里可能出错吗?

在这里,我对我已经完成的一个翻译进行硬编码 - _en(如果我使用注释掉的 foreach 循环,我的系统默认使用 en-US。我没有这样的翻译 - Qt 默认是重新映射 _en 吗?

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

    QGuiApplication app(argc, argv);

    QTranslator translator;
    if ( translator.load(":/i18n/QtExampleApp_en") ) {
        QCoreApplication::installTranslator(&translator);
    }
    /*const QStringList uiLanguages = QLocale::system().uiLanguages();
    for (const QString &locale : uiLanguages) {
        const QString baseName = "QtExampleApp_" + QLocale(locale).name();
        if (translator.load(":/i18n/" + baseName)) {
            app.installTranslator(&translator);
            break;
        }
    }*/


    QQmlApplicationEngine engine;
    const QUrl url(u"qrc:/qt/qml/Main/main.qml"_qs);
    QObject::connect(
        &engine,
        &QQmlApplicationEngine::objectCreated,
        &app,
        [url](QObject *obj, const QUrl &objUrl) {
            if (!obj && url == objUrl)
                QCoreApplication::exit(-1);
        },
        Qt::QueuedConnection);

    engine.addImportPath(QCoreApplication::applicationDirPath() + "/qml");
    engine.addImportPath(":/");



    engine.load(url);

    if (engine.rootObjects().isEmpty()) {
        return -1;
    }

    return app.exec();
}

CMakeLists.txt 位:

qt_add_translations(TARGETS QtExampleApp
    TS_FILE_DIR i18n
)
c++ qt qml internationalization
1个回答
0
投票

您的加载翻译器应该如下所示:

    QTranslator translator;
    if ( translator.load(QLocale(), "QtExampleApp", QLatin1String("_"), QLatin1String(":/i18n")) ) {
        QCoreApplication::installTranslator(&translator);
    }

Qt 将考虑

QLocale()
所反映的系统区域设置并确定要加载哪个翻译。

您还没有做的另一件事是使用带有 lupdate

lrelease
的 Qt 语言学家将“
.ts”编译为“
.qm”。您需要签入
qrc
的文件是
*.qm
文件,而不是源
*.ts
文件。

请熟悉 Qt linguist 以及

QTranslator::load()
的工作原理。

参考资料:

© www.soinside.com 2019 - 2024. All rights reserved.