1

尝试格式化有效的 ICU 消息时

'您的开放票数是 {n, number}'

jquery/globalize 抛出异常:fmt is not defined(…)

使用 globalize-compiler 编译消息时没有错误,但在运行时失败。

使用 jquery/globalize 1.0.0 和 1.1.1
问题类似于:github.com/jquery/globalize/issues/563


更改 jquery/globalize ... globalize/message.js 源文件(添加单词 customFormatters)可以消除错误...但是在项目中更改第三方源文件是不可接受的。

Globalize.messageFormatter =
Globalize.prototype.messageFormatter = function( path, customFormatters ) {
...
formatter = new MessageFormat( cldr.locale, pluralGenerator, customFormatters ).compile( message )




下面的 npm 包还按预期处理消息格式。 https://www.npmjs.com/package/format-message


(我已经 PM'ed Rafael 的 jquery/globalize 并且他要求我在这里发布问题)

问题:

  1. 有没有其他人遇到过这个问题,你的解决方法是什么?

  2. 是否有人将 jquery/globalize 用于基数/日期/单位/等格式化程序和另一个库,如“format-message”用于消息格式化?

  3. 它将用于的项目是 nodejs 和基于浏览器的 (spa)。切换到 Intl 和 polyfill 是一个有效的选择。(需要 Safari 支持http://caniuse.com/#search=intl

  4. 是否有测试来评估通过 PR 将“customFormatters”添加到源的性能成本。

4

1 回答 1

0
  1. 请改用变量替换,例如'Your open ticket count is {n}'Globalize.formatMessage('<message>', {n: Globalize.formatNumber(n)})

  2. 使用 Globalize,您可以使用它们各自的格式化程序来格式化数字、日期、相对时间、单位等,而不是将其作为变量替换传递给消息。每个格式化程序都有自己的一组选项,因此您可以根据需要自定义输出。因此,不同之处在于,您将能够在代码中定义格式,而不是在消息本身中。对所有这些格式化程序和消息格式化程序使用 Globalize 的一大优势是,您可以使用globalize-compiler静态解析代码并生成非常高效的预编译代码(的代码)以在生产环境中运行。另请参阅我们使用 webpack 的应用演示

  3. 请注意,国际(由今天的 ecma-402 定义)仅定义数字和日期格式化程序。它没有定义消息格式化程序、复数(很快将成为规范的一部分)、相对格式化程序等。因此您可能只找到前两个的 polyfil。

  4. 这部分仍然很粗略,但请务必阅读 Globalize performance section

PS:我已经更新了 https://github.com/jquery/globalize/issues/563谢谢。

于 2016-05-11T01:37:03.297 回答