Wie man prüft, ob eine Gebietsschema-Kennung gültig ist

Validieren Sie Gebietsschema-Kennungen, bevor Sie sie zur Formatierung von Datumsangaben, Zahlen und Währungen verwenden

Einführung

Wenn Ihre Anwendung Gebietsschema-Kennungen aus Benutzereingaben, API-Antworten oder Konfigurationsdateien akzeptiert, müssen Sie überprüfen, ob diese gültig sind, bevor Sie sie verwenden. Eine ungültige Gebietsschema-Kennung führt dazu, dass Formatierungsfunktionen Fehler werfen oder unerwartete Ergebnisse liefern.

Die Validierung stellt sicher, dass Zeichenfolgen wie en-US strukturell korrekt gemäß internationalen Standards sind. Dies verhindert Laufzeitfehler beim Übergeben von Gebietsschema-Kennungen an die Intl-API oder andere Internationalisierungsbibliotheken.

JavaScript bietet zwei integrierte Methoden zur Validierung von Gebietsschema-Kennungen. Beide Methoden überprüfen die Struktur der Kennung anhand des BCP 47-Standards, der das Format für Sprachkennzeichnungen definiert.

Was macht eine Gebietsschema-Kennung gültig

Eine Gebietsschema-Kennung folgt dem BCP 47-Standard für Sprachkennzeichnungen. Dieser Standard definiert die Struktur und Regeln für die Kombination von Sprach-, Schrift-, Regions- und Erweiterungskomponenten.

Gültige Gebietsschema-Kennungen verwenden Bindestriche zur Trennung von Komponenten, nicht Unterstriche oder andere Zeichen. Der Sprachcode muss ein anerkannter ISO 639-Code sein, und Regionscodes müssen anerkannte ISO 3166-1-Codes sein.

Beispiele für gültige Gebietsschema-Kennungen:

  • en (Englisch)
  • en-US (Amerikanisches Englisch)
  • zh-Hans (Vereinfachtes Chinesisch)
  • zh-Hans-CN (Vereinfachtes Chinesisch wie in China verwendet)
  • en-US-u-ca-gregory (Amerikanisches Englisch mit gregorianischem Kalender)

Beispiele für ungültige Gebietsschema-Kennungen:

  • en_US (verwendet Unterstrich statt Bindestrich)
  • english (kein anerkannter Sprachcode)
  • en-USA (Regionscode muss aus zwei Buchstaben bestehen, nicht drei)
  • EN-us (Sprachcode muss kleingeschrieben sein)
  • abc-XY (Sprachcode existiert nicht)

Die Validierungsmethoden überprüfen diese strukturellen Regeln und verifizieren, dass die Codes anerkannten Standards entsprechen.

Verwendung von Intl.getCanonicalLocales zur Validierung

Die Methode Intl.getCanonicalLocales() validiert Gebietsschema-Kennungen und gibt sie in ihrer kanonischen Form zurück. Diese Methode akzeptiert eine einzelne Gebietsschema-Kennung oder ein Array von Kennungen.

const result = Intl.getCanonicalLocales("en-US");
console.log(result);
// Ausgabe: ["en-US"]

Die Methode normalisiert die Eingabe, indem sie sie in das Standardformat konvertiert. Selbst wenn Sie eine Gebietsschema-Kennung mit falscher Groß-/Kleinschreibung übergeben, wird die korrekte kanonische Form zurückgegeben:

const result = Intl.getCanonicalLocales("EN-us");
console.log(result);
// Ausgabe: ["en-US"]

Wenn Sie eine ungültige Gebietsschema-Kennung übergeben, wirft die Methode einen RangeError:

try {
  Intl.getCanonicalLocales("en_US");
} catch (error) {
  console.error(error.name);
  // Ausgabe: "RangeError"
  console.error(error.message);
  // Ausgabe: "en_US is not a structurally valid language tag"
}

Dieser Fehler zeigt an, dass die Kennung nicht der BCP 47-Struktur folgt. Sie können diesen Fehler abfangen, um ungültige Eingaben elegant zu behandeln.

