| Sitio de varios idiomas usando ZF [mensaje nº407] |
Sun, 18 July 2010 21:18  |
rbchv Mensajes: 7 Registrado: July 2010 |
Jedi Youngling |
|
|
Hola,
Tengo experiencia en PHP sin embargo hace unas semanas estoy leyendo sobre Zend Framework para ver que tanto facilita el desarrollo web.
Quiero hacer un sitio que va a estar disponible en varios idiomas. ZF tiene algo incorporado que me facilite hacer esto? Si no, algún approach orientado a objetos para hacerlo?
Saludos y gracias,
Rob
|
|
|
| Re: Sitio de varios idiomas usando ZF [mensaje nº408 es una respuesta al mensaje #407 ] |
Mon, 19 July 2010 09:52   |
|
Hola Rob,
Como estas?
Pues si, Zend Framework ofrece un componente que se llama Zend_Translate el cual ofrece 9 adaptadores de como hacerlo:
http://framework.zend.com/manual/en/zend.translate.adapter.h tml
yo he utilizado Array y Gettext.
Gettext (http://us3.php.net/manual/en/book.gettext.php)
Este creo que es el mas popular, he visto que Wordpress lo usa tambien para la traduccion de sitios.
El framework de Zend es muy amplio con respecto a este tema, ya que la idea es que vos no hagas un sitio con traducciones, sino que hagás un sitio completamente "localizado ( http://en.wikipedia.org/wiki/Internationalization_and_locali zation)
$translate =
new Zend_Translate(
'gettext',
'ruta_donde_esta_el_archivo_de_traducciones'
'es'
);
Ahora bien, podes combinar Zend_Translate con Zend_Locale para que tengas todo lo que necesitas con respecto a formatos de numeros, fechas nomnbre de lenguajes, etc.
Saludos,
Pablo Víquez
www.pabloviquez.com
https://twitter.com/pabloviquez
<?php echo 'If eval() is the answer, youre almost certainly asking the wrong question. - Rasmus Lerdorf'; ?>

|
|
|
|
|
| Re: Sitio de varios idiomas usando ZF [mensaje nº411 es una respuesta al mensaje #407 ] |
Mon, 19 July 2010 23:10   |
rbchv Mensajes: 7 Registrado: July 2010 |
Jedi Youngling |
|
|
Bueno para futuro referencia...
El gettext de PHP no es thread safe, sin embargo el adapter Zend_Translate_Adapter_Gettext sí lo es ya que no usa el gettext de PHP.
Tomado de aquí:
The Zend_Translate Gettext Adapter is not implemented using PHP's gettext extension. You can use the Gettext Adapter even if you do not have the PHP gettext extension installed. Also the Adapter is thread-safe and the PHP gettext extension is currently not thread-safe.
[Actualizado el: Mon, 19 July 2010 23:12]
|
|
|
|
|
| Re: Sitio de varios idiomas usando ZF [mensaje nº414 es una respuesta al mensaje #407 ] |
Thu, 22 July 2010 16:29   |
|
Hola,
ZF ofrece 2 maneras para datos persistentes... bueno +-
1. Zend_Registry, este es un componente que maneja datos y los hace accesibles a la aplicacion, pero no funciona con sesiones, es decir, si metes un dato ahi, lo podes pedir en cualquier lugar de la aplicacion PERO muere cuando la pagina termina de ejecutarse como cualquier otra variable.
2. Zend_Session, esta es la manera que ZF maneja las sesiones. Si me preguntas, yo prefiero usar Zend_Session que $_SESSION, xq? sencillamente por consistencia.
Ahora bien, guardar el objeto de "Zend_Translate" en la sesion no me gusta y no lo veo conveniente, por una razon sencilla, este contiene la traduccion que estas usando y hace que metas en la sesion un objeto muy grande.
Si lo que queres es tener en sesion el lenguaje, podrias utilizar Zend_Locale y ese si ponerlo en la session y cargar el leguaje basado en el Locale del usuario, ó si no queres complicarte con Zend_Locale, podes guardar en la sesion el lenguaje que queres y cuando cargas los diccionarios, sencillamente le pasas ese párametro.
Ahora bien, si usas cualquiera de los adaptadores de Zend_Translate, y el sitio tiene mucho trafico y el diccionario o el archivo donde estan los strings se empieza a llenar mucho, mi recomendacion es q pongas cache, ya sea con APC o Memecached.
Entonces, cargas solo una vez los diccionarios, y todas las demas veces lo sacas de memcached o apc:
http://cr.php.net/manual/en/class.memcached.php
(pseudo-codigo)
// Asumimos que la funcion devuleve la instancia de memcached
$memcache = getMemcache();
$languageToUse = 'es';
$cacheKey = "LANGKEY_{$languageToUse}";
$zendTranslate = null;
if (!($zendTranslate = $memcache->get($cacheKey))) {
$zendTranslate = new Zend_Translate(...);
$memcache->set($cacheKey, $zendTranslate);
}
Pablo Víquez
www.pabloviquez.com
https://twitter.com/pabloviquez
<?php echo 'If eval() is the answer, youre almost certainly asking the wrong question. - Rasmus Lerdorf'; ?>

|
|
|
|
| Re: Sitio de varios idiomas usando ZF [mensaje nº417 es una respuesta al mensaje #416 ] |
Mon, 09 August 2010 11:52  |
|
| rbchv escribió el Sat, 07 August 2010 13:18 | En que parte del código va esto? En el public function init() de cada controlador?
Gracias
|
Hay muchas maneras, una de ellas si es en el "init()", ahora para que no repitas codigo, perfectamente podes extender "Zend_Controller_Action" y tener un "init" comun.
Este es un ejemplo usando Memcache en el bootstrap de la aplicacion.
Publique un tiempo atras como hacer algo parecido pero usando logs y FirePHP, ahi explico como funciona el Bootstrap: Zend_Log
Espero que te ayude!
Saludos
class App_Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initCache()
{
// Usando memcache, o podes usar Zend_Cache
$cache = new Memcache();
$cache->connect('127.0.0.1', 11211);
return $cache;
}
}
class MiApp_Controlador extends Zend_Controller_Action {
public function init() {
$cache = $this->getInvokeArg('bootstrap')->getResource('cache');
$lang = 'lenguaje a usar...';
$cacheKey = __METHOD__ . "_translator_{$lang}";
if (!($translator = $cache->get($cacheKey))) {
$translator = new Zend_Translate(...);
$cache->set($cacheKey, $translator, 3600);
}
$this->initView();
$this->view->translate = $translator;
}
}
class DefaultController extends MiApp_Controlador {
}
[Actualizado el: Mon, 09 August 2010 18:35] Pablo Víquez
www.pabloviquez.com
https://twitter.com/pabloviquez
<?php echo 'If eval() is the answer, youre almost certainly asking the wrong question. - Rasmus Lerdorf'; ?>

|
|
|