So fügen Sie wahrscheinliche Subtags zu unvollständigen Locales hinzu
Verwenden Sie JavaScript, um partielle Locale-Identifikatoren mit dem wahrscheinlichsten Skript und der wahrscheinlichsten Region zu vervollständigen
Einführung
Bei der Arbeit mit Locale-Identifikatoren erhalten Sie manchmal unvollständige Informationen. Ein Benutzer könnte nur einen Sprachcode wie ja angeben, ohne das Skript oder die Region anzugeben. Obwohl dieser partielle Identifikator gültig ist, fehlt ihm die Spezifität, die für bestimmte Operationen wie den Vergleich von Locales oder die Bestimmung von Formatierungskonventionen erforderlich ist.
JavaScript bietet eine Möglichkeit, diese partiellen Identifikatoren zu vervollständigen, indem die wahrscheinlichsten fehlenden Komponenten hinzugefügt werden. Dieser Prozess verwendet Sprachdaten, um das Skript und die Region abzuleiten, die Benutzer dieser Sprache typischerweise verwenden.
Dieser Leitfaden erklärt, was wahrscheinliche Subtags sind, wie JavaScript sie bestimmt und wann Sie diese Funktion in Ihren Anwendungen verwenden sollten.
Was sind wahrscheinliche Subtags
Wahrscheinliche Subtags sind die Skript- und Regionscodes, die am häufigsten mit einer bestimmten Sprache auftreten. Diese Zuordnungen stammen aus realen Sprachverwendungsdaten, die vom Unicode Consortium gepflegt werden.
Zum Beispiel wird Englisch typischerweise in lateinischer Schrift geschrieben und am häufigsten in den Vereinigten Staaten verwendet. Wenn Sie nur den Sprachcode en haben, sind die wahrscheinlichen Subtags Latn für das Skript und US für die Region, was Ihnen den vollständigen Identifikator en-Latn-US ergibt.
Die Wahrscheinlichkeit basiert auf Sprecherpopulationen und historischen Verwendungsmustern. Der Algorithmus gibt immer die statistisch häufigste Kombination zurück.
Warum wahrscheinliche Subtags hinzufügen
Partielle Locale-Identifikatoren funktionieren für die meisten Formatierungsoperationen. Die Intl.DateTimeFormat- und Intl.NumberFormat-APIs akzeptieren en und wenden sinnvolle Standardwerte an. Es gibt jedoch Situationen, in denen vollständige Identifikatoren erforderlich sind.
Vergleich von Locale-Identifikatoren
Beim Vergleich zweier Locale-Identifikatoren, um festzustellen, ob sie sich auf dieselbe Sprache und Region beziehen, schaffen unvollständige Identifikatoren Mehrdeutigkeit. Bedeutet en dasselbe wie en-US, oder ist es unterschiedlich, weil einer eine Region angibt und der andere nicht?
Das Hinzufügen wahrscheinlicher Subtags beseitigt diese Mehrdeutigkeit. Sowohl en als auch en-US werden zu en-Latn-US maximiert, wodurch sie direkt vergleichbar werden.
const locale1 = new Intl.Locale("en");
const locale2 = new Intl.Locale("en-US");
console.log(locale1.baseName === locale2.baseName);
// false - they look different
const maximized1 = locale1.maximize();
const maximized2 = locale2.maximize();
console.log(maximized1.baseName === maximized2.baseName);
// true - both are "en-Latn-US"
Speicherung kanonischer Formen
Bei der Speicherung von Locale-Identifikatoren in Datenbanken oder Konfigurationsdateien gewährleistet die Verwendung vollständiger Formen Konsistenz. Jede französische Locale wird zu fr-Latn-FR, jede japanische Locale wird zu ja-Jpan-JP und so weiter.
Diese Konsistenz macht das Suchen, Filtern und Gruppieren nach Locale zuverlässiger.
Bestimmung schriftspezifischen Verhaltens
Einige Sprachen verwenden mehrere Schriftsysteme, und das Schriftsystem beeinflusst die Textdarstellung, Schriftartauswahl und Sortierung. Chinesisch kann in vereinfachten oder traditionellen Zeichen geschrieben werden, und Serbisch kann kyrillische oder lateinische Schrift verwenden.
Das Hinzufügen wahrscheinlicher Subtags macht das Schriftsystem explizit. Wenn ein Benutzer zh ohne Angabe eines Schriftsystems bereitstellt, erzeugt die Maximierung zh-Hans-CN, was anzeigt, dass vereinfachte chinesische Zeichen erwartet werden.
Funktionsweise des Algorithmus
Der Add Likely Subtags-Algorithmus verwendet eine Datenbank mit Informationen zur Sprachverwendung, um fehlende Komponenten zu bestimmen. Diese Datenbank wird vom Unicode Consortium als Teil des Common Locale Data Repository gepflegt.
Der Algorithmus untersucht die von Ihnen bereitgestellten Informationen und füllt die Lücken:
- Wenn Sie nur eine Sprache angeben, fügt er das häufigste Schriftsystem und die häufigste Region für diese Sprache hinzu
- Wenn Sie eine Sprache und ein Schriftsystem angeben, fügt er die häufigste Region für diese Kombination hinzu
- Wenn Sie eine Sprache und eine Region angeben, fügt er das häufigste Schriftsystem für diese Kombination hinzu
- Wenn Sie alle drei Komponenten angeben, bleiben sie unverändert
Die Entscheidungen basieren auf statistischen Daten zur weltweiten Sprachverwendung.
Verwendung der maximize-Methode
Die maximize()-Methode ist für Intl.Locale-Objekte verfügbar. Sie gibt ein neues Locale-Objekt zurück, bei dem wahrscheinliche Subtags zum Basisnamen hinzugefügt wurden.
const locale = new Intl.Locale("ja");
const maximized = locale.maximize();
console.log(locale.baseName);
// "ja"
console.log(maximized.baseName);
// "ja-Jpan-JP"
Die Methode ändert das ursprüngliche Locale-Objekt nicht. Sie erstellt und gibt ein neues zurück.
Beispiele mit verschiedenen Sprachen
Verschiedene Sprachen haben unterschiedliche wahrscheinliche Subtags, basierend darauf, wo sie hauptsächlich gesprochen werden und welche Schriften sie verwenden.
Europäische Sprachen
Französisch wird zu Frankreich mit lateinischer Schrift maximiert:
const french = new Intl.Locale("fr");
const maximized = french.maximize();
console.log(maximized.baseName);
// "fr-Latn-FR"
Deutsch wird zu Deutschland mit lateinischer Schrift maximiert:
const german = new Intl.Locale("de");
const maximized = german.maximize();
console.log(maximized.baseName);
// "de-Latn-DE"
Sprachen mit nicht-lateinischen Schriften
Japanisch wird zu Japan mit japanischer Schrift maximiert:
const japanese = new Intl.Locale("ja");
const maximized = japanese.maximize();
console.log(maximized.baseName);
// "ja-Jpan-JP"
Arabisch wird zu Ägypten mit arabischer Schrift maximiert:
const arabic = new Intl.Locale("ar");
const maximized = arabic.maximize();
console.log(maximized.baseName);
// "ar-Arab-EG"
Chinesisch ohne Schrift wird zu vereinfachten Zeichen und China maximiert:
const chinese = new Intl.Locale("zh");
const maximized = chinese.maximize();
console.log(maximized.baseName);
// "zh-Hans-CN"
Teilweise Identifikatoren mit Regionen
Wenn Sie eine Sprache und Region, aber keine Schrift angeben, fügt der Algorithmus die Schrift hinzu:
const britishEnglish = new Intl.Locale("en-GB");
const maximized = britishEnglish.maximize();
console.log(maximized.baseName);
// "en-Latn-GB"
Die Region bleibt wie angegeben. Nur die fehlende Schrift wird hinzugefügt.
Teilweise Identifikatoren mit Schriften
Wenn Sie eine Sprache und Schrift, aber keine Region angeben, fügt der Algorithmus die häufigste Region für diese Schrift hinzu:
const traditionalChinese = new Intl.Locale("zh-Hant");
const maximized = traditionalChinese.maximize();
console.log(maximized.baseName);
// "zh-Hant-TW"
Traditionelle chinesische Zeichen werden hauptsächlich in Taiwan verwendet, daher wird TW als Region hinzugefügt.
Erweiterungstags bleiben erhalten
Unicode-Erweiterungstags spezifizieren Formatierungspräferenzen wie Kalendersysteme, Zahlensysteme und Stundenzyklen. Diese Tags erscheinen nach -u- in der Locale-Kennung.
Die maximize()-Methode ändert keine Erweiterungstags. Sie betrifft nur die Sprach-, Schrift- und Regionskomponenten.
const locale = new Intl.Locale("fr", {
calendar: "gregory",
numberingSystem: "latn",
hourCycle: "h23"
});
console.log(locale.toString());
// "fr-u-ca-gregory-hc-h23-nu-latn"
const maximized = locale.maximize();
console.log(maximized.toString());
// "fr-Latn-FR-u-ca-gregory-hc-h23-nu-latn"
Der Basisname ändert sich von fr zu fr-Latn-FR, aber die Erweiterungstags bleiben identisch.
Wann maximize verwendet werden sollte
Verwenden Sie die maximize()-Methode, wenn Sie vollständige Locale-Kennungen für Konsistenz- oder Vergleichszwecke benötigen.
Normalisierung von Benutzereingaben
Benutzer können Locales in verschiedenen Formen eingeben. Einige tippen möglicherweise en, andere en-US und wieder andere en-Latn-US. Die Maximierung aller Eingaben erstellt ein konsistentes Format:
function normalizeLocale(input) {
try {
const locale = new Intl.Locale(input);
const maximized = locale.maximize();
return maximized.baseName;
} catch (error) {
return null;
}
}
console.log(normalizeLocale("en"));
// "en-Latn-US"
console.log(normalizeLocale("en-US"));
// "en-Latn-US"
console.log(normalizeLocale("en-Latn-US"));
// "en-Latn-US"
Alle drei Eingaben erzeugen dieselbe normalisierte Form.
Aufbau von Locale-Fallback-Ketten
Wenn eine bestimmte Locale nicht verfügbar ist, greifen Anwendungen auf allgemeinere Locales zurück. Die Maximierung hilft, diese Ketten korrekt aufzubauen:
function buildFallbackChain(localeString) {
const locale = new Intl.Locale(localeString);
const maximized = locale.maximize();
const chain = [maximized.toString()];
if (maximized.script && maximized.region) {
const withoutRegion = new Intl.Locale(
`${maximized.language}-${maximized.script}`
);
chain.push(withoutRegion.toString());
}
if (maximized.region) {
chain.push(maximized.language);
}
chain.push("en");
return chain;
}
console.log(buildFallbackChain("zh-TW"));
// ["zh-Hant-TW", "zh-Hant", "zh", "en"]
Dies erstellt einen korrekten Fallback von der spezifischsten zur allgemeinsten Locale.
Abgleich von Benutzerpräferenzen mit verfügbaren Locales
Wenn Sie über eine Reihe verfügbarer Übersetzungen verfügen und die beste Übereinstimmung für eine Benutzerpräferenz finden müssen, ermöglicht die Maximierung beider Seiten einen genauen Vergleich:
function findBestMatch(userPreference, availableLocales) {
const userMaximized = new Intl.Locale(userPreference).maximize();
const matches = availableLocales.map(available => {
const availableMaximized = new Intl.Locale(available).maximize();
let score = 0;
if (userMaximized.language === availableMaximized.language) score += 1;
if (userMaximized.script === availableMaximized.script) score += 1;
if (userMaximized.region === availableMaximized.region) score += 1;
return { locale: available, score };
});
matches.sort((a, b) => b.score - a.score);
return matches[0].locale;
}
const available = ["en-US", "en-GB", "fr-FR", "de-DE"];
console.log(findBestMatch("en", available));
// "en-US"
Die Funktion erweitert die Benutzerpräferenz en zu en-Latn-US und findet die nächstgelegene Übereinstimmung.
Wann maximize nicht verwendet werden sollte
Sie müssen Locales nicht maximieren, bevor Sie sie an Formatierungs-APIs übergeben. Die Intl.DateTimeFormat, Intl.NumberFormat und andere Formatierungs-Konstruktoren verarbeiten partielle Identifikatoren korrekt.
const date = new Date("2025-03-15");
const partial = new Intl.DateTimeFormat("fr").format(date);
const maximized = new Intl.DateTimeFormat("fr-Latn-FR").format(date);
console.log(partial);
// "15/03/2025"
console.log(maximized);
// "15/03/2025"
Beide erzeugen identische Ausgaben. Die zusätzliche Spezifität ändert in diesem Fall das Formatierungsverhalten nicht.
Verwenden Sie maximize(), wenn Sie die expliziten Informationen für Ihre eigene Logik benötigen, nicht wenn Sie Locales an integrierte Formatierer übergeben.
Browser-Unterstützung
Die maximize()-Methode ist in allen modernen Browsern verfügbar. Chrome, Firefox, Safari und Edge unterstützen sie alle als Teil der Intl.Locale-API.
Node.js unterstützt maximize() ab Version 12, mit vollständiger Unterstützung in Version 14 und später.
Zusammenfassung
Likely Subtags vervollständigen partielle Locale-Identifikatoren, indem sie das am häufigsten verwendete Skript und die Region für eine bestimmte Sprache hinzufügen. Die Intl.Locale.maximize()-Methode implementiert den Unicode-Add-Likely-Subtags-Algorithmus, um diese Erweiterung durchzuführen.
Wichtige Punkte:
- Likely Subtags basieren auf realen Sprachdaten
- Die
maximize()-Methode fügt fehlende Skript- und Regionscodes hinzu - Erweiterungs-Tags für Kalender und Zahlensysteme bleiben unverändert
- Verwenden Sie Maximierung zur Normalisierung von Benutzereingaben und zum Vergleichen von Locales
- Formatierungs-APIs benötigen keine maximierten Locales
Die maximize()-Methode bietet eine standardisierte Möglichkeit, mit vollständigen Locale-Identifikatoren zu arbeiten, wenn Ihre Anwendungslogik explizite Skript- und Regionsinformationen erfordert.