动态重新翻译 Qt Quick UI

Posted

技术标签:

【中文标题】动态重新翻译 Qt Quick UI【英文标题】:Dynamically retranslate 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函数?

【问题讨论】:

【参考方案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 函数的语义来实现所需的行为是完全可行的。

以上是关于动态重新翻译 Qt Quick UI的主要内容,如果未能解决你的问题,请参考以下文章

Qt Quick QML 实例之疯狂数字游戏(QML C++混合编程翻译QSetting )建议收藏

Qt Quick QML 实例之疯狂数字游戏(QML C++混合编程翻译QSetting )建议收藏

Qt Quick 不翻译通过 Loader 加载的组件

Yocto Project Quick Build 翻译

qt lrelease windows 二进制文件?

QT的动态翻译功能,可能依赖于消息(事件)机制