Start · Sprachen · JavaScript · Referenz · Intl.PluralRules

Intl.PluralRules

Klasse

Ermöglicht plural-sensitives Formatieren und liefert die korrekte Pluralkategorie (<code>one</code>, <code>few</code>, <code>many</code> usw.) für eine Zahl gemäß Sprachregeln.

seit JavaScript ES2018 (Baseline: alle modernen Browser) Kategorie: core

Signatur

class Intl.PluralRules

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:
  • type ("cardinal" | "ordinal", Standard: "cardinal") – Art der Pluralregel. "cardinal" für Mengen (1 Apfel, 2 Äpfel), "ordinal" für Ordinalzahlen (1., 2., 3.).
  • minimumIntegerDigits, minimumFractionDigits, maximumFractionDigits, minimumSignificantDigits, maximumSignificantDigits – steuern, wie die Zahl vor der Kategorisierung betrachtet wird (analog zu Intl.NumberFormat).

Rückgabewert

Typ
Intl.PluralRules
Beschreibung
Eine neue 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"
one other other one few many 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 новое сообщение.
Du hast 1 neue Nachricht. Du hast 5 neue Nachrichten. У вас 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)));
1st 2nd 3rd 4th 11th 21st 22nd 23rd

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"]
{ locale: 'ar', type: 'cardinal', minimumIntegerDigits: 1, minimumFractionDigits: 2, maximumFractionDigits: 2, pluralCategories: [ 'zero', 'one', 'two', 'few', 'many', 'other' ] } [ '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.