babel icon indicating copy to clipboard operation
babel copied to clipboard

Inconsistent plural form for Arabic

Open felipeochoa opened this issue 4 years ago • 0 comments

Overview Description

The two plural catalogs babel.messages.plurals (manually maintained) and the one derived from the CLDR disagree on the formula for Arabic. Specifically, the 5th and 6th form ("many" and "other") are flipped.

Steps to Reproduce

>>> import babel, babel.messages.plurals, babel.plural
>>> print(babel.messages.plurals.get_plural('ar'))
nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=0 && n%100<=2 ? 4 : 5);
>>> print(babel.plural.to_gettext(babel.Locale('ar').plural_form))
nplurals=6; plural=((((n % 100) >= 3 && (n % 100) <= 10)) ? 3 : (((n % 100) >= 11 && (n % 100) <= 99)) ? 4 : ((n == 1)) ? 1 : ((n == 2)) ? 2 : ((n == 0)) ? 0 : 5)

Switching over to NodeJS to evaluate:

> var manual = n => n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=0 && n%100<=2 ? 4 : 5;
> var cldr = n => ((((n % 100) >= 3 && (n % 100) <= 10)) ? 3 : (((n % 100) >= 11 && (n % 100) <= 99)) ? 4 : ((n == 1)) ? 1 : ((n == 2)) ? 2 : ((n == 0)) ? 0 : 5)
> [0, 1, 2, 3, 11, 101].map(manual)
[ 0, 1, 2, 3, 5, 4 ]
> [0, 1, 2, 3, 11, 101].map(cldr)
[ 0, 1, 2, 3, 4, 5 ]

Actual Results

The formulas are formatted differently, but they agree in the n == 0, n == 1, n == 2, and (n % 100) >= 3 && (n % 100) <= 10 cases. The two remaining cases ((n % 100) >= 11 and n%100<=2) however are flipped.

The manual form has the 101 case as index 4 (many) and the 11 case as index 5 (other). The CLDR form has them the opposite way.

Expected Results

The two formulas should match.

Additional Information

I was able to verify that the manual formula was copied from Mozilla in #431, even though it did not match the CLDR data at the time (v29 unchanged in latest). The Mozilla formula was specified in a bit of an ad-hoc way years before.

felipeochoa avatar Oct 14 '21 22:10 felipeochoa