globalize icon indicating copy to clipboard operation
globalize copied to clipboard

Unit Formatter Returning Internal Error with CLDR v40.0.0

Open ritikmmathur opened this issue 2 years ago • 5 comments

Hi All,

For locale, es when i am using unitformatter, i am getting internal error.

Sample usage:

globalize.unitFormatter("bestFit", {
      form: "narrow"
    }).format(value)

Error Stack Trace:

Error: Oops, internal error
  e is not defined
  ReferenceError: e is not defined
      at eval (eval at buildFunction (node_modules/globalize/dist/globalize/plural.js:227:20), <anonymous>:2:3)
      at pluralGenerator (node_modules/globalize/dist/globalize/plural.js:297:10)
      at unitFormat (node_modules/globalize/dist/globalize/unit.js:74:16)
      at formatter (node_modules/globalize/dist/globalize/unit.js:101:10)

In CLDR v27.0.0, plural.json has following data,

"es": {
        "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000",
        "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
      }

where as in v40.0.0 plural.json has following data:

"es": {
        "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000",
        "pluralRule-count-many": "e = 0 and i != 0 and i % 1000000 = 0 and v = 0 or e != 0..5 @integer 1000000, 1c6, 2c6, 3c6, 4c6, 5c6, 6c6, … @decimal 1.0000001c6, 1.1c6, 2.0000001c6, 2.1c6, 3.0000001c6, 3.1c6, …",
        "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1c3, 2c3, 3c3, 4c3, 5c3, 6c3, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, 1.0001c3, 1.1c3, 2.0001c3, 2.1c3, 3.0001c3, 3.1c3, …"
      }

Note: for key pluralRule-count-many value has e

Similar error is returned for fr locale.

Please suggest a way to resolve this issue. Also, I would be happy to inner-source the fix 😄

Thanks,

Ritika

ritikmmathur avatar Apr 06 '22 23:04 ritikmmathur

Hi @ritikmmathur!

I believe e isn't supported by the version of messageformat we're using under the hoods in globalize. I suggest: (a) checking if latest messageformat supports it, and in case it does (b) bumping up the dependency here --- that's easier said than done since globalize doesn't simply use npm dependency, but a custom way to embed it.

In the meantime, some observations. The e pattern is a deprecated synonym for ‘c’. which in turn is compact decimal exponent value: exponent of the power of 10 used in compact decimal formatting according to https://www.unicode.org/reports/tr35/tr35-numbers.html#Plural_Operand_Meanings. In case plural isn't being used for such case, I believe it's possible to strip this data out from your CLDR usage safely and have globalize working just fine.

rxaviers avatar Apr 07 '22 15:04 rxaviers

I'd happily accept a PR in case you choose the update above (or any other solution). Thanks

rxaviers avatar Apr 07 '22 15:04 rxaviers

globalize has dependency on make-plural package. In latest version i see they have added support to handle e pattern code link. After doing initial testing, unit formatter is working with make-plural version [email protected].

Would it be okay if I raise PR to update make-plural dependency ??

ritikmmathur avatar Apr 08 '22 18:04 ritikmmathur

Sure and thanks!

rxaviers avatar Apr 11 '22 13:04 rxaviers

@ritikmmathur Where's the corresponding PR? Tried searching the pull requests for your username and came up empty.

fatso83 avatar Oct 16 '22 21:10 fatso83