Validierung mehrerer Gebietsschema-Kennungen

Die Methode Intl.getCanonicalLocales() akzeptiert ein Array, um mehrere Gebietsschema-Kennungen gleichzeitig zu validieren. Die Methode gibt ein Array mit kanonischen Formen für alle gültigen Kennungen zurück.

const locales = ["en-US", "fr-FR", "es-MX"];
const result = Intl.getCanonicalLocales(locales);
console.log(result);
// Ausgabe: ["en-US", "fr-FR", "es-MX"]

Die Methode entfernt auch doppelte Gebietsschema-Kennungen aus dem Ergebnis:

const locales = ["en-US", "EN-us", "en-US"];
const result = Intl.getCanonicalLocales(locales);
console.log(result);
// Ausgabe: ["en-US"]

Alle drei Eingabewerte repräsentieren dasselbe Gebietsschema, daher gibt die Methode nur eine kanonische Form zurück.

Wenn ein Gebietsschema im Array ungültig ist, wirft die gesamte Methode einen Fehler:

try {
  Intl.getCanonicalLocales(["en-US", "invalid", "fr-FR"]);
} catch (error) {
  console.error(error.message);
  // Ausgabe: "invalid is not a structurally valid language tag"
}

Bei der Validierung von benutzerseitig bereitgestellten Listen sollten Sie jedes Gebietsschema einzeln validieren, um zu identifizieren, welche spezifischen Kennungen ungültig sind.

Verwendung des Intl.Locale-Konstruktors zur Validierung

Der Intl.Locale-Konstruktor bietet eine weitere Möglichkeit zur Validierung von Gebietsschema-Kennungen. Wenn Sie ein Gebietsschema-Objekt mit einer ungültigen Kennung erstellen, wirft der Konstruktor einen RangeError.

try {
  const locale = new Intl.Locale("en-US");
  console.log("Gültiges Gebietsschema");
} catch (error) {
  console.error("Ungültiges Gebietsschema");
}
// Ausgabe: "Gültiges Gebietsschema"

Der Konstruktor wirft einen Fehler für ungültige Kennungen:

try {
  const locale = new Intl.Locale("en_US");
  console.log("Gültiges Gebietsschema");
} catch (error) {
  console.error("Ungültiges Gebietsschema");
  console.error(error.message);
}
// Ausgabe: "Ungültiges Gebietsschema"
// Ausgabe: "invalid language subtag: en_US"

Im Gegensatz zu Intl.getCanonicalLocales() normalisiert der Intl.Locale-Konstruktor nicht die Groß-/Kleinschreibung. Er erfordert, dass die Kennung die korrekte Groß-/Kleinschreibung verwendet:

const locale1 = new Intl.Locale("en-US");
console.log(locale1.baseName);
// Ausgabe: "en-US"

const locale2 = new Intl.Locale("EN-US");
console.log(locale2.baseName);
// Ausgabe: "en-US"

Sowohl Groß- als auch Kleinbuchstaben-Sprachcodes werden akzeptiert, und der Konstruktor normalisiert sie zur kanonischen Form.

Auswahl einer Validierungsmethode

Beide Validierungsmethoden dienen unterschiedlichen Zwecken und bieten verschiedene Funktionen.

Verwenden Sie Intl.getCanonicalLocales(), wenn Sie Folgendes benötigen:

  • Normalisierung von Gebietsschema-Kennungen in ihre kanonische Form
  • Validierung und Deduplizierung einer Liste von Gebietsschema-Kennungen
  • Umwandlung inkonsistenter Groß-/Kleinschreibung in das Standardformat
  • Validierung von Gebietsschema-Kennungen ohne Erstellung von Objekten

Verwenden Sie den Intl.Locale-Konstruktor, wenn Sie Folgendes benötigen:

  • Validierung einer Gebietsschema-Kennung und sofortige Arbeit mit ihren Eigenschaften
  • Extraktion von Komponenten wie Sprache, Region oder Schrift aus der Kennung
  • Erstellung eines Gebietsschema-Objekts zur Verwendung mit anderen Intl-APIs
  • Gleichzeitige Validierung und Manipulation von Gebietsschema-Kennungen

