是否可以在运行时更改Qt上的语言

时间:2013-03-12 06:58:37

标签: c++ qt blackberry-10

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

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

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

有关详情,您也可以查看this post

答案 2 :(得分:0)

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

答案 3 :(得分:0)