错误搜寻:CLDR 30 JSON 数据不再具有 currencySpacing 信息

Bug hunt: CLDR 30 JSON data no longer has currencySpacing information

我们一直在使用 jquery/globalize in our web application with the CLDR 29 data in JSON format,没有任何问题。就在最近,Unicode 发布了 CLDR 30(不久之后,版本 30.0.1 进行了一些修复)。

当我们升级到 CLDR 30(.0.1) 数据时,我们的客户端货币格式测试失败了,因为对于许多文化而言,numbers.json 中的 "currencySpacing" 信息不再那里。例如,假设区域性 ar-AE,Globalize 库尝试在路径加载 CLDR 数据...

/main/ar-AE/numbers/currencyFormats-numberSystem-arab/currencySpacing/beforeCurrency

...在该(以及许多其他)文化的最新 CLDR 30 numbers.json 数据中不存在。

我们一直在尝试遍历堆栈以查看导致此问题的原因。我们从 DTD 开始。 DTD for CLDR 30(连同 CLDR 29 的)包括行...

<!ELEMENT currencyFormats ( alias | ( default*, currencySpacing*, currencyFormatLength*, unitPattern*, special* ) ) >

...这意味着 currencySpacing 是一个可选元素。也就是说,我们在 CLDR 30 release notes or Delta 中找不到任何表明此信息已针对大量文化进行更改的内容。

在 XML 数据("ground truth")中,我们看到 currencySpacing 元素仅在 main/root.xml 中使用,这两个 CLDR 29和 CLDR 30,即 XML.

在这方面显然没有重大变化

这让我们怀疑它是否是 tool that's used for generating the JSON data from the XML data. The tool is called ldml2json and is also used by the cldr-json 项目中的问题。为了排除 cldr-json 项目中的错误,我们自己构建了工具并自己生成了 JSON 数据。然后生成的数据也缺少 numbers.json 文件中的 "currencySpacing" 信息。所以这似乎不是 cldr-json 项目的问题。

如果我们理解正确,这意味着问题是:

如果后者属实,那么我想这应该作为 jquery/globalize 错误提出。调查前者可能需要我们从源代码进行调试。在我们投入时间之前,我们想问一下:是否还有其他人看到这个问题,是否有任何已知的解决方案?我们希望有人更有经验在 CLDR+JSON+Globalize 堆栈中可以帮助我们!

这是由以下更改引起的:http://unicode.org/cldr/trac/changeset/12636/trunk/common/main/root.xml

在此更改之前,阿拉伯数字系统的根区域设置的 currencySpacing 信息被所有其他区域设置继承。现在已经不存在了。

我不确定应该如何处理缺少的 currencySpacing,但 java and C 文档均声明数据可以为空。 在这种情况下,两者似乎都使用硬编码默认值:http://bugs.icu-project.org/trac/browser/icu4j/trunk/main/classes/core/src/com/ibm/icu/impl/CurrencyData.java#L86

所以这可能是全球化中的一个错误。

更新:Bug report and pull request.

最近的 CLDR 30.0.2 补丁修复了这个错误,因此 Globalize 不需要更新。

顺便说一下,按照 UTS#35 规范进行更深入的研究:) http://www.unicode.org/reports/tr35/tr35-numbers.html#Currencies