Signatur
Beschreibung
Intl.Segmenter.supportedLocalesOf() ist eine statische Methode. Sie prüft eine Liste von Sprach-Tags nach BCP 47 und liefert nur die Einträge zurück, für die die JavaScript-Engine eigene Segmentierungsdaten hat, also Regeln für die Zerlegung in Grapheme, Wörter oder Sätze. Locales, die nur über den Rückfall auf die Standard-Locale bedient würden, fehlen im Ergebnis.
Die Methode ist nützlich, wenn man vor dem Erzeugen eines Intl.Segmenter wissen möchte, ob eine bestimmte Sprache wirklich unterstützt wird. Das betrifft zum Beispiel Japanisch, Chinesisch oder Thai, wo Wörter ohne Leerzeichen geschrieben werden und eine korrekte Wortsegmentierung Wörterbuchdaten braucht. Mit dem Ergebnis kann man eine passende Ersatz-Locale wählen oder eine Warnung ausgeben.
Die Reihenfolge des Ergebnisses entspricht der Reihenfolge der Eingabe. Die Tags werden kanonisiert (aus "en-us" wird zum Beispiel "en-US"). Ein Tag mit Unter-Tags zählt als unterstützt, wenn die Engine eine passende Basis-Locale kennt. So kann "de-CH" zurückkommen, obwohl nur "de" Daten hat.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $locales | string | string[] | Intl.Locale | Intl.Locale[] | undefined | undefined | Ein BCP-47-Sprach-Tag oder ein Array davon (auch Intl.Locale-Objekte). Bei undefined ist das Ergebnis ein leeres Array. |
| $options | object | { localeMatcher: "best fit" } | Optionales Objekt mit der Eigenschaft localeMatcher: "lookup" (strenger Algorithmus nach BCP 47) oder "best fit" (Standard, Abgleich nach eigenen Regeln der Engine). |
Rückgabewert
Beispiele
Unterstützte Locales ermitteln
const requested = ['de-DE', 'ja', 'ban', 'th'];
const supported = Intl.Segmenter.supportedLocalesOf(requested);
console.log(supported);
Kanonisierung und lookup-Matcher
const result = Intl.Segmenter.supportedLocalesOf(
['en-us', 'zh-hans-cn'],
{ localeMatcher: 'lookup' }
);
console.log(result);
Wortsegmentierung mit Ersatz-Locale
const createWordSegmenter = (preferred, fallback = 'en') => {
const [locale] = Intl.Segmenter.supportedLocalesOf(preferred);
if (!locale) {
console.warn(`Keine Segmentierungsdaten für ${preferred}, nutze ${fallback}`);
}
return new Intl.Segmenter(locale ?? fallback, { granularity: 'word' });
};
const segmenter = createWordSegmenter('ja-JP');
const words = [...segmenter.segment('吾輩は猫である')]
.filter((s) => s.isWordLike)
.map((s) => s.segment);
console.log(words);
Feature-Detection vor der Nutzung
const canSegment = typeof Intl !== 'undefined' && 'Segmenter' in Intl;
const locales = canSegment
? Intl.Segmenter.supportedLocalesOf(navigator.languages ?? ['en'])
: [];
console.log(canSegment, locales);
// Wichtig · Fallstricke
- Fehler bei ungültigen Tags: Ist ein Sprach-Tag syntaktisch ungültig (z. B.
"de_DE"oder""), wirft die Methode einenRangeError. Ein ungültiger Wert fürlocaleMatcherlöst ebenfalls einenRangeErroraus. - Ergebnis hängt von der Engine ab: Welche Locales unterstützt werden, hängt von den ICU-Daten der Engine ab und kann sich zwischen Browsern und Node.js-Builds unterscheiden (z. B.
small-icugegenüberfull-icu). Das Ergebnis sollte man deshalb nicht fest im Code hinterlegen. - Ohne Prüfung gibt es keinen Fehler:
new Intl.Segmenter('xx')wirft keinen Fehler, sondern fällt still auf die Standard-Locale zurück. Wer das erkennen will, brauchtsupportedLocalesOf()oderresolvedOptions().locale. - Kompatibilität:
Intl.Segmentergibt es in Firefox erst ab Version 125 (April 2024). Für ältere Umgebungen empfiehlt sich eine Feature-Detection mit'Segmenter' in Intloder ein Polyfill wie@formatjs/intl-segmenter. - Doppelte Einträge in der Eingabe werden nach der Kanonisierung entfernt.