Signatur
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
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
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));
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
}
}
// 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 einTypeErrorgeworfen. Ist einer der WerteNaN, gibt es einenRangeError. In frühen Entwürfen der Spezifikation (und in einigen älteren Implementierungen) löste auchstartRange > endRangeeinenRangeErroraus. - 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
otherals 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-pluralruleseinsetzen. Die Ergebnisse können je nach CLDR-Version der Engine leicht voneinander abweichen.