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

use*_*339 5 c++ qt blackberry-10

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

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

小智 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();
}
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,您也可以查看此帖子


小智 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

前任:

Label {
    text: qsTrId("header1")  + Retranslate.onLanguageChanged
}
Run Code Online (Sandbox Code Playgroud)

每次翻译器发生变化时,这都会更新上述 lavel 的字符串。有关更多信息,请参阅:http ://developer.blackberry.com/cascades/reference/bb_cascades_qmlretranslate.html

  • 对于 Qt &gt;=5.10 使用来自 Musa 的更简单的[答案](/sf/answers/3410333461/) (2认同)