动态重新翻译Qt Quick UI

时间:2017-09-07 16:50:48

标签: qt qml qt5 translation qtquick2

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

intrusive trick重新传输受影响的字符串属性,其有关更改的通知无法集中。

是否可以让qsTr(和其他人)返回string - 类似于string的行为,但行为类似于连接到公共“valueChanged”的全局属性信号(我想在QEvent::LanguageChange QCoreApplication发生时发出的信号。

我想我可以使用Loader active属性的抽搐,其中包含整个顶级GUI元素,使所有用户可见的字符串重新翻译,但这种方法会导致状态丢失连接到Loader的所有项目和组件,与我完全重启应用程序没有区别。

是否可以创建这样的myQsTr函数?

2 个答案:

答案 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时,这都会导致绑定表达式重新评估并刷新当前语言字典中的值。

如果找不到翻译,此解决方案也将回退到默认语言字符串。您可以轻松自定义行为,而不依赖任何外部工具。干净,简单,独立,完全在您的控制之下。