Inicio » PHP & *AMP » PHP Frameworks » Sitio de varios idiomas usando ZF
Sitio de varios idiomas usando ZF [mensaje nº407] Sun, 18 July 2010 21:18 Ir al mensaje siguiente
rbchv no está actualmente en el foro 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 Ir al mensaje anteriorIr al mensaje siguiente
pviquez no está actualmente en el foro pviquez
Mensajes: 148
Registrado: February 2008
Ubicación: Sabanilla de Montes de Oc...
Jedi Master
Administrator

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'; ?>
PHP Logo MySQL Logo
Re: Sitio de varios idiomas usando ZF [mensaje nº409 es una respuesta al mensaje #408 ] Mon, 19 July 2010 11:19 Ir al mensaje anteriorIr al mensaje siguiente
rbchv no está actualmente en el foro rbchv
Mensajes: 7
Registrado: July 2010
Jedi Youngling

Ok buenisimo, voy a leerme esto.

Es un sitio bastante simple entonces seguramente voy por los arrays. Sin embargo aqui un usuario dice lo siguiente:

Tim
08-Oct-2009 04:25
As a reminder, this is not thread-safe and will not work on typical windows/apache installs.

Use a multiprocess cgi implementation or just don't use it.


Hay algo de verdad en esto?

Gracias,

Rob
Re: Sitio de varios idiomas usando ZF [mensaje nº410 es una respuesta al mensaje #407 ] Mon, 19 July 2010 11:28 Ir al mensaje anteriorIr al mensaje siguiente
rbchv no está actualmente en el foro rbchv
Mensajes: 7
Registrado: July 2010
Jedi Youngling

Esto contradice esta pagina, que dice

Gettext Use binary gettext (*.mo) files GNU standard for linux; thread-safe; needs tools for translation


vOv
Re: Sitio de varios idiomas usando ZF [mensaje nº411 es una respuesta al mensaje #407 ] Mon, 19 July 2010 23:10 Ir al mensaje anteriorIr al mensaje siguiente
rbchv no está actualmente en el foro 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º412 es una respuesta al mensaje #411 ] Wed, 21 July 2010 15:01 Ir al mensaje anteriorIr al mensaje siguiente
pviquez no está actualmente en el foro pviquez
Mensajes: 148
Registrado: February 2008
Ubicación: Sabanilla de Montes de Oc...
Jedi Master
Administrator

rbchv escribió el Mon, 19 July 2010 23:10

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.


Cool, yo use el adaptador gettext en windows (en desarrollo) y funciono.

Arrays es una buena opcion Smile


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'; ?>
PHP Logo MySQL Logo
Re: Sitio de varios idiomas usando ZF [mensaje nº413 es una respuesta al mensaje #407 ] Thu, 22 July 2010 13:34 Ir al mensaje anteriorIr al mensaje siguiente
rbchv no está actualmente en el foro rbchv
Mensajes: 7
Registrado: July 2010
Jedi Youngling

Una pregunta adicional...

En sitios que habia a puro PHP lo que hacía era settear una variable de session que me indicaba el idioma escogido por el usuario.

Es recomendable usar las sessiones de ZF de igual forma o el framework provee alguna solucion mejor?

Gracias de nuevo
Re: Sitio de varios idiomas usando ZF [mensaje nº414 es una respuesta al mensaje #407 ] Thu, 22 July 2010 16:29 Ir al mensaje anteriorIr al mensaje siguiente
pviquez no está actualmente en el foro pviquez
Mensajes: 148
Registrado: February 2008
Ubicación: Sabanilla de Montes de Oc...
Jedi Master
Administrator

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'; ?>
PHP Logo MySQL Logo
Re: Sitio de varios idiomas usando ZF [mensaje nº416 es una respuesta al mensaje #408 ] Sat, 07 August 2010 13:18 Ir al mensaje anteriorIr al mensaje siguiente
rbchv no está actualmente en el foro rbchv
Mensajes: 7
Registrado: July 2010
Jedi Youngling
pviquez escribió el Mon, 19 July 2010 09:52



$translate =
    new Zend_Translate(
        'gettext',
        'ruta_donde_esta_el_archivo_de_traducciones'
        'es'
    );






En que parte del código va esto? En el public function init() de cada controlador?
Rolling Eyes

Gracias
Re: Sitio de varios idiomas usando ZF [mensaje nº417 es una respuesta al mensaje #416 ] Mon, 09 August 2010 11:52 Ir al mensaje anterior
pviquez no está actualmente en el foro pviquez
Mensajes: 148
Registrado: February 2008
Ubicación: Sabanilla de Montes de Oc...
Jedi Master
Administrator

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?
Rolling Eyes

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'; ?>
PHP Logo MySQL Logo
Hilo de discusión anterior:Ayuda con Router en ZF
Ir al foro:
  


Fecha y hora actual: Mon Sep 6 19:27:00 CST 2010

Tiempo total que tardó la generación de la página: 0.09291 segundos
.:: Contacto :: Principal ::.

Powered by: FUDforum 2.7.7.
Copyright ©2001-2007 FUD Forum Bulletin Board Software