El siguiente paso es usar el adaptador dentro de su código.
Ejemplo 74.1. Ejemplo de código PHP de un solo idioma
print "Example\n";
print "=======\n";
print "Here is line one\n";
print "Today is the " . date("d.m.Y") . "\n";
print "\n";
print "Here is line two\n";
El ejemplo anterior muestra cierta salida sin soporte para traducción. Probablemente usted escribe su código en su idioma nativo. Generalmente necesita traducir no solo la salida, sino también los mensajes de error y de registro (log).
El siguiente paso es integrar Zend_Translate en su código
existente. Por supuesto, es mucho más fácil si ya hubiera escrito su código
pensando en la traducción, que modificar su código después.
Ejemplo 74.2. Ejemplo de código PHP multilingüe
$translate = new Zend_Translate(
array(
'adapter' => 'gettext',
'content' => '/my/path/source-de.mo',
'locale' => 'de'
)
);
$translate->addTranslation(
array(
'content' => '/path/to/translation/fr-source.mo',
'locale' => 'fr'
)
);
print $translate->_("Example") . "\n";
print "=======\n";
print $translate->_("Here is line one") . "\n";
printf($translate->_("Today is the %1\$s") . "\n", date('d.m.Y'));
print "\n";
$translate->setLocale('fr');
print $translate->_("Here is line two") . "\n";
Ahora echemos un vistazo más profundo a lo que se ha hecho y cómo
integrar Zend_Translate en su propio código.
Cree un nuevo objeto Zend_Translate y defina el adaptador base:
$translate = new Zend_Translate
array(
'adapter' => 'gettext',
'content' => '/path/to/translation/source-de.mo',
'locale' => 'de'
)
);
En este ejemplo elegimos el Adaptador Gettext. Colocamos nuestro archivo source-de.mo en el directorio /path/to/translation. El archivo gettext incluirá la traducción al alemán, y también añadimos otra fuente de idioma para el francés.
El siguiente paso es envolver todas las cadenas que se van a traducir. El enfoque más simple es tener solo cadenas o frases simples como esta:
print $translate->_("Example") . "\n";
print "=======\n";
print $translate->_("Here is line one") . "\n";
Algunas cadenas no necesitan ser traducidas. La línea separadora siempre es una línea separadora, incluso en otros idiomas.
Tener valores de datos integrados en una cadena de traducción también se admite mediante el uso de parámetros incrustados.
printf($translate->_("Today is the %1\$s") . "\n", date("d.m.Y"));
En lugar de print(), use la función
printf() y reemplace todos los parámetros con partes
%1\$s. El primero es %1\$s,
el segundo es %2\$s,
y así sucesivamente. De esta forma una traducción puede hacerse sin conocer
el valor exacto. En nuestro ejemplo, la fecha es siempre el día actual,
pero la cadena puede traducirse sin el conocimiento del día
actual.
Cada cadena se identifica en el almacén de traducción mediante un ID de mensaje. Puede usar IDs de mensaje en lugar de cadenas en su código, así:
print $translate->_(1) . "\n"; print "=======\n"; print $translate->_(2) . "\n";
Pero hacer esto tiene varias desventajas:
No puede ver qué debería mostrar su código simplemente viendo su código.
Además tendrá problemas si algunas cadenas no están traducidas.
Siempre debe tener presente cómo funciona la traducción.
Primero Zend_Translate comprueba si el idioma especificado tiene una
traducción para el ID de mensaje o cadena dado.
Si no se encuentra ninguna cadena de traducción, recurre al siguiente
nivel inferior de idioma según lo definido dentro de Zend_Locale.
Así "de_AT" se convierte en
solo "de".
Si tampoco se encuentra ninguna traducción para
"de",
entonces se devuelve el mensaje original.
De esta forma siempre tiene una salida, incluso en caso de que la traducción del
mensaje no exista en su almacén de mensajes.
Zend_Translate nunca lanza un error o excepción al traducir
cadenas.
Su siguiente paso es crear las fuentes de traducción para los idiomas que desea traducir. Cada adaptador se crea a su propia manera como se describe aquí, pero hay características comunes aplicables a todos los adaptadores.
Debe decidir dónde almacenar sus archivos de fuentes de traducción.
Usando Zend_Translate no está restringido de ninguna forma.
Las siguientes estructuras son preferibles:
-
Fuente de estructura única
/application/ /languages/ /languages/lang.en /languages/lang.de /library/
Positivo: todos los archivos de fuente para cada idioma se almacenan en un directorio. Sin división de archivos relacionados.
-
Fuente estructurada por idioma
/application/ /languages/ /languages/en/ /languages/en/first.en /languages/en/second.en /languages/de/ /languages/de/first.de /languages/de/second.de /library
Positivo: cada idioma se almacena en su propio directorio. Traducción sencilla, ya que cada equipo de idioma solo tiene que traducir un directorio. Además, el uso de múltiples archivos es transparente.
-
Fuente estructurada por aplicación
/application/ /application/languages/ /application/languages/first.en /application/languages/first.de /application/languages/second.en /application/languages/second.de /library/
Positivo: todos los archivos de fuente para cada idioma se almacenan en un directorio. Sin división de archivos relacionados.
Negativo: tener múltiples archivos para el mismo idioma puede ser problemático.
-
Fuente estructurada al estilo gettext
/application/ /languages/ /languages/de/ /languages/de/LC_MESSAGES/ /languages/de/LC_MESSAGES/first.mo /languages/de/LC_MESSAGES/second.mo /languages/en/ /languages/en/LC_MESSAGES/ /languages/en/LC_MESSAGES/first.mo /languages/en/LC_MESSAGES/second.mo /library/
Positivo: las fuentes gettext existentes pueden usarse sin cambiar la estructura.
Negativo: tener subdirectorios anidados puede resultar confuso para las personas que no han usado gettext antes.
-
Fuente estructurada por archivo
/application/ /application/models/ /application/models/MyModel.php /application/models/MyModel.de /application/models/MyModel.en /application/controllers/ /application/controllers/MyController.php /application/controllers/MyController.de /application/controllers/MyController.en /library/
Positivo: los archivos de traducción están ubicados cerca de su fuente.
Negativo: demasiados archivos de traducción pequeños resultan en que sea tedioso traducir. Además cada archivo debe añadirse como fuente de traducción.
Los archivos de fuente estructurados de forma única y por idioma son los más
utilizables para Zend_Translate.
Así que ahora, ya que sabemos qué estructura queremos tener, deberíamos crear nuestros archivos de fuente de traducción.