Unterstützung für Internationalisierung
Node.js verfügt über viele Funktionen, die das Schreiben internationalisierter Programme erleichtern. Einige davon sind:
Gebietsschema-sensitive oder Unicode-fähige Funktionen in der ECMAScript Language Specification:
Alle Funktionen, die in der ECMAScript Internationalization API Specification (aka ECMA-402) beschrieben sind:
Intl
Objekt- Gebietsschema-sensitive Methoden wie
String.prototype.localeCompare()
undDate.prototype.toLocaleString()
Der WHATWG URL Parser unterstützt internationalisierte Domainnamen (IDNs)
Genauere REPL Zeilenbearbeitung
Node.js und die zugrunde liegende V8-Engine verwenden International Components for Unicode (ICU), um diese Funktionen in nativem C/C++-Code zu implementieren. Der vollständige ICU-Datensatz wird standardmäßig von Node.js bereitgestellt. Aufgrund der Größe der ICU-Datendatei werden jedoch mehrere Optionen zur Anpassung des ICU-Datensatzes entweder beim Erstellen oder Ausführen von Node.js bereitgestellt.
Optionen zum Erstellen von Node.js
Um zu steuern, wie ICU in Node.js verwendet wird, stehen während der Kompilierung vier configure
-Optionen zur Verfügung. Weitere Informationen zum Kompilieren von Node.js sind in BUILDING.md dokumentiert.
--with-intl=none
/--without-intl
--with-intl=system-icu
--with-intl=small-icu
--with-intl=full-icu
(Standard)
Eine Übersicht über die verfügbaren Node.js- und JavaScript-Funktionen für jede configure
-Option:
Funktion | none | system-icu | small-icu | full-icu |
---|---|---|---|---|
String.prototype.normalize() | keine (Funktion ist No-Op) | voll | voll | voll |
String.prototype.to*Case() | voll | voll | voll | voll |
Intl | keine (Objekt existiert nicht) | teilweise/voll (abhängig vom Betriebssystem) | teilweise (nur Englisch) | voll |
String.prototype.localeCompare() | teilweise (nicht lokalisiert) | voll | voll | voll |
String.prototype.toLocale*Case() | teilweise (nicht lokalisiert) | voll | voll | voll |
Number.prototype.toLocaleString() | teilweise (nicht lokalisiert) | teilweise/voll (abhängig vom Betriebssystem) | teilweise (nur Englisch) | voll |
Date.prototype.toLocale*String() | teilweise (nicht lokalisiert) | teilweise/voll (abhängig vom Betriebssystem) | teilweise (nur Englisch) | voll |
Legacy URL Parser | teilweise (keine IDN-Unterstützung) | voll | voll | voll |
WHATWG URL Parser | teilweise (keine IDN-Unterstützung) | voll | voll | voll |
require('node:buffer').transcode() | keine (Funktion existiert nicht) | voll | voll | voll |
REPL | teilweise (ungenaue Zeilenbearbeitung) | voll | voll | voll |
require('node:util').TextDecoder | teilweise (grundlegende Kodierungsunterstützung) | teilweise/voll (abhängig vom Betriebssystem) | teilweise (nur Unicode) | voll |
RegExp Unicode Property Escapes | keine (ungültiger RegExp Fehler) | voll | voll | voll |
Die Bezeichnung "(nicht lokalisiert)" bedeutet, dass die Funktion ihre Operation genauso ausführt wie die Nicht-Locale -Version der Funktion, falls eine existiert. Zum Beispiel ist im none -Modus die Operation von Date.prototype.toLocaleString() identisch mit der von Date.prototype.toString() . |
Alle Internationalisierungsfunktionen deaktivieren (none
)
Wenn diese Option gewählt wird, ist ICU deaktiviert und die meisten der oben genannten Internationalisierungsfunktionen sind in der resultierenden node
-Binärdatei nicht verfügbar.
Mit einer vorinstallierten ICU bauen (system-icu
)
Node.js kann gegen eine bereits auf dem System installierte ICU-Version linken. Tatsächlich wird ICU bei den meisten Linux-Distributionen bereits mitgeliefert, und diese Option würde es ermöglichen, denselben Datensatz wiederzuverwenden, der von anderen Komponenten im Betriebssystem verwendet wird.
Funktionen, die nur die ICU-Bibliothek selbst benötigen, wie z. B. String.prototype.normalize()
und der WHATWG URL-Parser, werden unter system-icu
vollständig unterstützt. Funktionen, die zusätzlich ICU-Gebietsdaten benötigen, wie z. B. Intl.DateTimeFormat
, können vollständig oder teilweise unterstützt werden, je nachdem, wie vollständig die auf dem System installierten ICU-Daten sind.
Eine begrenzte Menge an ICU-Daten einbetten (small-icu
)
Diese Option bewirkt, dass die resultierende Binärdatei statisch gegen die ICU-Bibliothek linkt und eine Teilmenge der ICU-Daten (in der Regel nur das englische Gebietsschema) in die node
-Executable einbindet.
Funktionen, die nur die ICU-Bibliothek selbst benötigen, wie z. B. String.prototype.normalize()
und der WHATWG URL-Parser, werden unter small-icu
vollständig unterstützt. Funktionen, die zusätzlich ICU-Gebietsdaten benötigen, wie z. B. Intl.DateTimeFormat
, funktionieren im Allgemeinen nur mit dem englischen Gebietsschema:
const january = new Date(9e8);
const english = new Intl.DateTimeFormat('en', { month: 'long' });
const spanish = new Intl.DateTimeFormat('es', { month: 'long' });
console.log(english.format(january));
// Prints "January"
console.log(spanish.format(january));
// Gibt entweder "M01" oder "January" auf small-icu aus, abhängig vom Standardgebietsschema des Benutzers
// Sollte "enero" ausgeben
Dieser Modus bietet ein Gleichgewicht zwischen Funktionen und Binärdateigröße.
ICU-Daten zur Laufzeit bereitstellen
Wenn die Option small-icu
verwendet wird, können dennoch zusätzliche Gebietsschema-Daten zur Laufzeit bereitgestellt werden, sodass die JS-Methoden für alle ICU-Gebietsschemas funktionieren. Angenommen, die Datendatei ist unter /runtime/directory/with/dat/file
gespeichert, kann sie ICU entweder über:
- Die Konfigurationsoption
--with-icu-default-data-dir
zur Verfügung gestellt werden: Dies bettet nur den Standarddatenverzeichnispfad in die Binärdatei ein. Die eigentliche Datendatei wird zur Laufzeit aus diesem Verzeichnispfad geladen. - Die Umgebungsvariable
NODE_ICU_DATA
: - Den CLI-Parameter
--icu-data-dir
:
Wenn mehr als eine davon angegeben ist, hat der CLI-Parameter --icu-data-dir
die höchste Priorität, dann die Umgebungsvariable NODE_ICU_DATA
und dann die Konfigurationsoption --with-icu-default-data-dir
.
ICU kann automatisch eine Vielzahl von Datenformaten finden und laden, aber die Daten müssen für die ICU-Version geeignet und die Datei korrekt benannt sein. Der gebräuchlichste Name für die Datendatei ist icudtX[bl].dat
, wobei X
die vorgesehene ICU-Version bezeichnet und b
oder l
die Endianness des Systems angibt. Node.js kann nicht geladen werden, wenn die erwartete Datendatei nicht aus dem angegebenen Verzeichnis gelesen werden kann. Der Name der Datendatei, die der aktuellen Node.js-Version entspricht, kann mit folgender Methode berechnet werden:
`icudt${process.versions.icu.split('.')[0]}${os.endianness()[0].toLowerCase()}.dat`;
Weitere unterstützte Formate und Details zu ICU-Daten im Allgemeinen finden Sie im Artikel "ICU Data" im ICU-Benutzerhandbuch.
Das full-icu npm-Modul kann die ICU-Dateninstallation erheblich vereinfachen, indem es die ICU-Version der laufenden node
-Executable erkennt und die entsprechende Datendatei herunterlädt. Nach der Installation des Moduls über npm i full-icu
ist die Datendatei unter ./node_modules/full-icu
verfügbar. Dieser Pfad kann dann entweder an NODE_ICU_DATA
oder --icu-data-dir
übergeben werden, wie oben gezeigt, um die vollständige Intl
-Unterstützung zu aktivieren.
Die gesamte ICU einbetten (full-icu
)
Diese Option bewirkt, dass die resultierende Binärdatei statisch mit ICU verknüpft wird und einen vollständigen Satz von ICU-Daten enthält. Eine auf diese Weise erstellte Binärdatei hat keine weiteren externen Abhängigkeiten und unterstützt alle Gebietsschemas, kann aber recht groß sein. Dies ist das Standardverhalten, wenn kein --with-intl
Flag übergeben wird. Die offiziellen Binärdateien werden ebenfalls in diesem Modus erstellt.
Erkennen der Internationalisierungsunterstützung
Um zu überprüfen, ob ICU überhaupt aktiviert ist (system-icu
, small-icu
oder full-icu
), sollte es ausreichen, einfach die Existenz von Intl
zu überprüfen:
const hasICU = typeof Intl === 'object';
Alternativ funktioniert auch die Überprüfung auf process.versions.icu
, eine Eigenschaft, die nur definiert ist, wenn ICU aktiviert ist:
const hasICU = typeof process.versions.icu === 'string';
Um die Unterstützung für ein nicht-englisches Gebietsschema zu überprüfen (d.h. full-icu
oder system-icu
), kann Intl.DateTimeFormat
ein gutes Unterscheidungsmerkmal sein:
const hasFullICU = (() => {
try {
const january = new Date(9e8);
const spanish = new Intl.DateTimeFormat('es', { month: 'long' });
return spanish.format(january) === 'enero';
} catch (err) {
return false;
}
})();
Für ausführlichere Tests zur Intl
-Unterstützung können die folgenden Ressourcen hilfreich sein: