动态重新翻译 Qt Quick UI
Dynamically retranslate Qt Quick UI
我想动态重新翻译 Qt Quick GUI 字符串。
有intrusive trick重新翻译受影响的字符串属性,其更改通知无法集中。
是否有可能使 qsTr
(和其他人)成为 return string
-like 对象,其行为与 string
完全相同,但也表现得像全局属性连接到常见的 "valueChanged" 信号(当 QCoreApplication
中的 QEvent::LanguageChange
发生时,我想发出)。
我想我可以使用 Loader
的 active
属性 的抽动,它包含整个顶级 GUI 元素来重新翻译所有用户可见的字符串,但是这种方法导致所有项目和组件的状态丢失,连接到 Loader
并且与我完全重新启动应用程序没有区别。
是否可以创建这样的 myQsTr
函数?
您可以选择使用自己的 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
都会导致绑定表达式重新计算并刷新当前语言字典中的值。
如果找不到翻译,此解决方案还将回退到默认语言字符串。您可以轻松自定义行为,并且不依赖任何外部工具。干净、简单、独立且完全在您的控制之下。
从 Qt 5.10 开始,您可以调用 QQmlEngine::retranslate() after you have installed a new translator with QCoreApplication::installTranslator(),以确保您的用户界面显示最新的翻译。
我想动态重新翻译 Qt Quick GUI 字符串。
有intrusive trick重新翻译受影响的字符串属性,其更改通知无法集中。
是否有可能使 qsTr
(和其他人)成为 return string
-like 对象,其行为与 string
完全相同,但也表现得像全局属性连接到常见的 "valueChanged" 信号(当 QCoreApplication
中的 QEvent::LanguageChange
发生时,我想发出)。
我想我可以使用 Loader
的 active
属性 的抽动,它包含整个顶级 GUI 元素来重新翻译所有用户可见的字符串,但是这种方法导致所有项目和组件的状态丢失,连接到 Loader
并且与我完全重新启动应用程序没有区别。
是否可以创建这样的 myQsTr
函数?
您可以选择使用自己的 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
都会导致绑定表达式重新计算并刷新当前语言字典中的值。
如果找不到翻译,此解决方案还将回退到默认语言字符串。您可以轻松自定义行为,并且不依赖任何外部工具。干净、简单、独立且完全在您的控制之下。
从 Qt 5.10 开始,您可以调用 QQmlEngine::retranslate() after you have installed a new translator with QCoreApplication::installTranslator(),以确保您的用户界面显示最新的翻译。