fast-plural-rules
Version:
Evaluates locale-specific plural rules to identify the right plural form for a cardinal number, which represents an item count.
139 lines (109 loc) • 6.5 kB
Markdown
[

](https://www.npmjs.com/package/fast-plural-rules)
[](https://codecov.io/gh/prantlf/fast-plural-rules)
Evaluates locale-specific plural rules to identify the right plural form for a cardinal number, which represents an item count. Internationalization libraries can utilize it to choose the right localized string.
* Focused and complete - [nothing but the rule evaluation](./src/index.d.ts) is included, but still [supporting almost 150 languages](./docs/languages.md
* Tiny and [fast](./docs/speed.md
* Standard and documented - written using the [Translate Project documentation] and the [Mozilla documentation].
* Reliable and correct - contains the [full test suite] [comparing the actual results with the Mozilla specification], run in both Node.js and the browser.
* Universal and modern - supports both plural form index (0-5) and plural form rules (`zero`, `one`, `two`, `few`, `many` and `other`) and includes declarations for [TypeScript].
If you are looking for a library compiling and executing the declarative [CLDR plural rules], see [plural-rules]. Generated programmatically for better reliability, but bigger and slower.
### Table of Contents
- [Synopsis](#synopsis)
- [Installation and Getting Started](#installation-and-getting-started)
- [Usage Scenarios](./docs/usage.md#usage-scenarios)
- [Design Concepts](./docs/design.md#design-concepts)
- [Supported Languages](./docs/languages.md#supported-languages)
- [API Reference](./docs/API.md#api-reference)
- [Library Integrations](#library-integrations)
- [Contributing](#contributing)
- [License](#license)
## Synopsis
```js
import { getPluralFormForCardinalByLocale } from 'fast-plural-rules'
// Returns index of the plural form for the specified locale and cardinal.
getPluralFormForCardinalByLocale('en', 1) // Returns 0; "1 file"
getPluralFormForCardinalByLocale('en', 2) // Returns 1; "2 files"
getPluralFormForCardinalByLocale('en', 5) // Returns 1; "5 files"
getPluralFormForCardinalByLocale('cs', 1) // Returns 0; "1 soubor"
getPluralFormForCardinalByLocale('cs', 2) // Returns 1; "2 soubory"
getPluralFormForCardinalByLocale('cs', 5) // Returns 2; "5 souborů"
// Returns a localized message for the specified locale and cardinal.
localizeMessage('en', 'fileCount', 3) // Returns "3 files"
localizeMessage('cs', 'fileCount', 3) // Returns "3 soubory"
// Returns a localized message for the specified locale and cardinal.
function localizeMessage (locale, messageKey, cardinal) {
const pluralForm = getPluralFormForCardinalByLocale(locale, cardinal)
const messageFormat = messages[locale][messageKey][pluralForm]
return messageFormat.replace('{0}', cardinal)
}
// A language pack with a testing message.
const messages = {
en: {
fileCount: [
"{0} file", // 0 - singular
"{0} files" // 1 - plural
],
}
cs: {
fileCount: [
"{0} soubor", // 0 - singular
"{0} soubory", // 1 - plural for 2-4 items
"{0} souborů" // 2 - plural for 5+ items
]
}
}
```
There is another [full example using plural form names](./docs/design.md
```js
// Localized messages organized by locales and message keys.
const messages = {
en: {
fileCount: {
one: '{0} file', // singular
other: '{0} files' // plural
}
},
cs: {
fileCount: {
one: '{0} soubor', // singular
few: '{0} soubory', // plural for 2-4 items
other: '{0} souborů' // plural for 5 and more items
}
}
}
```
This module can be installed in your project using [NPM] or [Yarn]. Make sure, that you use [Node.js] version 6 or newer.
```sh
$ npm i fast-plural-rules --save
```
```sh
$ yarn add fast-plural-rules
```
Functions are exposed as named exports, for example:
```js
import { getPluralFormForCardinalByLocale } from 'fast-plural-rules'
```
You can read more about the [module loading](./docs/API.md
* [Extended Day.js] - [relativeTime plugin] formats time durations to the past and to the future.
In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using Grunt.
Copyright (c) 2018-2022 Ferdinand Prantl
Licensed under the MIT license.
[]: http://nodejs.org/
[]: https://www.npmjs.com/
[]: https://yarnpkg.com/
[]: https://www.typescriptlang.org/
[]: https://travis-ci.org/prantlf/fast-plural-rules
[]: https://github.com/prantlf/fast-plural-rules/blob/master/test/rules.test.js
[]: http://docs.translatehouse.org/projects/localization-guide/en/latest/l10n/pluralforms.html#pluralforms-list
[]: https://developer.mozilla.org/en-US/docs/Mozilla/Localization/Localization_and_Plurals#List_of_Plural_Rules
[]: https://github.com/prantlf/dayjs
[]: https://github.com/prantlf/dayjs/blob/combined/docs/en/Plugin.md#relativetime
[]: http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html
[]: https://github.com/prantlf/plural-rules