Der Intl.Locale-Konstruktor ist leistungsfähiger, da er ein Objekt erstellt, das Sie abfragen und modifizieren können. Wenn Sie jedoch nur Validierung und Normalisierung benötigen, ist Intl.getCanonicalLocales() einfacher.

Validierung von Benutzereingaben

Bei der Annahme von Gebietsschema-Kennungen aus Benutzereingaben sollten diese vor der Verwendung in Ihrer Anwendung validiert werden. Dies verhindert Fehler und bietet klares Feedback, wenn Benutzer ungültige Werte eingeben.

function validateUserLocale(input) {
  try {
    const canonicalLocales = Intl.getCanonicalLocales(input);
    return {
      valid: true,
      locale: canonicalLocales[0]
    };
  } catch (error) {
    return {
      valid: false,
      error: "Please enter a valid locale identifier like en-US or fr-FR"
    };
  }
}

const result1 = validateUserLocale("en-US");
console.log(result1);
// Output: { valid: true, locale: "en-US" }

const result2 = validateUserLocale("english");
console.log(result2);
// Output: { valid: false, error: "Please enter a valid locale..." }

Diese Funktion validiert die Eingabe und gibt entweder das kanonische Gebietsschema oder eine benutzerfreundliche Fehlermeldung zurück.

Validierung von Konfigurationsdaten

Anwendungen laden häufig Gebietsschema-Kennungen aus Konfigurationsdateien oder Umgebungsvariablen. Validieren Sie diese Werte beim Start Ihrer Anwendung, um Konfigurationsfehler frühzeitig zu erkennen.

function loadLocaleConfig(configLocales) {
  const validLocales = [];
  const invalidLocales = [];

  for (const locale of configLocales) {
    try {
      const canonical = Intl.getCanonicalLocales(locale);
      validLocales.push(canonical[0]);
    } catch (error) {
      invalidLocales.push(locale);
    }
  }

  if (invalidLocales.length > 0) {
    console.warn("Invalid locale identifiers found:", invalidLocales);
  }

  return validLocales;
}

const config = ["en-US", "fr-FR", "invalid", "es_MX", "de-DE"];
const locales = loadLocaleConfig(config);
console.log(locales);
// Output: ["en-US", "fr-FR", "de-DE"]
// Warning: Invalid locale identifiers found: ["invalid", "es_MX"]

Diese Funktion filtert ungültige Gebietsschema-Kennungen heraus und protokolliert eine Warnung, sodass die Anwendung mit den gültigen Gebietsschemata fortfahren kann.

Validierung von API-Antworten

Bei Erhalt von Gebietsschema-Kennungen von externen APIs sollten diese vor der Verwendung in Ihrer Anwendung validiert werden. APIs könnten Gebietsschema-Kennungen in nicht standardisierten Formaten oder mit Fehlern zurückgeben.

function processApiLocale(apiResponse) {
  const locale = apiResponse.preferredLocale;

  try {
    const validated = new Intl.Locale(locale);
    return {
      success: true,
      language: validated.language,
      region: validated.region,
      baseName: validated.baseName
    };
  } catch (error) {
    console.error("API returned invalid locale:", locale);
    return {
      success: false,
      fallback: "en-US"
    };
  }
}

const response1 = { preferredLocale: "fr-CA" };
console.log(processApiLocale(response1));
// Output: { success: true, language: "fr", region: "CA", baseName: "fr-CA" }

const response2 = { preferredLocale: "invalid_locale" };
console.log(processApiLocale(response2));
// Output: { success: false, fallback: "en-US" }

Diese Funktion validiert die API-Antwort und extrahiert strukturierte Informationen über das Gebietsschema oder stellt einen Fallback-Wert bereit, wenn das Gebietsschema ungültig ist.