从 JSON 文件解析可翻译的消息

Posted

技术标签:

【中文标题】从 JSON 文件解析可翻译的消息【英文标题】:Parsing translatable messages from JSON file 【发布时间】:2016-05-24 05:51:14 【问题描述】:

我有一个想要本地化的项目。虽然大多数字符串都在源代码中,其中 xgettext/Poedit 在使用本地化函数调用包装时可以轻松找到它们,但有些字符串在纯 JSON 文件中,我将其用于数据存储。因为它只是 JSON,而不是真正的 JS,所以我不能使用函数调用。例如,一个小数据库:

somedb.txt

[
 "id": 1, "name": "Xyz", "local": "AxWhyZzz", /*...*/ ,
/*...*/
]

有没有办法使用 xgettext 从 JSON 文件中提取“本地”值?如果没有,我有什么选择?创建一个包含所有本地值的源文件,并调用_?

当然,我也可以编写自己的解析器,或修改 gettext,但如果可用,我更愿意使用现有的解决方案。

【问题讨论】:

【参考方案1】:

您可以通过 XMLHttpRequest 将它们作为 JS 数组获取:http://codepen.io/KryptoniteDove/post/load-json-file-locally-using-pure-javascript

如果您通过添加变量 id somevar 来修改它以提供进一步的访问权限,那么还有一种方法可以将 somedb.txt 包含为有效的 js:

somevar = [
 "id": 1, "name": "Xyz", "local": "AxWhyZzz", /*...*/ ,
/*...*/
]

【讨论】:

我实际上并没有在网站上工作,我的项目是 C# 中的普通应用程序。【参考方案2】:

不,没有办法。 JSON 只是一种通用容器格式,值的实际含义 是特定于域/应用程序的——xgettext 必须了解含义才能知道要提取什么。它怎么能理解你的本土格式?

对于 XML 文件,这由 ITS (v2) 解决,gettext(以及 Poedit)从 0.19.7 开始支持。但是对于 JSON,什么都不存在……然而。不过,还有一些工作正在进行中(请参阅 here 和 here 和 here)。

【讨论】:

我认为将其称为本土格式是一种延伸,JSON 是一个明确指定的标准,不是吗? xgettext 在技术上应该能够根据它们的键解析特定的值,它毕竟也可以管理 XML,正如你所提到的。不过,这仍然回答了我的问题,可惜还没有太多 =/ 谢谢。 JSON syntax 是一个标准。它不是任何有意义的文件格式,因为文件的 structuresemantics 不是由它定义的。 JSON 规范没有说应该有名为“id”、“name”和“local”的字段,你说的是在 JSON 语法之上构建的自定义文件格式的定义中。您还需要了解 XML 的语义。 ITS 就是这样:定义与翻译相关的语义子集的正式方式。 XML 不是一种格式,例如AppData 文件是,.appdata.xml 文件的 ITS 定义使 xgettext 能够理解它们。 我不知道,我预计会有一些东西。就像 "id" 和 "name" 是 "custom" 一样,像 "getmethelocalization" 这样的函数名称也是自定义的,但是 xgettext 仍然可以很容易地找到它,因为它知道函数的 syntax称呼。同样,教它在 JSON 文件中查找值也很容易,例如通过查找“本地”键。这没什么大不了的,标准化的语法就足够了。 你应该 have a look 在 ITS 中指定提取规则是多么复杂(就复杂性而言,这是一个与从 JOSN 提取相同的问题),即使对于简单文件,在进行分类之前也是如此,但遗憾的是,关于它是多么“轻松”的声明。它根本无法与 -kgetmethelocalization 相提并论,无论是在实现方面还是从用户的 POV 来看。但是,如果您仍然认为这很容易,我们这些小程序员肯定会感谢您对 GNU gettext 处理 JSON 的贡献;-) 我从一个简单的编码角度来看这个,查找键的值并不复杂。我还没有查看 gettext src,如果不扩展解析器,它可能不会那么容易,因为它可能不是用 JSON 制作的,但是你会原谅我天真地认为你较小的程序员可能已经这样做了已经,在过去 21 年中的某个时间;-)

以上是关于从 JSON 文件解析可翻译的消息的主要内容,如果未能解决你的问题,请参考以下文章

如何从 BigQuery 的列中解析 JSON 文件

如何正确解析 SWIFT 中的 JSON 对象

从 JSON 字符串到字典的简单解析器

错误:JSON 解析错误:使用角度翻译时属性名称必须是字符串文字

JSON 文件上的 Hive 表:如何解析可选字段

如何从 Python 中的 websocket 消息增量解析 JSON?