5

在我的应用程序中,我需要国际化。假设我已经为不同的语言创建了几个 .ts 文件,例如德语、法语等 - 以及翻译的短语。

现在,假设用户想在运行时更改语言。使用Qt方法不可能吗?

4

4 回答 4

8

Qt 5.10 中引入的函数 QQmlEngine::retranslate 只是重新评估所有属性绑定。这包括在右侧调用 qsTr() 的所有绑定。

void Settings::switchToLanguage(const QString &language)
{
    if (!m_translator.isEmpty())
        QCoreApplication::removeTranslator(&m_translator);
    m_translator.load(QStringLiteral(":/language_") + language));
    QCoreApplication::installTranslator(&m_translator));
    m_engine->retranslate();
}

For more detail you can check this post too.

于 2018-02-10T09:03:18.630 回答
4

您的应用程序中应该有一个 LocaleHandler 对象并监听 systemLanguageChanged() 信号。

只要用户通过设置菜单更改语言,就会调用此信号。

发生这种情况时,您应该使用以下代码将已安装的字典更新为新字典:

void MyAppSettings::updateLanguage() {
    QString translations = QString("MyApp%1.qm").arg(QLocale().name());
    Application::instance()->removeTranslator(&mTranslator);
    if (mTranslator.load(translations, "app/native/qm")) {
        qDebug() << "LOAD FINISHED";
        Application::instance()->installTranslator(&mTranslator);
    } else {
        qDebug() << "COULD NOT INSTALL TRANSLATIONS " << translations;
    }
}

这将删除当前字典并将其替换为所选系统语言的新字典。

不幸的是,这还不够,因为它不会更新您为应用程序拥有的任何现有屏幕。要更新 QML 中的现有字符串,您应该将 Retranslate.onLanguageChanged 添加到已翻译的字符串中。

前任:

Label {
    text: qsTrId("header1")  + Retranslate.onLanguageChanged
}

每次翻译器更改时,这将更新上述 lavel 的字符串。更多信息请参见:http : //developer.blackberry.com/cascades/reference/bb_ cascades_qmlretranslate.html

于 2013-03-13T19:40:40.673 回答
0

您将需要使用LocaleHandler并监听onLanguageChanged信号。收到后,重新翻译文本,例如myLabel->setText(tr("My label"))

于 2013-03-12T08:34:05.557 回答
0

可以使用 QCoreApplication::installTranslator

于 2013-03-12T14:26:55.107 回答