Intl.PluralRules polyfill
npm install intl-pluralrulesA spec-compliant implementation & polyfill for [Intl.PluralRules],
including the selectRange(start, end) method introduced in [Intl.NumberFormat v3].
Also useful if you need proper support for [minimumFractionDigits],
which are only supported in Chrome 77 & later.
For a polyfill without selectRange() and with IE 11 support, please use intl-pluralrules@1.
[intl.pluralrules]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/PluralRules
[intl.numberformat v3]: https://github.com/tc39/proposal-intl-numberformat-v3/
[minimumfractiondigits]: https://bugs.chromium.org/p/v8/issues/detail?id=8866
```
npm install intl-pluralrules
To use as a polyfill, just import it to ensure that Intl.PluralRules is
available in your environment:
`js`
import 'intl-pluralrules'
If Intl.PluralRules already exists,selectRange()
includes a method,
and supports multiple locales,
the polyfill will not be loaded.
A complete implementation of PluralRules is available as
intl-pluralrules/plural-rules, if you'd prefer using it without modifying yourIntl object, or if you wish to use it rather than your environment's own:
`js
import PluralRules from 'intl-pluralrules/plural-rules'
new PluralRules('en').select(1) // 'one'
new PluralRules('en', { minimumSignificantDigits: 3 }).select(1) // 'other'
new PluralRules('en').selectRange(0, 1) // 'other'
new PluralRules('fr').selectRange(0, 1) // 'one'
`
In order to support all available locales, their data needs to be included in
the package. This means that when minified and gzipped, the above-documented
usage adds about 7kB to your application's production size. If this is a
concern, you can use intl-pluralrules/factory and [make-plural] to build a
PluralRules class with locale support limited to only what you actually use.
[make-plural]: https://www.npmjs.com/package/make-plural
Thanks to tree-shaking, this example that only supports English and French
minifies & gzips to 1472 bytes. Do note that this size difference is only
apparent with minified production builds.
`js
import getPluralRules from 'intl-pluralrules/factory'
import { en, fr } from 'make-plural/plurals'
import { en as enCat, fr as frCat } from 'make-plural/pluralCategories'
import { en as enRange, fr as frRange } from 'make-plural/ranges'
const sel = { en, fr }
const getSelector = lc => sel[lc]
const cat = { en: enCat, fr: frCat }
const getCategories = (lc, ord) => cat[lc][ord ? 'ordinal' : 'cardinal']
const range = { en: enRange, fr: frRange }
const getRangeSelector = lc => range[lc]
const PluralRules = getPluralRules(
Intl.NumberFormat, // Not available in IE 10
getSelector,
getCategories,
getRangeSelector
)
export default PluralRules
`
All arguments of
getPluralRules(NumberFormat, getSelector, getCategories, getRangeSelector)
are required.
- NumberFormat should be Intl.NumberFormat, or an implementation which"en"
supports at least the locale and all of the min/max digit countgetSelector(lc)
options.
- should return a function(n, ord) returning the pluraln
category of , using cardinal plural rules (by default), or ordinal rules iford
is true. n may be a number, or the formatted string representation oflc
a number. This may be called with any user-provided string , and shouldundefined
return for invalid or unsupported locales.getCategories(lc, ord)
- should return the set of available plural categoriesord
for the locale, either for cardinals (by default), or ordinals if isgetSelector
true. This function will be called only with values for which getRangeSelector(lc)
returns a function.
- should return a function(start, end) returning thestart
plural category of the range. and end` are the plural categories of
the corresponding values.