在我的应用中,我需要国际化。 假设我为不同语言创建了几个.ts文件,例如, 德语,法语等 - 连同翻译短语。
现在,假设用户想要在运行时更改语言。 是不是可以使用Qt方法?
答案 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)