我想动态重新翻译 Qt Quick GUI字符串。
有intrusive trick重新传输受影响的字符串属性,其有关更改的通知无法集中。
是否可以让qsTr
(和其他人)返回string
- 类似于string
的行为,但行为类似于连接到公共“valueChanged”的全局属性信号(我想在QEvent::LanguageChange
QCoreApplication
发生时发出的信号。
我想我可以使用Loader
active
属性的抽搐,其中包含整个顶级GUI元素,使所有用户可见的字符串重新翻译,但这种方法会导致状态丢失连接到Loader
的所有项目和组件,与我完全重启应用程序没有区别。
是否可以创建这样的myQsTr
函数?
答案 0 :(得分:5)
在Qt 5.10中,scheduled将于2017年11月发布,您可以在安装了QQmlEngine::retranslate()的新翻译后致电QCoreApplication::installTranslator(),以确保您的用户界面显示迄今为止的翻译。
答案 1 :(得分:2)
您可以选择使用自己的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
时,这都会导致绑定表达式重新评估并刷新当前语言字典中的值。
如果找不到翻译,此解决方案也将回退到默认语言字符串。您可以轻松自定义行为,而不依赖任何外部工具。干净,简单,独立,完全在您的控制之下。