Zend_Translate, esempio d'uso
Scritto Saturday 31 January 2009 alle ore 6:05
Zend Framework tra i molti oggetti messi a disposizione offre anche uno strumento per l'internazionalizzazione delle nostre applicazioni.
Zend_Translate, questo il nome dell'oggetto in questione, si poggia su diversi adattatori che permettono di usare diverse strutture di memorizzazione dati. Di seguito un riepilogo degli adapter disponibili e delle peculiarità principali.
| Adattatore | Descrizione | Uso |
|---|---|---|
| Array | Usa array php | Piccole pagine; uso semplice; solo per programmatori |
| Csv | Usa file separati da punteggiatura (*.csv/*.txt) | Semplice formato dei files; veloce; possibili problemi con caratteri unicode |
| Gettext | Uso di file binari gettexe (*.mo) | GNU standard per linux; thread-safe; necessita di strumenti per le traduzioni (ad esempio po-edit) |
| Ini | Uso di semplici files ini (*.ini) | Semplice formato dei files; veloce; possibili problemi con caratteri unicode |
| Tbx | Uso di files termbase exchange (*.tbx/*.xml) | Standard industriale per stringhe di termini nelle applicazioni; formato XML |
| Tmx | Uso di files tmx (*.tmx/*.xml) | Standard industriale per traduzione di applicazioni; formato XML; leggibile dall'uomo |
| Qt | Uso di files linguistici qt (*.ts) | Framewor per applicazioni indipendenti dalla piattaforma; formato XML; leggibile dall'uomo |
| Xliff | Uso di files xliff (*.xliff/*.xml) | Un semplice formato tipo TMX; formato XML; leggibile dall'uomo |
| XmlTm | Uso di files xmltm (*.xml) | Standard industriale per memoria di traduzione di documenti XML; formato XML; leggibile dall'uomo |
| Altri | *.sql | Altri adattatori potrebbero essere implementati in futuro |
Nel mio caso ho scelto di usare gettext come adattatore perchè ho già più volte avuto a che fare con questo sistema per le traduzioni in ambito web
Ora vediamo come usare Zend_Translate in una applicazione realizzata con il framework Zend. Per prima cosa vediamo dove sistemare i files con le traduzioni. Supponendo di avere una struttura di cartelle di questo tipo:
+---application +---data | +---languages | +---controllers | | +---account | | | it.mo | | | it.po | | | en.mo | | | en.po | | | | | ---index | | it.mo | | it.po | | en.mo | | en.po | | | ---default | it.mo | it.po | en.mo | en.po +---library +---publicho suddiviso le traduzioni in categorie. La prima, generica e legata a traduzioni comuni a tutta l'applicazione i cui files sono nella cartella:
/data/languages/defaultle altre sono specifiche al singolo controller e sono nella cartella:
/data/languages/controllers/[nome-controller]
A livello di bootstrap instanzio l'oggetto Zend_Translate e lo memorizzo nel registro con il nome Zend_Translate in modo che sia poi disponibile in automatico anche negli script di view come view helper.
- /**
- * Init translate
- */
- $translate = new Zend_Translate('gettext', '/data/languages/default/it.mo', 'it');
- Zend_Registry::set('Zend_Translate', $translate);
Ho anche fatto in modo che tutti i controller estendano un controller custom in modo da poter centralizzare alcune operazioni come il caricamento delle traduzioni specifiche del controller e rendere disponibile a tutti i controller l'oggetto Zend_Translate come membro interno.
- class CustomControllerAction extends Zend_Controller_Action
- {
- ...
- public $translate = null;
- ...
- public function init()
- {
- ...
- $this->translate = Zend_Registry::get('Zend_Translate');
- // assign the specific translation for the required controller
- $moFile = '/data/languages/controllers/' . $this->getRequest()->controller . '/it.mo';
- $this->translate->addTranslation($moFile, 'it');
- }
- $this->translate->setLocale('it');
- ...
- }
- ...
- }
A questo punto è possibile effettuare traduzioni sia a livello del singolo controller che nei template:
- // /application/controller/AccountController,php
- $this->translate->_('Account');
- // /application/view/script/account/login.pthml
- $this->translate('LOGIN_FORM_PASSWORD');