【问题标题】:Dynamically retranslate Qt Quick UI动态重新翻译 Qt Quick UI
【发布时间】:2017-09-07 16:50:48
【问题描述】:

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

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

是否可以让qsTr(和其他人)返回类似string 的对象,其行为与string 完全相同,但也类似于连接到常见“valueChanged”信号的全局属性(我想当QCoreApplication 中的QEvent::LanguageChange 发生时发出)。

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

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

【问题讨论】:

    标签: qt qml qt5 translation qtquick2


    【解决方案1】:

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

    【讨论】:

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

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

      【讨论】:

      • 没有 LinguistTools 就很难管理多种语言。在我的情况下,您的方法容易出错 - GUI 太大太复杂。我想使用基于文本 ID 的翻译。
      • 嗯,这是一个非此即彼的场景。语言学家很古老,不支持在不重新加载 gui 的情况下进行动态重新翻译。
      • 请记住,通过简单的正则表达式解析和提取所有翻译并列出所有唯一翻译短语的列表是微不足道的,然后您可以使用更快的基于整数的查找,您可以轻松加载外部字典和所有这些东西。
      • Qt Linguist 允许您提到的所有内容。基于文本 ID 的翻译是 Qt Linguist 的固有特性。导出到许多常见(不仅仅是 TS)甲酸盐 - 也是 lconvert 的一个功能。 Qt Linguist 不仅是提取qsTrtr 和其他东西 - 它还可以指定然后从源代码中的特殊 cmets 中提取多种元信息(例如 //%//~、@987654330 @) 具有不同的含义。不知道我还能从 Qt Linguist 那里得到什么。动态翻译支持不是 Qt Linguist 头疼的问题。它完全在QtGui 方面。
      • 看着this你怎么看?我确信仅仅通过改变 QML 语言中qsTr-like 函数的语义来实现所需的行为是完全可行的。
      猜你喜欢
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多