Start · Sprachen · JavaScript · Referenz · Intl.Locale.prototype.minimize()

Intl.Locale.prototype.minimize()

Methode

Gibt ein neues <code>Intl.Locale</code>-Objekt zurück, bei dem Sprach-, Schrift- und Regions-Subtags entfernt sind, die <code>maximize()</code> ohnehin wieder ergänzen würde.

seit JavaScript ES2020 (ECMA-402 7. Ausgabe) – Baseline: alle mode Kategorie: method-property

Signatur

Intl.Locale.prototype.minimize()

Beschreibung

minimize() ist das Gegenstück zu maximize(). Die Methode wendet den CLDR-Algorithmus „Remove Likely Subtags“ an: Sie entfernt alle Teile aus Sprache, Schrift und Region, die sich aus den übrigen Angaben eindeutig ableiten lassen. Aus "en-Latn-US" wird so "en", weil Englisch standardmäßig in lateinischer Schrift und für die USA angenommen wird. Aus "zh-Hant-TW" wird dagegen "zh-TW", weil sich traditionelles Chinesisch aus der Region Taiwan ergibt.

Der Algorithmus maximiert die Locale zuerst und probiert dann nacheinander die kürzesten Kandidaten aus: nur die Sprache, dann Sprache und Region, dann Sprache und Schrift. Genommen wird der erste Kandidat, der nach erneutem Maximieren dasselbe Ergebnis liefert. Deshalb bleibt bei mehrdeutigen Fällen eher die Region erhalten als die Schrift.

Unicode-Erweiterungen wie Kalender (-u-ca-…), Stundenzyklus (-u-hc-…) oder Zahlensystem (-u-nu-…) werden nicht entfernt, sondern unverändert übernommen. Das ursprüngliche Objekt bleibt ebenfalls unverändert, denn Intl.Locale-Instanzen sind unveränderlich.

Typische Anwendungsfälle sind kurze, einheitliche Sprach-Tags zum Speichern (z. B. in Datenbanken, URLs oder Cookies), für die Anzeige und für den Abgleich mit Übersetzungsdateien, die nach der kürzesten Form benannt sind.

Rückgabewert

Typ
Intl.Locale
Beschreibung
Eine neue Intl.Locale-Instanz in minimierter Form. Unicode-Erweiterungen bleiben erhalten.

Beispiele

Grundlegende Minimierung verschiedener Locales

const tags = ['en-Latn-US', 'de-Latn-DE', 'en-Latn-GB', 'zh-Hans-CN', 'zh-Hant-TW', 'sr-Cyrl-RS'];

for (const tag of tags) {
  const minimal = new Intl.Locale(tag).minimize();
  console.log(`${tag} → ${minimal.toString()}`);
}
en-Latn-US → en de-Latn-DE → de en-Latn-GB → en-GB zh-Hans-CN → zh zh-Hant-TW → zh-TW sr-Cyrl-RS → sr

Unicode-Erweiterungen bleiben erhalten

const locale = new Intl.Locale('fr-Latn-FR', {
  calendar: 'gregory',
  hourCycle: 'h12'
});

console.log(locale.toString());
console.log(locale.minimize().toString());
console.log(locale.minimize().hourCycle);
fr-Latn-FR-u-ca-gregory-hc-h12 fr-u-ca-gregory-hc-h12 h12

Browser-Sprache kompakt speichern und Übersetzung laden

// Übersetzungsdateien liegen unter der kürzesten Form vor: de.json, en-GB.json, zh-TW.json …
const verfuegbar = new Set(['de', 'en', 'en-GB', 'zh', 'zh-TW']);

const findeUebersetzung = (tag) => {
  const kurz = new Intl.Locale(tag).minimize();
  if (verfuegbar.has(kurz.baseName)) return kurz.baseName;
  // Rückfall auf die reine Sprache
  return verfuegbar.has(kurz.language) ? kurz.language : 'en';
};

console.log(findeUebersetzung('de-Latn-AT'));
console.log(findeUebersetzung('zh-Hant-TW'));
console.log(findeUebersetzung('en-GB'));
console.log(findeUebersetzung('ja-JP'));
de zh-TW en-GB en

Zwei Tags auf Gleichwertigkeit prüfen

const gleicheLocale = (a, b) =>
  new Intl.Locale(a).minimize().toString() ===
  new Intl.Locale(b).minimize().toString();

console.log(gleicheLocale('en', 'en-Latn-US'));
console.log(gleicheLocale('zh-TW', 'zh-Hant-TW'));
console.log(gleicheLocale('en-US', 'en-GB'));
true true false

// Wichtig · Fallstricke

  • Abhängig von CLDR-Daten: Das Ergebnis richtet sich nach den „Likely Subtags“-Daten, die die jeweilige JavaScript-Engine mitbringt. Verschiedene Browser- oder Node.js-Versionen können daher in Grenzfällen unterschiedliche Ergebnisse liefern. Verlasse dich bei seltenen Sprachen nicht auf ein fest erwartetes Ergebnis.
  • Kein Informationsverlust in der Bedeutung, aber in der Schreibweise: minimize() entfernt nur Angaben, die sich wieder ableiten lassen. Wer den genauen Originaltag braucht (z. B. "de-Latn-DE" für ein externes System), muss ihn separat aufbewahren.
  • Neues Objekt: Die Methode verändert die Instanz nicht. Das Ergebnis muss man einer Variablen zuweisen.
  • Erweiterungen bleiben: Für einen Vergleich ohne Kalender, Zahlensystem usw. verwendest du minimize().baseName statt toString().
  • Ungültige Tags führen schon beim Konstruktor new Intl.Locale() zu einem RangeError, nicht erst bei minimize().
  • Kompatibilität: Verfügbar ab Chrome 74, Firefox 75, Safari 14 und Node.js 12 (dort nur mit vollständigen ICU-Daten, seit Node.js 13 Standard).