Unicode CLDR pluralization rules as JavaScript functions for internationalization applications
npx @tessl/cli install tessl/npm-make-plural@7.4.0make-plural provides pre-compiled JavaScript functions for determining pluralization categories according to Unicode CLDR rules for approximately 200 languages. It supports both cardinal plurals (e.g., "one book", "two books") and ordinal plurals (e.g., "1st book", "2nd book") with no runtime dependencies and tree shaking support for optimal bundle sizes.
npm install make-pluralimport { en, fr, ar } from "make-plural";For specific modules:
import { en, fr } from "make-plural/cardinals";
import { en } from "make-plural/ordinals";
import * as Categories from "make-plural/pluralCategories";
import * as Examples from "make-plural/examples";
import { en, ro } from "make-plural/ranges";CommonJS:
const { en, fr, ar } = require("make-plural");import { en, fr, ar } from "make-plural";
// Cardinal pluralization
en(1); // 'one'
en(2); // 'other'
fr(0); // 'one' (French treats 0 as singular)
fr(2); // 'many'
// Ordinal pluralization
en(1, true); // 'one' (1st)
en(2, true); // 'two' (2nd)
en(3, true); // 'few' (3rd)
en(4, true); // 'other' (4th)
// Complex pluralization (Arabic has 6 categories)
ar(0); // 'zero'
ar(1); // 'one'
ar(2); // 'two'
ar(3); // 'few'
ar(11); // 'many'
ar(100); // 'other'make-plural is organized around several key modules:
All functions are pre-compiled for maximum performance with no runtime dependencies.
Primary pluralization functions that determine plural categories for cardinal and ordinal numbers across 217 languages.
type PluralCategory = "zero" | "one" | "two" | "few" | "many" | "other";
// Main pluralization function signature (all language functions)
(n: number | string, ord?: boolean) => PluralCategory;Cardinal-only pluralization functions optimized for when ordinal pluralization is not needed.
// Cardinal-only function signature
(n: number | string) => PluralCategory;Ordinal-only pluralization functions for languages that have specific ordinal rules.
// Ordinal-only function signature
(n: number | string) => PluralCategory;Metadata about available plural categories for each language, including both cardinal and ordinal categories.
interface LanguageCategories {
cardinal: PluralCategory[];
ordinal: PluralCategory[];
}Sample numeric values that demonstrate each plural category for every supported language.
interface LanguageExamples {
cardinal: Record<PluralCategory, string[]>;
ordinal: Record<PluralCategory, string[]>;
}Functions for determining the pluralization of numerical ranges (e.g., "1-5 items").
// Range function signature
(start: PluralCategory, end: PluralCategory) => PluralCategory;/** All possible CLDR plural categories */
type PluralCategory = "zero" | "one" | "two" | "few" | "many" | "other";
/** Language category metadata */
interface LanguageCategories {
cardinal: PluralCategory[];
ordinal: PluralCategory[];
}
/** Language example values */
interface LanguageExamples {
cardinal: Record<PluralCategory, string[]>;
ordinal: Record<PluralCategory, string[]>;
}