我想动态重新翻译 Qt Quick GUI 字符串。
有侵入性技巧可以重新翻译受影响的字符串属性,其有关更改的通知无法集中。
是否可以使
qsTr
(和其他)返回类似string
的对象,其行为与string
完全相同,但也表现得像连接到公共“valueChanged”信号的全局属性(我想发出,当 QEvent::LanguageChange
中的 QCoreApplication
发生时)。
我认为我可以使用
Loader
的 active
属性的抽动,该属性包含整个顶级 GUI 元素来重新翻译所有用户可见的字符串,但这种方法会导致所有项目和组件的状态丢失,连接到Loader
,对我来说与完全重新启动应用程序没有什么不同。
可以创建这样的
myQsTr
功能吗?
从 Qt 5.10 开始,您可以在使用 QCoreApplication::installTranslator() 安装新翻译器后调用 QQmlEngine::retranslate(),以确保您的用户界面显示最新的翻译。
您可以选择使用您自己的 100% QML 解决方案,如下所示:
// Tr.qml
// also put `singleton Tr Tr.qml` in the qmldir file
pragma Singleton
import QtQuick 2.7
QtObject {
function t(s) {
if (lang === eng) return s
var ts = lang[s]
return ts ? ts : s
}
property var lang: eng
readonly property var eng : {
"hello" : "hello",
"goodbye" : "goodbye"
}
readonly property var ger : {
"hello" : "hallo",
"goodbye" : "auf wiedersehen"
}
readonly property var esp : {
"hello" : "hola"
}
}
// test it out
import QtQuick 2.7
import QtQuick.Controls 2.1
import "." // same old singleton bug
ApplicationWindow {
id: main
visible: true
width: 640
height: 480
color: "darkgray"
Column {
Text { text: Tr.t("hello") }
Text { text: Tr.t("goodbye") }
Button { text: "Eng"; onClicked: Tr.lang = Tr.eng }
Button { text: "Ger"; onClicked: Tr.lang = Tr.ger }
Button { text: "Esp"; onClicked: Tr.lang = Tr.esp }
}
}
不同的语言对象就像一个
map<string, string>
,每次更改 lang
都会导致绑定表达式重新计算并刷新当前语言字典中的值。
如果找不到翻译,此解决方案还将回退到默认语言字符串。您可以轻松自定义行为,并且不依赖任何外部工具。干净、简单、独立且完全由您掌控。