在我的应用程序中,我需要国际化。假设我已经为不同的语言创建了几个 .ts 文件,例如德语、法语等 - 以及翻译的短语。
现在,假设用户想在运行时更改语言。使用Qt方法不可能吗?
在我的应用程序中,我需要国际化。假设我已经为不同的语言创建了几个 .ts 文件,例如德语、法语等 - 以及翻译的短语。
现在,假设用户想在运行时更改语言。使用Qt方法不可能吗?
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.
您的应用程序中应该有一个 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
您将需要使用LocaleHandler并监听onLanguageChanged
信号。收到后,重新翻译文本,例如myLabel->setText(tr("My label"))
。