Supporto per l'internazionalizzazione
Node.js ha molte funzionalità che semplificano la scrittura di programmi internazionalizzati. Alcune di queste sono:
Funzioni sensibili alle impostazioni locali o compatibili con Unicode nella Specifiche del linguaggio ECMAScript:
Tutte le funzionalità descritte nella Specifiche dell'API di internazionalizzazione di ECMAScript (aka ECMA-402):
- Oggetto
Intl
- Metodi sensibili alle impostazioni locali come
String.prototype.localeCompare()
eDate.prototype.toLocaleString()
- Oggetto
Supporto dei nomi di dominio internazionalizzati (IDN) del parser WHATWG URL
Modifica della riga REPL più accurata
Node.js e il motore V8 sottostante utilizzano International Components for Unicode (ICU) per implementare queste funzionalità in codice C/C++ nativo. Il set di dati ICU completo viene fornito da Node.js per impostazione predefinita. Tuttavia, a causa delle dimensioni del file di dati ICU, sono disponibili diverse opzioni per la personalizzazione del set di dati ICU durante la compilazione o l'esecuzione di Node.js.
Opzioni per la compilazione di Node.js
Per controllare come viene utilizzata ICU in Node.js, sono disponibili quattro opzioni configure
durante la compilazione. Ulteriori dettagli su come compilare Node.js sono documentati in BUILDING.md.
--with-intl=none
/--without-intl
--with-intl=system-icu
--with-intl=small-icu
--with-intl=full-icu
(predefinito)
Una panoramica delle funzionalità di Node.js e JavaScript disponibili per ciascuna opzione configure
:
Funzionalità | none | system-icu | small-icu | full-icu |
---|---|---|---|---|
String.prototype.normalize() | nessuna (la funzione non opera) | completa | completa | completa |
String.prototype.to*Case() | completa | completa | completa | completa |
Intl | nessuna (l'oggetto non esiste) | parziale/completa (dipende dal sistema operativo) | parziale (solo inglese) | completa |
String.prototype.localeCompare() | parziale (non sensibile alle impostazioni locali) | completa | completa | completa |
String.prototype.toLocale*Case() | parziale (non sensibile alle impostazioni locali) | completa | completa | completa |
Number.prototype.toLocaleString() | parziale (non sensibile alle impostazioni locali) | parziale/completa (dipende dal sistema operativo) | parziale (solo inglese) | completa |
Date.prototype.toLocale*String() | parziale (non sensibile alle impostazioni locali) | parziale/completa (dipende dal sistema operativo) | parziale (solo inglese) | completa |
Legacy URL Parser | parziale (nessun supporto IDN) | completa | completa | completa |
WHATWG URL Parser | parziale (nessun supporto IDN) | completa | completa | completa |
require('node:buffer').transcode() | nessuna (la funzione non esiste) | completa | completa | completa |
REPL | parziale (modifica della riga imprecisa) | completa | completa | completa |
require('node:util').TextDecoder | parziale (supporto codifiche di base) | parziale/completa (dipende dal sistema operativo) | parziale (solo Unicode) | completa |
RegExp Unicode Property Escapes | nessuna (errore RegExp non valido) | completa | completa | completa |
La designazione "(non sensibile alle impostazioni locali)" indica che la funzione esegue la sua operazione proprio come la versione non-Locale
della funzione, se esistente. Ad esempio, in modalità none
, l'operazione di Date.prototype.toLocaleString()
è identica a quella di Date.prototype.toString()
.
Disabilita tutte le funzionalità di internazionalizzazione (none
)
Se si sceglie questa opzione, ICU viene disabilitato e la maggior parte delle funzionalità di internazionalizzazione menzionate sopra non saranno disponibili nel file binario node
risultante.
Compila con una ICU preinstallata (system-icu
)
Node.js può collegarsi a una build ICU già installata sul sistema. Infatti, la maggior parte delle distribuzioni Linux hanno già ICU installato e questa opzione consentirebbe di riutilizzare lo stesso set di dati utilizzato da altri componenti del sistema operativo.
Funzionalità che richiedono solo la libreria ICU stessa, come String.prototype.normalize()
e il parser WHATWG URL, sono completamente supportate in system-icu
. Funzionalità che richiedono anche i dati locali ICU, come Intl.DateTimeFormat
potrebbero essere completamente o parzialmente supportate, a seconda della completezza dei dati ICU installati sul sistema.
Incorpora un set limitato di dati ICU (small-icu
)
Questa opzione fa sì che il file binario risultante si colleghi staticamente alla libreria ICU e include un sottoinsieme di dati ICU (in genere solo la locale inglese) all'interno dell'eseguibile node
.
Funzionalità che richiedono solo la libreria ICU stessa, come String.prototype.normalize()
e il parser WHATWG URL, sono completamente supportate in small-icu
. Le funzionalità che richiedono inoltre i dati locali ICU, come Intl.DateTimeFormat
, generalmente funzionano solo con la locale inglese:
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))
// Stampa "January"
console.log(spanish.format(january))
// Stampa "M01" o "January" su small-icu, a seconda delle impostazioni locali predefinite dell'utente
// Dovrebbe stampare "enero"
Questa modalità fornisce un equilibrio tra funzionalità e dimensioni del file binario.
Fornire dati ICU a runtime
Se si utilizza l'opzione small-icu
, è comunque possibile fornire dati di localizzazione aggiuntivi a runtime in modo che i metodi JS funzionino per tutte le localizzazioni ICU. Supponendo che il file di dati sia archiviato in /runtime/directory/with/dat/file
, può essere reso disponibile a ICU tramite:
- L'opzione di configurazione
--with-icu-default-data-dir
: questa incorpora solo il percorso della directory dei dati predefinito nel binario. Il file di dati effettivo verrà caricato a runtime da questo percorso di directory. - La variabile d'ambiente
NODE_ICU_DATA
: - Il parametro CLI
--icu-data-dir
:
Quando ne viene specificato più di uno, il parametro CLI --icu-data-dir
ha la precedenza più alta, seguito dalla variabile d'ambiente NODE_ICU_DATA
, quindi dall'opzione di configurazione --with-icu-default-data-dir
.
ICU è in grado di trovare e caricare automaticamente una varietà di formati di dati, ma i dati devono essere appropriati per la versione ICU e il file deve essere denominato correttamente. Il nome più comune per il file di dati è icudtX[bl].dat
, dove X
indica la versione ICU prevista e b
o l
indica l'endianness del sistema. Node.js non verrà caricato se il file di dati previsto non può essere letto dalla directory specificata. Il nome del file di dati corrispondente alla versione corrente di Node.js può essere calcolato con:
;`icudt${process.versions.icu.split('.')[0]}${os.endianness()[0].toLowerCase()}.dat`
Consulta l'articolo "Dati ICU" nella Guida per l'utente di ICU per altri formati supportati e maggiori dettagli sui dati ICU in generale.
Il modulo npm full-icu può semplificare notevolmente l'installazione dei dati ICU rilevando la versione ICU dell'eseguibile node
in esecuzione e scaricando il file di dati appropriato. Dopo aver installato il modulo tramite npm i full-icu
, il file di dati sarà disponibile in ./node_modules/full-icu
. Questo percorso può essere quindi passato a NODE_ICU_DATA
o --icu-data-dir
come mostrato sopra per abilitare il supporto completo di Intl
.
Incorporare l'intera ICU (full-icu
)
Questa opzione fa sì che il binario risultante si colleghi staticamente a ICU e includa un set completo di dati ICU. Un binario creato in questo modo non ha ulteriori dipendenze esterne e supporta tutte le impostazioni locali, ma potrebbe essere piuttosto grande. Questo è il comportamento predefinito se non viene passato alcun flag --with-intl
. Anche i binari ufficiali sono costruiti in questa modalità.
Rilevamento del supporto per l'internazionalizzazione
Per verificare che ICU sia abilitata del tutto (system-icu
, small-icu
o full-icu
), dovrebbe essere sufficiente controllare l'esistenza di Intl
:
const hasICU = typeof Intl === 'object'
In alternativa, anche controllare process.versions.icu
, una proprietà definita solo quando ICU è abilitata, funziona:
const hasICU = typeof process.versions.icu === 'string'
Per verificare il supporto per una localizzazione non inglese (ovvero full-icu
o system-icu
), Intl.DateTimeFormat
può essere un buon fattore distintivo:
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
}
})()
Per test più dettagliati sul supporto di Intl
, le seguenti risorse possono essere utili: