Prise en charge de l'internationalisation
Node.js possède de nombreuses fonctionnalités qui facilitent l'écriture de programmes internationalisés. En voici quelques-unes :
Fonctions sensibles aux paramètres régionaux ou compatibles Unicode dans la spécification du langage ECMAScript :
Toutes les fonctionnalités décrites dans la spécification de l'API d'internationalisation ECMAScript (alias ECMA-402) :
- Objet
Intl
- Méthodes sensibles aux paramètres régionaux comme
String.prototype.localeCompare()
etDate.prototype.toLocaleString()
- Objet
Prise en charge des noms de domaine internationalisés (IDN) de l'analyseur d'URL WHATWG
Édition de ligne REPL plus précise
Node.js et le moteur V8 sous-jacent utilisent International Components for Unicode (ICU) pour implémenter ces fonctionnalités dans du code natif C/C++. L'ensemble complet de données ICU est fourni par Node.js par défaut. Cependant, en raison de la taille du fichier de données ICU, plusieurs options sont fournies pour personnaliser l'ensemble de données ICU lors de la compilation ou de l'exécution de Node.js.
Options de compilation de Node.js
Pour contrôler l'utilisation d'ICU dans Node.js, quatre options configure
sont disponibles lors de la compilation. Des détails supplémentaires sur la façon de compiler Node.js sont documentés dans BUILDING.md.
--with-intl=none
/--without-intl
--with-intl=system-icu
--with-intl=small-icu
--with-intl=full-icu
(par défaut)
Aperçu des fonctionnalités Node.js et JavaScript disponibles pour chaque option configure
:
Fonctionnalité | none | system-icu | small-icu | full-icu |
---|---|---|---|---|
String.prototype.normalize() | aucune (la fonction est une opération sans effet) | complète | complète | complète |
String.prototype.to*Case() | complète | complète | complète | complète |
Intl | aucune (l'objet n'existe pas) | partielle/complète (dépend du système d'exploitation) | partielle (anglais uniquement) | complète |
String.prototype.localeCompare() | partielle (non sensible aux paramètres régionaux) | complète | complète | complète |
String.prototype.toLocale*Case() | partielle (non sensible aux paramètres régionaux) | complète | complète | complète |
Number.prototype.toLocaleString() | partielle (non sensible aux paramètres régionaux) | partielle/complète (dépend du système d'exploitation) | partielle (anglais uniquement) | complète |
Date.prototype.toLocale*String() | partielle (non sensible aux paramètres régionaux) | partielle/complète (dépend du système d'exploitation) | partielle (anglais uniquement) | complète |
Analyseur d'URL hérité | partielle (pas de prise en charge IDN) | complète | complète | complète |
Analyseur d'URL WHATWG | partielle (pas de prise en charge IDN) | complète | complète | complète |
require('node:buffer').transcode() | aucune (la fonction n'existe pas) | complète | complète | complète |
REPL | partielle (édition de ligne imprécise) | complète | complète | complète |
require('node:util').TextDecoder | partielle (prise en charge des encodages de base) | partielle/complète (dépend du système d'exploitation) | partielle (Unicode uniquement) | complète |
RegExp Escapes de propriétés Unicode | aucune (erreur RegExp invalide) | complète | complète | complète |
La désignation « (non sensible aux paramètres régionaux) » indique que la fonction effectue son opération exactement comme la version non Locale
de la fonction, si elle existe. Par exemple, en mode none
, l'opération de Date.prototype.toLocaleString()
est identique à celle de Date.prototype.toString()
.
Désactiver toutes les fonctionnalités d'internationalisation (none
)
Si cette option est choisie, ICU est désactivé et la plupart des fonctionnalités d'internationalisation mentionnées ci-dessus seront indisponibles dans le binaire node
résultant.
Build avec un ICU pré-installé (system-icu
)
Node.js peut être lié à une version d'ICU déjà installée sur le système. En fait, la plupart des distributions Linux sont déjà fournies avec ICU installé, et cette option permettrait de réutiliser le même jeu de données utilisé par d'autres composants du système d'exploitation.
Les fonctionnalités qui ne nécessitent que la bibliothèque ICU elle-même, telles que String.prototype.normalize()
et l'analyseur d'URL WHATWG, sont entièrement prises en charge sous system-icu
. Les fonctionnalités qui nécessitent en plus des données de localisation ICU, telles que Intl.DateTimeFormat
, peuvent être entièrement ou partiellement prises en charge, selon l'exhaustivité des données ICU installées sur le système.
Intégrer un ensemble limité de données ICU (small-icu
)
Cette option fait que le binaire résultant lie statiquement la bibliothèque ICU et inclut un sous-ensemble de données ICU (généralement uniquement les données de localisation anglaise) dans l'exécutable node
.
Les fonctionnalités qui ne nécessitent que la bibliothèque ICU elle-même, telles que String.prototype.normalize()
et l'analyseur d'URL WHATWG, sont entièrement prises en charge sous small-icu
. Les fonctionnalités qui nécessitent en plus des données de localisation ICU, telles que Intl.DateTimeFormat
, fonctionnent généralement uniquement avec les données de localisation anglaise :
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))
// Affiche "January"
console.log(spanish.format(january))
// Affiche soit "M01" soit "January" sur small-icu, selon les paramètres régionaux par défaut de l'utilisateur
// Devrait afficher "enero"
Ce mode offre un équilibre entre les fonctionnalités et la taille du binaire.
Fournir des données ICU au moment de l'exécution
Si l'option small-icu
est utilisée, il est toujours possible de fournir des données de localisation supplémentaires au moment de l'exécution afin que les méthodes JS fonctionnent pour toutes les localisations ICU. En supposant que le fichier de données est stocké à /runtime/directory/with/dat/file
, il peut être mis à disposition d'ICU via :
- L'option de configuration
--with-icu-default-data-dir
: Cela n'intègre que le chemin du répertoire de données par défaut dans le binaire. Le fichier de données réel sera chargé au moment de l'exécution à partir de ce chemin de répertoire. - La variable d'environnement
NODE_ICU_DATA
: - Le paramètre CLI
--icu-data-dir
:
Lorsque plusieurs d'entre eux sont spécifiés, le paramètre CLI --icu-data-dir
a la priorité la plus élevée, puis la variable d'environnement NODE_ICU_DATA
, puis l'option de configuration --with-icu-default-data-dir
.
ICU est capable de trouver et de charger automatiquement une variété de formats de données, mais les données doivent être appropriées à la version d'ICU, et le fichier correctement nommé. Le nom le plus courant pour le fichier de données est icudtX[bl].dat
, où X
désigne la version ICU souhaitée, et b
ou l
indique l'endianness du système. Node.js échouera au chargement si le fichier de données attendu ne peut pas être lu depuis le répertoire spécifié. Le nom du fichier de données correspondant à la version actuelle de Node.js peut être calculé avec :
;`icudt${process.versions.icu.split('.')[0]}${os.endianness()[0].toLowerCase()}.dat`
Consultez l'article "Données ICU" du guide de l'utilisateur ICU pour les autres formats pris en charge et plus de détails sur les données ICU en général.
Le module npm full-icu peut grandement simplifier l'installation des données ICU en détectant la version ICU de l'exécutable node
en cours d'exécution et en téléchargeant le fichier de données approprié. Après avoir installé le module via npm i full-icu
, le fichier de données sera disponible à ./node_modules/full-icu
. Ce chemin peut ensuite être passé à NODE_ICU_DATA
ou --icu-data-dir
comme indiqué ci-dessus pour activer la prise en charge complète de Intl
.
Intégrer l'intégralité d'ICU (full-icu
)
Cette option fait en sorte que le fichier binaire résultant lie statiquement ICU et inclut un ensemble complet de données ICU. Un fichier binaire créé de cette manière n'a pas d'autres dépendances externes et prend en charge toutes les localisations, mais il peut être assez volumineux. C'est le comportement par défaut si aucun indicateur --with-intl
n'est passé. Les fichiers binaires officiels sont également construits de cette manière.
Détection de la prise en charge de l'internationalisation
Pour vérifier qu'ICU est activé (system-icu
, small-icu
ou full-icu
), il suffit de vérifier l'existence de Intl
:
const hasICU = typeof Intl === 'object'
Alternativement, la vérification de process.versions.icu
, une propriété définie uniquement lorsque ICU est activé, fonctionne également :
const hasICU = typeof process.versions.icu === 'string'
Pour vérifier la prise en charge d'une localisation autre que l'anglais (c'est-à-dire full-icu
ou system-icu
), Intl.DateTimeFormat
peut être un bon facteur distinctif :
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
}
})()
Pour des tests plus verbeux de la prise en charge d'Intl, les ressources suivantes peuvent être utiles :