Start · Sprachen · JavaScript · Referenz · Intl.Segmenter.supportedLocalesOf()

Intl.Segmenter.supportedLocalesOf()

Methode

Gibt ein Array der übergebenen Locales zurück, die <code>Intl.Segmenter</code> direkt unterstützt, ohne auf die Standard-Locale der Laufzeitumgebung zurückzufallen.

seit JavaScript ES2022 (Intl.Segmenter); Baseline seit 2024: Chrom Kategorie: method-property

Signatur

Intl.Segmenter.supportedLocalesOf(locales, options)

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

Typ
string[]
Beschreibung
Ein Array mit den kanonisierten Sprach-Tags der unterstützten Locales, in der Reihenfolge der Eingabe. Ist keine davon unterstützt, ist das Array leer.

Beispiele

Unterstützte Locales ermitteln

const requested = ['de-DE', 'ja', 'ban', 'th'];
const supported = Intl.Segmenter.supportedLocalesOf(requested);
console.log(supported);
["de-DE", "ja", "th"] // "ban" (Balinesisch) hat meist keine eigenen Daten

Kanonisierung und lookup-Matcher

const result = Intl.Segmenter.supportedLocalesOf(
  ['en-us', 'zh-hans-cn'],
  { localeMatcher: 'lookup' }
);
console.log(result);
["en-US", "zh-Hans-CN"]

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);
true ["de-DE", "de", "en-US", "en"] // abhängig von den Browser-Einstellungen

// Wichtig · Fallstricke

  • Fehler bei ungültigen Tags: Ist ein Sprach-Tag syntaktisch ungültig (z. B. "de_DE" oder ""), wirft die Methode einen RangeError. Ein ungültiger Wert für localeMatcher löst ebenfalls einen RangeError aus.
  • 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-icu gegenüber full-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, braucht supportedLocalesOf() oder resolvedOptions().locale.
  • Kompatibilität: Intl.Segmenter gibt es in Firefox erst ab Version 125 (April 2024). Für ältere Umgebungen empfiehlt sich eine Feature-Detection mit 'Segmenter' in Intl oder ein Polyfill wie @formatjs/intl-segmenter.
  • Doppelte Einträge in der Eingabe werden nach der Kanonisierung entfernt.