dissabte, 29 d’agost del 2009

Aplicacions multiidioma amb valors de programa.

A Corretgé.com fa temps que vam apostar per a la utilització de gettext per a la internacionalització de les nostres aplicacions.

La facilitat a l'hora de distribuir les cadenes de l'aplicació a traductors, amb arxius .po que personal no informàtic pot traduir, ha estat determinant.

El mòdul Zend_Translate del Zend Framework ha simplificat moltíssim la configuració del sistema multiidioma, llegint el arxius .mo, la compilació dels .po creats amb poEdit, sense haver d'instal·lar rés al sistema, i el que és més important, sense haver de respectar l'arbre de carpetes que requeria el mòdul gettext de php.

Amb la següent tècnica, podrem a més a més indicar valors variables a les cadenes a traduir:

/**
* certifiquem en fase de construcció que el control existeixi.
*/
if (!method_exists($this, $this->control))
{
throw new UbqException(sprintf($this->strl->_("*UBQ0002 - No existeix el controlador %s."), $this->control));
}


En aquest cas concret, la classe Zend_Transalte està instanciada a la propietat strl de la classe mestre de l'aplicació. El mètode gettext es pot cridar com a gettext o com a _. El poEdit recupera les cadenes automàticament emprant els dos mètodes.

La funció sprintf és l'encarregada de les substitucions, actua com pritf però retornant la cadena enlloc de posar-la al buffer de sortida.

Els paràmetres de sprintf, en aquest cas la propietat control, substitueixen els valors de substitució, en aquest cas %s.

Així, la cadena quedarà traduida d'aquesta manera dins l'arxiu .po :

#: app/app.abstract.php:65
#, php-format
msgid "*UBQ0002 - No existeix el controlador %s."
msgstr "*UBQ0002 - Controller %s does not exist."


gettext té una gestió de plurals per als valors de substitució numèrics molt complerta i amb suport amb plurals complexos com els de les llengües eslaves.