Start · Sprachen · JavaScript · Referenz · Intl.PluralRules.prototype.selectRange()

Intl.PluralRules.prototype.selectRange()

Methode

Gibt die Pluralkategorie (<code>"zero"</code>, <code>"one"</code>, <code>"two"</code>, <code>"few"</code>, <code>"many"</code> oder <code>"other"</code>) für einen Zahlenbereich wie „1–5“ gemäß der Locale zurück.

seit JavaScript ES2023 (ECMA-402, 10. Ausgabe) · Baseline 2023: Ch Kategorie: method-property

Signatur

Intl.PluralRules.prototype.selectRange(startRange, endRange)

Beschreibung

selectRange() ist das Gegenstück zu select() für Zahlenbereiche. Die Methode nimmt Anfangs- und Endwert eines Bereichs entgegen und gibt die Pluralkategorie zurück, die laut den CLDR-Regeln der eingestellten Sprache für diesen Bereich gilt – also z. B. ob man „1–2 Tage“ oder „1–2 Tag“ schreibt.

Wichtig ist, dass die Kategorie eines Bereichs nicht einfach die Kategorie des Endwerts oder des Anfangswerts ist. Viele Sprachen haben eigene Bereichsregeln, die sich aus der Kombination der Kategorien von Anfang und Ende ergeben. Im Russischen ergibt z. B. one + few die Kategorie few, one + many dagegen many. Wer die Kategorie selbst aus select(end) ableitet, bekommt in manchen Sprachen falsche Ergebnisse.

Typischerweise nutzt man selectRange() zusammen mit Intl.NumberFormat.prototype.formatRange(). Mit formatRange() formatiert man den Zahlenteil („3–5“), und mit selectRange() wählt man die passende Wortform aus einer Übersetzungstabelle. Die Optionen der Instanz (z. B. minimumFractionDigits) werden dabei berücksichtigt, genauso wie bei select().

Parameter

Name Typ Default Beschreibung
$startRange Pflicht number | bigint | string Anfangswert des Bereichs. Strings werden als exakte Dezimalzahl interpretiert (z. B. "1.50").
$endRange Pflicht number | bigint | string Endwert des Bereichs. Darf auch kleiner als startRange sein, wird aber meist größer oder gleich sein.

Rückgabewert

Typ
"zero" | "one" | "two" | "few" | "many" | "other"
Beschreibung
Ein String mit der Pluralkategorie, die für den Bereich gilt. Welche Kategorien vorkommen können, hängt von der Locale ab und lässt sich über resolvedOptions().pluralCategories abfragen.

Beispiele

Grundlegende Nutzung in verschiedenen Sprachen

const en = new Intl.PluralRules('en-US');
console.log(en.selectRange(1, 5));

const ru = new Intl.PluralRules('ru');
console.log(ru.selectRange(1, 2)); // one + few
console.log(ru.selectRange(1, 5)); // one + many

const fr = new Intl.PluralRules('fr');
console.log(fr.selectRange(0, 1)); // one + one
other few many one

Lokalisierte Bereichsangabe mit formatRange()

const messages = {
  ru: { one: 'день', few: 'дня', many: 'дней', other: 'дня' },
  en: { one: 'day', other: 'days' }
};

const formatDayRange = (locale, start, end) => {
  const nf = new Intl.NumberFormat(locale);
  const pr = new Intl.PluralRules(locale);
  const category = pr.selectRange(start, end);
  const word = messages[locale][category] ?? messages[locale].other;
  return `${nf.formatRange(start, end)} ${word}`;
};

console.log(formatDayRange('en', 3, 5));
console.log(formatDayRange('ru', 1, 2));
console.log(formatDayRange('ru', 1, 5));
3–5 days 1–2 дня 1–5 дней

Fehlerbehandlung und Feature-Erkennung

const pr = new Intl.PluralRules('de');

if (typeof pr.selectRange !== 'function') {
  console.log('selectRange() wird nicht unterstützt');
} else {
  try {
    pr.selectRange(1, NaN);
  } catch (err) {
    console.log(err.name); // NaN ist nicht erlaubt
  }
  try {
    pr.selectRange(1);
  } catch (err) {
    console.log(err.name); // endRange fehlt
  }
}
RangeError TypeError

// Wichtig · Fallstricke

  • Nicht aus select() ableiten: Die Kategorie eines Bereichs folgt eigenen CLDR-Regeln. select(end) liefert in vielen Sprachen ein anderes Ergebnis.
  • Fehler: Fehlt einer der beiden Werte (undefined), wird ein TypeError geworfen. Ist einer der Werte NaN, gibt es einen RangeError. In frühen Entwürfen der Spezifikation (und in einigen älteren Implementierungen) löste auch startRange > endRange einen RangeError aus.
  • Ordinalzahlen: Für type: "ordinal" gibt es in CLDR kaum Bereichsregeln. Das Ergebnis ist dann oft nur ein Rückfallwert und sprachlich selten sinnvoll.
  • Übersetzungstabellen: Hinterlegen Sie immer einen Eintrag für other als Rückfall, weil diese Kategorie in jeder Sprache vorkommt.
  • Kompatibilität: Die Methode kam mit Intl.NumberFormat v3 und ist erst seit 2023 in allen großen Browsern verfügbar (Chrome/Edge 106, Firefox 116, Safari 15.4). Für ältere Umgebungen sollten Sie prüfen, ob sie existiert, oder ein Polyfill wie @formatjs/intl-pluralrules einsetzen. Die Ergebnisse können je nach CLDR-Version der Engine leicht voneinander abweichen.