Skip to content

Supporto per l'internazionalizzazione

Node.js possiede molte funzionalità che facilitano la scrittura di programmi internazionalizzati. Alcune di queste sono:

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 è fornito da Node.js per impostazione predefinita. Tuttavia, a causa delle dimensioni del file di dati ICU, sono disponibili diverse opzioni per personalizzare il set di dati ICU durante la compilazione o l'esecuzione di Node.js.

Opzioni per la compilazione di Node.js

Per controllare come ICU viene utilizzato 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ànonesystem-icusmall-icufull-icu
String.prototype.normalize()nessuno (la funzione è un no-op)completocompletocompleto
String.prototype.to*Case()completocompletocompletocompleto
Intlnessuno (l'oggetto non esiste)parziale/completo (dipende dal sistema operativo)parziale (solo inglese)completo
String.prototype.localeCompare()parziale (non consapevole della localizzazione)completocompletocompleto
String.prototype.toLocale*Case()parziale (non consapevole della localizzazione)completocompletocompleto
Number.prototype.toLocaleString()parziale (non consapevole della localizzazione)parziale/completo (dipende dal sistema operativo)parziale (solo inglese)completo
Date.prototype.toLocale*String()parziale (non consapevole della localizzazione)parziale/completo (dipende dal sistema operativo)parziale (solo inglese)completo
Legacy URL Parserparziale (nessun supporto IDN)completocompletocompleto
WHATWG URL Parserparziale (nessun supporto IDN)completocompletocompleto
require('node:buffer').transcode()nessuno (la funzione non esiste)completocompletocompleto
REPLparziale (modifica della riga imprecisa)completocompletocompleto
require('node:util').TextDecoderparziale (supporto codifiche di base)parziale/completo (dipende dal sistema operativo)parziale (solo Unicode)completo
RegExp Unicode Property Escapesnessuno (errore RegExp non valido)completocompletocompleto
La designazione "(non consapevole della localizzazione)" indica che la funzione esegue la sua operazione proprio come la versione non Locale della funzione, se esiste. Ad esempio, in modalità none, l'operazione di Date.prototype.toLocaleString() è identica a quella di Date.prototype.toString().

Disabilitare 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 binario node risultante.

Compilare con una ICU preinstallata (system-icu)

Node.js può collegarsi a una build di ICU già installata sul sistema. Infatti, la maggior parte delle distribuzioni Linux sono già dotate di ICU installato e questa opzione consentirebbe di riutilizzare lo stesso set di dati utilizzato da altri componenti del sistema operativo.

Le funzionalità che richiedono solo la libreria ICU stessa, come String.prototype.normalize() e il parser URL WHATWG, sono pienamente supportate in system-icu. Le funzionalità che richiedono anche i dati locali ICU, come Intl.DateTimeFormat, potrebbero essere supportate completamente o parzialmente, a seconda della completezza dei dati ICU installati sul sistema.

Incorporare un insieme limitato di dati ICU (small-icu)

Questa opzione fa sì che il binario risultante si colleghi staticamente alla libreria ICU e includa un sottoinsieme di dati ICU (in genere solo le impostazioni locali inglesi) all'interno dell'eseguibile node.

Le funzionalità che richiedono solo la libreria ICU stessa, come String.prototype.normalize() e il parser URL WHATWG, sono pienamente supportate in small-icu. Le funzionalità che richiedono anche i dati locali ICU, come Intl.DateTimeFormat, generalmente funzionano solo con le impostazioni locali inglesi:

js
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));
// 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 binario.

Fornire dati ICU a runtime

Se si utilizza l'opzione small-icu, è comunque possibile fornire dati locali aggiuntivi a runtime in modo che i metodi JS funzionino per tutte le impostazioni locali 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 predefinita 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, quindi la variabile d'ambiente NODE_ICU_DATA, quindi l'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:

js
`icudt${process.versions.icu.split('.')[0]}${os.endianness()[0].toLowerCase()}.dat`;

Consulta l'articolo "ICU Data" 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ò quindi essere passato a NODE_ICU_DATA o --icu-data-dir come mostrato sopra per abilitare il supporto completo Intl.

Incorpora l'intera ICU (full-icu)

Questa opzione fa sì che il binario risultante si colleghi a ICU staticamente e includa un set completo di dati ICU. Un binario creato in questo modo non ha ulteriori dipendenze esterne e supporta tutte le localizzazioni, 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 abilitato (indipendentemente dal fatto che sia system-icu, small-icu o full-icu), dovrebbe essere sufficiente controllare l'esistenza di Intl:

js
const hasICU = typeof Intl === 'object';

In alternativa, anche controllare process.versions.icu, una proprietà definita solo quando ICU è abilitato, funziona:

js
const hasICU = typeof process.versions.icu === 'string';

Per verificare il supporto per una localizzazione non inglese (ad esempio, full-icu o system-icu), Intl.DateTimeFormat può essere un buon fattore distintivo:

js
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 del supporto Intl, le seguenti risorse potrebbero essere utili:

  • btest402: Generalmente utilizzato per verificare se Node.js con supporto Intl è costruito correttamente.
  • Test262: La suite di test di conformità ufficiale di ECMAScript include una sezione dedicata a ECMA-402.