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

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

somedb.txt

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

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

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

【问题讨论】:

    标签: json localization gettext poedit xgettext


    【解决方案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,什么都不存在……然而。不过,还有一些工作正在进行中(请参阅 hereherehere)。

    【讨论】:

    • 我认为将其称为本土格式是一种延伸,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 年中的某个时间;-)
    猜你喜欢
    • 2020-10-16
    • 1970-01-01
    • 2012-06-29
    • 2011-10-26
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    相关资源
    最近更新 更多