动态重新翻译 Qt Quick UI

问题描述 投票:0回答:2

我想动态重新翻译 Qt Quick GUI 字符串。

侵入性技巧可以重新翻译受影响的字符串属性,其有关更改的通知无法集中。

是否可以使

qsTr
(和其他)返回类似
string
的对象,其行为与
string
完全相同,但也表现得像连接到公共“valueChanged”信号的全局属性(我想发出,当
QEvent::LanguageChange
中的
QCoreApplication
发生时)。

我认为我可以使用

Loader
active
属性的抽动,该属性包含整个顶级 GUI 元素来重新翻译所有用户可见的字符串,但这种方法会导致所有项目和组件的状态丢失,连接到
Loader
,对我来说与完全重新启动应用程序没有什么不同。

可以创建这样的

myQsTr
功能吗?

qt qml qt5 translation qtquick2
2个回答
7
投票

从 Qt 5.10 开始,您可以在使用 QCoreApplication::installTranslator() 安装新翻译器后调用 QQmlEngine::retranslate(),以确保您的用户界面显示最新的翻译。


1
投票

您可以选择使用您自己的 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
都会导致绑定表达式重新计算并刷新当前语言字典中的值。

如果找不到翻译,此解决方案还将回退到默认语言字符串。您可以轻松自定义行为,并且不依赖任何外部工具。干净、简单、独立且完全由您掌控。

© www.soinside.com 2019 - 2024. All rights reserved.