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
+---public
ho 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/default
le 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.

  1. /**
  2.  * Init translate
  3.  */
  4. $translate = new Zend_Translate('gettext', '/data/languages/default/it.mo', 'it');
  5. 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.

  1. class CustomControllerAction extends Zend_Controller_Action
  2. {
  3.     ...
  4.  
  5.     public $translate = null;
  6.  
  7.     ...
  8.  
  9.     public function init()
  10.     {
  11.  
  12.         ...
  13.  
  14.         $this->translate = Zend_Registry::get('Zend_Translate');
  15.         // assign the specific translation for the required controller
  16.         $moFile = '/data/languages/controllers/' . $this->getRequest()->controller . '/it.mo';
  17.         if(file_exists($moFile)) {
  18.             $this->translate->addTranslation($moFile, 'it');
  19.         }
  20.         $this->translate->setLocale('it');
  21.  
  22.         ...
  23.  
  24.     }
  25.  
  26.     ...
  27.  
  28. }

A questo punto è possibile effettuare traduzioni sia a livello del singolo controller che nei template:

  1. // /application/controller/AccountController,php
  2. $this->translate->_('Account');
  3.  
  4. // /application/view/script/account/login.pthml
  5. $this->translate('LOGIN_FORM_PASSWORD');

Commenti:

Inserisci il tuo commento