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.

Internazionalizzazione in PHP: creare applicazioni multilingua solide con Intl e ICU

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 Like 0
Cancella like Cancella like 0
Amore Amore 0
Buffo Buffo 0
arrabbiato arrabbiato 0
Sad Sad 0
Wow Wow 0