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