gpt4 book ai didi

javascript - 在json文件中的文本上使用qsTr()

转载 作者:行者123 更新时间:2023-11-28 00:15:12 25 4
gpt4 key购买 nike

我正在使用qml,我从json文件中获取一些信息,然后显示它。唯一的问题是我想进行国际化。我尝试使用qsTr(),但是我无法弄清楚如何通过从json文件中获取信息来使其工作。这是一个例子:

JSON文件:

{"information" : "Sample Text"}


JavaScript文件

var read = JSON.parse(file)
var info = qsTr(read.information)


但这不起作用,因为我必须直接在 qsTr()中输入一个字符串。那么我有什么办法可以在 info变量上实现国际化?

最佳答案

我最近在从事项目工作时遇到了完全相同的问题,但是我正在为产品编写前端,该产品通过JSON格式的API调用与后端通信。一些面向用户的字符串是通过JSON调用来自后端的。

这个问题发生在两个项目中,一个是我们刚刚更新了API,以允许我请求使用哪种语言,如果要后端正确翻译它们返回的字符串,则需要使用哪种语言。但是,在另一个项目中,这不是一个选项(因为您将它们从文件中解析出来并且没有后端,所以这也不是您的选择),所以我们选择做一些有点棘手的事情,但是它可行。



在我开始讨论之前,我建议一个更安全的方法是仅将id(例如消息代码)存储在文件中,如果要进行翻译,则将实际字符串保留在UI代码中,因为如果最终进行修改,它更易于维护字符串(稍后将对此进行解释)。如果那不是您的选择,请尝试以下操作。



qsTr()函数(或C ++中的tr()函数)采用一个字符串,并使用提供的字符串作为关键字在翻译资源(* .qm)文件中进行查找,以查找翻译版本。这可以与字符串文字或字符串变量一起使用。

假设* .qm文件中存在转换,以下两项将在运行时起作用:

Text { text: qsTr("Hello World"); }
Text {
property string unTranslatedString: "Hello World"
text: qsTr( unTranslatedString )
}


问题在于,用于生成Qt用于国际化的* .ts和* .qm文件的工具lupdate和lrelease无法理解字符串变量。 lupdate会逐行静态地对代码文件进行梳理,并查找qsTr()或tr()方法中包含的所有字符串,并将它们提取到* .ts文件中,该文件是XML文件,翻译人员可以使用它生成列表。应用程序中找到的每个可翻译字符串的翻译数量。这是在未编译的代码上完成的,因此它无法理解变量,因为它无法在运行时知道变量中存储了什么字符串。这就是为什么文档说只能在qsTr()和tr()上使用字符串文字的原因,以及为什么lupdate在遇到使用变量与字符串文字的qsTr()/ tr()语句时会向您发出警告的原因;但是,qsTr()/ tr()将使用存储在变量中的字符串来查找翻译。

上面的代码示例将解决以下问题:因为lupdate无法使它的开头或结尾,字符串“ Sample Text”不会出现在翻译资源文件中,因此qsTr()找不到它的翻译版本,并且默认为“示例文本”。但是,如果只是确保您的* .qm文件包含具有正确上下文的字符串“ Sample Text”的转换,则它将起作用。

为此,您只需要在应用程序中的任何位置(在QML或C ++代码中)添加以下内容:

QT_TR_NOOP("Sample Text");


它的宏需要一个字符串,但不进行翻译查找,它将返回未翻译的字符串。如果只是将其放在项目中的某个位置,则lupdate将选择字符串,它将扫描qsTr(),tr(),QT_TR_NOOP()和其他类似的函数/宏,并将其放入* .ts文件以及所有字符串当您运行lrelease时,*。ts文件将被添加到您的* .qm文件中。 QT_TR_NOOP()宏甚至不需要在运行时由应用程序执行,因为它仅用于确保动态字符串在预编译时添加到翻译文件中。

-另外请注意另一个想法,因为您从文件中读取的内容是,您可以在运行lupdate之后编写脚本或将字符串手动注入* .ts文件,只需确保上下文匹配即可,以下更多内容。

要记住的一件事是,Qt的翻译系统使用上下文来确保如果您在两个不同的视图上使用相同的单词,但在一个视图上具有相同的含义,则在视图2上可以为以下两个单词提供不同的翻译一些基于语言的语言。使用qsTr()/ tr()时,将使用类名称自动定义上下文。因此,如果您的QML代码位于一个文件中,而您将QT_TR_NOOP()宏放入另一个文件中,则它们将具有不同的上下文,这将导致您的代码无法正常工作,它们是相同的字符串,但处于不同的上下文中。要显式设置给定字符串的上下文,请使用QT_TRANSLATE_NOOP()和qsTranslate()。

例:

QT_TRANSLATE_NOOP("MyDynamicStringsContext", "Sample Text")

var read = JSON.parse(file)
var info = qsTranslate("MyDynamicStringsContext", read.information)


现在,由于所有这些操作都是静态完成的,因此您也不能对上下文字符串使用变量,它必须是字符串文字,但是这样做是要确保字符串“ Sample Text”出现在* .ts文件中,您的翻译人员可以为其提供翻译,并且您可以生成带有lrelease的* .qm文件,该文件将包含键值为“ Sample Text”的“ Sample Text”的翻译后的字符串和上下文“ MyDynamicStringsContext”,以便进行qsTranslate()在运行时找到它。

缺点是,正如我之前所说,这有点骗人。它很容易受到JSON调用另一端完成的字符串更改的影响,从而破坏了翻译;也就是说,如果另一端更改了大小写(是的,区分大小写),或者添加了标点符号或尾随空格,则字符串将不匹配,并且qsTranslate()将无法找到翻译后的字符串。这也意味着您需要提前知道所有可能的字符串,以便确保已为它们提供翻译。因此该示例看起来更像这样:

QT_TRANSLATE_NOOP("MyDynamicStringsContext", "Sample Text")
QT_TRANSLATE_NOOP("MyDynamicStringsContext", "Sample Text ")
QT_TRANSLATE_NOOP("MyDynamicStringsContext", "sample text")
QT_TRANSLATE_NOOP("MyDynamicStringsContext", "Other Possible Sample Text")


var read = JSON.parse(file)
var info = qsTranslate("MyDynamicStringsContext", read.information)


哦,最后,lupdate每次遇到qsTranlate()语句时都会对您尖叫,该语句包装了一个变量,因为它不知道如何处理该变量并将忽略它。可以的,因为您知道已覆盖了所有内容,但最终可能会淹没在警告消息中,并错过一些合法的问题。

因此,它很脆弱,但是如果您对两端有相当多的控制权,但又不能将转换字符串的烦恼推到后端,则它是一种选择。

希望对您有所帮助,并回答您的问题

直到下一次想像力和创意设计

关于javascript - 在json文件中的文本上使用qsTr(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30515351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com