Qualche tempo abbiamo trattato le varie metodologie di internazionalizzazione e localizzazione dei propri script in PHP. Abbiamo analizzato gettext
ed alcune soluzioni personalizzate che possono tornare utili quando si lavora su siti o applicazioni multilingua. Mentre pubblicavamo quegli articoli era in sviluppo lo Zend Framework, di cui successivamente abbiamo trattato alcune librerie. In questo articolo ci focalizziamo sulla libreria Zend_Locale, un ottimo strumento distribuito insieme allo Zend Framework che permette di internazionalizzare le proprie applicazioni.
La libreria Zend_Locale
in se è solo uno dei tanti tasselli che rendono l'internazionalizzazione e la localizzazione delle proprie applicazioni possibili; in base al paese non varia solo la lingua utilizzata ma anche il formato delle date, la moneta e molto altro, ed i vari moduli dello Zend Framework che trattano questi argomenti sono stati appositamente sviluppati per supportare questo tipo di funzionalità. In questo articolo cercherò di dare una panoramica essenziale di questo argomento, con la promessa di andare in dettaglio negli articoli successivi.
Impostazione ed utilizzo di Zend_Locale
Prima di iniziare ad utilizzare le altre classi che sono influenzate dalla lingua utilizzata, è necessario impostare correttamente Zend_Locale
in modo che istruisca correttamente le classi ad esso correlate. La scelta del locale da utilizzare è un compito molto importante, e lo Zend Framework ci viene incontro con parecchie funzionalità utili di supporto.
In primo luogo è necessario capire cosa si intende per locale: il locale non è null'altro che l'insieme di regole dipendenti dalla lingua parlata e dal paese da cui si proviene che influenza in qualche modo le applicazioni che stiamo utilizzando. Un locale è rappresentato solitamente da una lingua e da una regione, e la combinazione di queste due rappresenta un identificativo che è utilizzato per capire quale regole utilizzare per la rappresentazione dei contenuti. Nella programmazione l'impostazione del locale avviene utilizzando una stringa di cinque caratteri formata in questo modo:
{IDENTIFICATIVO LINGUA}_{IDENTIFICATIVO REGIONE}
Entrambi gli identificativi sono lunghi due caratteri, e generalmente il primo è minuscolo ed il secondo maiuscolo. Questi identificativi sono stati codificati dal consorzio che sta alla base di Unicode, e quelli considerati standard sono disponibili per la consultazione online. Per esempio la lingua italiana parlata in Italia è codificata usando it_IT, l'inglese parato in Inghilterra en_UK e l'inglese parlato in America en_US.
Partendo da questi codici in generale le librerie di localizzazione sono in grado di selezionare gli algoritmi corretti da utilizzare ove richiesto.
La selezione del locale corretto è strettamente dipendente dalle esigenze che si hanno: potrebbe essere necessario impostarla automaticamente in base alla lingua dell'utente che sta visitando il sito, o renderla selezionabile in qualche modo. In generale questi codici sono diventati uno standard ed i browser inviano informazioni sul locale dell'utente al server, facilitando il compito di chi desidera visualizzare la propria applicazione nella lingua nativa dell'utente.
Zend_Locale
deve essere impostato con un locale corretto per poter funzionare. Il locale può essere impostato esplicitamente o recuperato automaticamente da diverse fonti:
<?php require_once 'Zend/Locale.php'; // Impostazione manuale del locale $locale = new Zend_Locale( 'it_IT' ); // Impostazione automatica del locale (basata sul locale del browser dell'utente) $locale = new Zend_Locale(); // Impostazione esplicita basata sul browser (comportamento di default) $locale = new Zend_Locale( Zend_Locale::BROWSER ); // Impostazione basata sulla lingua dell'ambiente in cui il framework è in esecuzione $locale = new Zend_Locale( Zend_Locale::ENVIRONMENT ); // Impostazione basata sulla lingua con cui è stato configurato il framework $locale = new Zend_Locale( Zend_Locale::FRAMEWORK ); ?>
Qualunque sia il locale che decidiamo di utilizzare, quello che otteniamo è un'istanza di Zend_Locale che possiamo iniziare ad utilizzare. Nel caso in cui, per qualunque motivo, il locale specificato non sia corretto, possono avvenire diversi comportamenti:
- Nel caso in cui il locale sia impostato a BROWSER, lo Zend Framework cerca successivamente in ENVIRONMENT e se non trova alcun valore valido in FRAMEWORK. Lo stesso vale per le altre costanti
- Nel caso in cui la regione non sia valida, viene utilizzata solamente la lingua insieme a la ragione di default per quella lingua
- Nel caso in cui la lingua non sia valida, viene utilizzato un locale chiamato root, che contiene una serie di regole standard per la maggior parte di operazioni di localizzazione
Lo zend framework fornisce un locale di default (identificato con auto
) che è possibile utilizzare al posto di un'istanza di Zend_Locale
; questo locale speciale cerca di identificare automaticamente il corretto locale da utilizzare e nel caso non fosse possibile genera un'eccezione indicando che la ricerca automatica del locale non è andata a buon fine. Per evitare comunque lo spiacevole inconveniente di dover gestire un'eccezione ogni qualvolta per qualche motivo il locale non sia recuperabile automaticamente, è possibile specificare un locale di default da utilizzare:
<?php
require_once 'Zend/Locale.php';
Zend_Locale::setDefault( 'it' );
// Usiamo ora una delle classi che implicitamente sfruttando Zend_Locale
// senza preoccuparci di eccezioni di sorta
$data = new Zend_Date();
?>
Utilizzare Zend_Locale
Una volta impostato Zend_Locale
l'utilizzo per operazioni semplici sarà del tutto automatico. Lo Zend Framework infatti dispone di un set di classi "locale-aware" che operano in modo differente in base al locale corrente. Queste classi, come Zend_Date
per esempio o Zend_Currency
, non necessitano esplicitamente di un paramento Zend_Locale
per poter funzionare. È comunque possibile impostare manualmente il locale forzando l'utilizzo di uno differente da quello automatico passando un parametro aggiuntivo ai parametri di default del costruttore di queste classi. Vediamo un esempio nel caso in cui si voglia visualizzare la data nel formato italiano su un sito inglese:
<?php
require_once 'Zend/Locale.php';
Zend_Locale::setDefault( 'en_US' );
$italiano = new Zend_Locale( 'it_IT' );
// Impostiamo esplicitamente il locale:
$data = new Zend_Date( 'Mar 10, 2008', Zend_Date::DATES, $italiano );
?>
Oltre all'utilizzo implicito, Zend_Locale
può essere utilizzata esplicitamente per varie operazioni attraverso un set di API molto semplici. In primo luogo, dato un locale possiamo recuperare la regione e la lingua specifiche di questo locale utilizzando getLanguage
e getRegion
; i valori restituiti sono rispettivamente la parte destra e sinistra dell'identificativo del locale e possono essere utilizzati per altri obiettivi.
Una funzionalità molto utile di Zend_Locale
è che fornisce un set di traduzioni comuni di default specifiche per ogni lingua supportata. Queste traduzioni possono essere utilizzate per tradurre le parole e le espressioni più comuni nelle varie lingue, come ad esempio Sì e No, i nomi delle lingue, i nomi delle valute, i nomi relativi alle date (mesi, giorni, ...) e molto altro.
Per esempio è possibile tradurre in lingua italiana il locale utilizzato dall'utente correntemente online:
<?php require_once 'Zend/Locale.php'; Zend_Locale::setDefault( 'en_US' ); $italiano = new Zend_Locale( 'it_IT' ); $current = new Zend_Locale( 'auto' ); $list = $italiano->getTranslationList( 'language' ); echo $list[ current->getLanguage() ]; ?>
Conclusioni
Siamo arrivati alla fine del primo articolo su Zend_Locale
. In futuro tratteremo più in dettaglio questo argomento focalizzandoci maggiormente su tutte le classi che direttamente o indirettamente sono influenzate dalla lingua e dal locale impostato. Nel frattempo vi rimando all'ottima documentazione dello Zend Framework che, mese dopo mese, sta diventando sempre più completa e precisa.