Signatur
Beschreibung
Intl.PluralRules ist Teil der JavaScript-Internationalisierungs-API (Intl) und löst das Problem der sprachabhängigen Pluralbildung. Während im Deutschen meistens nur zwischen Singular und Plural unterschieden wird, kennen Sprachen wie Arabisch, Russisch oder Polnisch bis zu sechs verschiedene Pluralkategorien. Intl.PluralRules gibt für eine beliebige Zahl die korrekte Kategorie ("zero", "one", "two", "few", "many", "other") gemäß den CLDR-Sprachregeln zurück.
Typischer Einsatz: Man erstellt eine Intl.PluralRules-Instanz mit dem gewünschten Locale (z. B. "de", "ru", "ar") und optional einem type ("cardinal" für normale Mengenangaben oder "ordinal" für Ordinalzahlen wie „1.", „2.", „3."). Anschließend ruft man .select(n) auf, um die Kategorie zu ermitteln, und wählt damit den passenden Text aus einem eigenen Übersetzungs-Dictionary aus.
Der Konstruktor akzeptiert dieselben Locale- und Options-Parameter wie andere Intl-Konstruktoren. Über minimumFractionDigits, maximumFractionDigits und verwandte Optionen lässt sich steuern, wie Nachkommastellen bei der Kategorisierung berücksichtigt werden — relevant z. B. für „0,5 Liter" vs. „1 Liter".
Mit der statischen Methode Intl.PluralRules.supportedLocalesOf() kann vorab geprüft werden, welche der gewünschten Locales nativ unterstützt werden, ohne auf den Fallback zurückzufallen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $locales | string | string[] | Systemsprache des Laufzeit-Environments | Ein BCP-47-Sprach-Tag (z. B. "de", "ru", "ar") oder ein Array solcher Tags. Bestimmt, nach welchen Sprachregeln die Pluralkategorie ermittelt wird. |
| $options | object | {} | Optionsobjekt mit folgenden Eigenschaften:
|
Rückgabewert
Intl.PluralRules-Instanz mit den Methoden select(), selectRange() und resolvedOptions().Beispiele
Grundlegende Pluralkategorien auf Deutsch und Russisch
const prDe = new Intl.PluralRules("de");
console.log(prDe.select(1)); // "one"
console.log(prDe.select(2)); // "other"
console.log(prDe.select(0)); // "other"
const prRu = new Intl.PluralRules("ru");
console.log(prRu.select(1)); // "one"
console.log(prRu.select(2)); // "few"
console.log(prRu.select(5)); // "many"
console.log(prRu.select(21)); // "one"
Eigenes Übersetzungs-Dictionary mit select()
const messages = {
de: {
one: "Du hast 1 neue Nachricht.",
other: n => `Du hast ${n} neue Nachrichten.`,
},
ru: {
one: n => `У вас ${n} новое сообщение.`,
few: n => `У вас ${n} новых сообщения.`,
many: n => `У вас ${n} новых сообщений.`,
other: n => `У вас ${n} новых сообщений.`,
},
};
const pluralize = (locale, n) => {
const pr = new Intl.PluralRules(locale);
const category = pr.select(n);
const template = messages[locale][category];
return typeof template === "function" ? template(n) : template;
};
console.log(pluralize("de", 1)); // Du hast 1 neue Nachricht.
console.log(pluralize("de", 5)); // Du hast 5 neue Nachrichten.
console.log(pluralize("ru", 21)); // У вас 21 новое сообщение.
Ordinalzahlen (type: "ordinal") auf Englisch
const prOrd = new Intl.PluralRules("en", { type: "ordinal" });
const suffixes = { one: "st", two: "nd", few: "rd", other: "th" };
const ordinal = n => {
const category = prOrd.select(n);
return `${n}${suffixes[category]}`;
};
[1, 2, 3, 4, 11, 21, 22, 23].forEach(n => console.log(ordinal(n)));
resolvedOptions() und supportedLocalesOf()
const pr = new Intl.PluralRules("ar", { minimumFractionDigits: 2 });
console.log(pr.resolvedOptions());
// { locale: "ar", type: "cardinal", minimumFractionDigits: 2, ... }
const supported = Intl.PluralRules.supportedLocalesOf(["ar", "xx-FAKE"]);
console.log(supported); // ["ar"]
// Wichtig · Fallstricke
Browser-Kompatibilität: Intl.PluralRules ist seit ES2018 im Standard und wird von allen modernen Browsern (Chrome 63+, Firefox 58+, Safari 13+, Edge 18+) sowie Node.js 10+ unterstützt. Internet Explorer unterstützt die API nicht.
Instanzen wiederverwenden: Das Erstellen einer Intl.PluralRules-Instanz ist relativ teuer. Bei wiederholtem Aufruf (z. B. in einer Schleife) sollte die Instanz außerhalb der Schleife einmalig erzeugt und wiederverwendet werden.
selectRange() (ES2024): Die neuere Methode pr.selectRange(startRange, endRange) gibt die Pluralkategorie für einen Zahlenbereich zurück (z. B. „1–3 Artikel"). Sie ist noch nicht in allen Browsern verfügbar – vor Nutzung auf Unterstützung prüfen.
Kategorien sind locale-abhängig: Nicht jede Sprache benutzt alle sechs Kategorien. resolvedOptions().pluralCategories listet die tatsächlich relevanten Kategorien des gewählten Locales auf — das eigene Dictionary sollte mindestens diese abdecken, sonst drohen undefined-Lookups.