Internazionalizzazione in PHP: creare applicazioni multilingua solide con Intl e ICU
Guida pratica per separare i testi dal codice, scegliere il locale, gestire cataloghi, plurali, numeri, valute e date con l’estensione Intl di PHP.
Rendere multilingua un’applicazione PHP non significa sostituire alcune frasi con un array. Un sistema affidabile deve separare i contenuti dall’applicazione, scegliere in modo prevedibile lingua e regione, formattare correttamente quantità, valute e date e mantenere una lingua di riserva quando una traduzione manca.
Internazionalizzazione e localizzazione
L’internazionalizzazione prepara il software a più lingue e convenzioni culturali; la localizzazione produce testi e formati per uno specifico pubblico. Il codice dovrebbe lavorare con chiavi stabili, per esempio checkout.total, mentre i cataloghi contengono le frasi tradotte. Evita di usare la frase italiana come chiave: una correzione editoriale non deve costringere a modificare il codice.
Attivare Intl e definire i locale
L’estensione intl espone in PHP le funzionalità ICU. In produzione verifica con extension_loaded('intl') e controlla la versione ICU disponibile. Usa identificatori espliciti come it-IT o pt-PT. Non affidarti al locale predefinito del server: può cambiare tra ambienti. Una whitelist evita percorsi arbitrari e valori non supportati.
I cataloghi possono essere file PHP, JSON o dati caricati da un servizio. Devono rimanere fuori dalle directory pubbliche, essere validati durante il deploy e condividere lo stesso insieme minimo di chiavi. La lingua di fallback va decisa centralmente.
Messaggi dinamici e plurali
Concatenare frammenti come “Hai ”, un numero e “ messaggi” impone l’ordine italiano anche alle altre lingue. MessageFormatter usa i pattern ICU e consente a ogni traduzione di decidere ordine, plurale e formattazione. Un catalogo italiano può contenere {count, plural, =0 {Nessun messaggio} one {# messaggio} other {# messaggi}}; quello inglese usa regole proprie. Passa valori strutturati al formatter e registra gli errori restituiti da Intl.
Numeri, valute e date
I dati vanno conservati in un formato neutro: importi in unità minime o decimal affidabili, date in UTC e codici valuta ISO. La presentazione viene applicata solo all’uscita. NumberFormatter cambia separatori e posizione del simbolo, ma non converte i tassi di cambio. IntlDateFormatter applica lingua, calendario e fuso orario esplicito.
formatCurrency(1299.90, 'EUR');
$date = new IntlDateFormatter(
$locale,
IntlDateFormatter::LONG,
IntlDateFormatter::SHORT,
'Europe/Rome'
);
echo $date->format(new DateTimeImmutable('2026-11-06 10:30:00'));
Scelta della lingua
Una precedenza semplice è: preferenza salvata dell’utente, parametro di sessione controllato, cookie firmato, intestazione Accept-Language, fallback dell’applicazione. L’intestazione del browser è un suggerimento, non un valore da inserire direttamente in un percorso. Dopo la selezione, conserva il locale canonico e genera URL coerenti, ad esempio /it/guida e /en/guide.
HTML, sicurezza e SEO
Esegui l’escaping al momento del rendering in base al contesto HTML, attributo o JavaScript. Le traduzioni non devono diventare HTML attendibile per impostazione predefinita. Imposta l’attributo lang, usa hreflang per le varianti indicizzabili e non tradurre slug o URL senza una mappa stabile.
Test e manutenzione
Automatizza controlli per JSON valido, chiavi mancanti, placeholder incompatibili e testi accidentalmente non tradotti. Prova almeno una lingua con parole lunghe e una quantità con zero, uno e molti elementi. Congela il fuso orario nei test. Monitora le chiavi mancanti senza mostrarle agli utenti e coinvolgi i traduttori con contesto e schermate.
Conclusione
Un’architettura multilingua efficace mantiene la logica indipendente dai testi e assegna a ICU la formattazione culturale. Con locale validato, cataloghi versionati, fallback esplicito e test automatici, aggiungere una lingua diventa un’attività editoriale controllata invece di una modifica rischiosa al codice.
Share
What's Your Reaction?
Like
0
Cancella like
0
Amore
0
Buffo
0
arrabbiato
0
Sad
0
Wow
0