Programación

27/02/2012

Zend Framework – Zend_Translate + Zend_Route

More articles by »
Written by: AgeValed
Tags: , , , , ,

Les quiero compartir algo que estaba necesitando para un sitio web que estoy creando, y estuve peleando bastante para que funcione todo perfecto.

Primero que nada quiero agradecer a Jon Lebensold con la Introducción a Zend_Transalte que con la ayuda de ZendCast pude empezar a lograr hacer las cosas que quería, aca tome varias cosas para el código del Plugin de selección de Lenguaje !

La idea de esto es tener un Plugin en el sitio para que sea multilenguaje utilizando Zend_Translate y Zend_route para que cualquiera de las siguientes url funcionen (esto fue lo que mas me costo)

 

  • /:lang/:module/:controller/:action
  • /:lang/:module/:controller
  • /:lang/:module
  • /:lang
  • /:module/:controller/:action
  • /:module/:controller
  • /:module

Vamos a crear el archivo plugin para la selección del lenguaje que vamos a usar (Cortesía de Jon Lebensold). El archivo esta ubicado en /library/App/Controller/Plugin/LangSelector.php

getParam('lang','');

        if ($lang !== 'en' && $lang !== 'es')
	    $request->setParam('lang','es');

	$lang = $request->getParam('lang');

        switch ($lang) {
            case 'es':
                $locale = 'es_AR';
                break;
            case 'en':
                $locale = 'en_US';
                break;
            default:
                break;
        }

	$zl = new Zend_Locale();
	$zl->setLocale($locale);
	Zend_Registry::set('Zend_Locale', $zl);

	$translate = new Zend_Translate('csv', APPLICATION_PATH . '/config/lang/'. $lang . '.csv' , $lang);
	Zend_Registry::set('Zend_Translate', $translate);

    }

}

Luego en el archivo appliation.ini agregamos la siguiente linea.

resources.frontController.plugins.LangSelector = "App_Controller_Plugin_LangSelector"

Tenemos que crear unos archivos dentro de la carpeta /config/lang/ llamados

  • en.csv
  • es.csv

Y ahi agregar separados por coma el texto, el primero seria el que vamos a hacer referencia y el segundo la traducción. Luego el texto que queremos traducir lo llamamos de la siguiente manera

translate('Home'); ?>

Que esto sera reemplazado por lo que tengamos en nuestros archivos .csv

Ejemplo archivo es.csv;

?# Español
Home;Inicio

Ejemplo archivo en.csv;

?# Español
Home;Home

Luego en el archivo Bootstrap.php debemos agregar el siguiente codigo:

//Inicialize route
    protected function _initRouter()
    {
        //Routes
        $frontController = Zend_Controller_Front::getInstance();
        $router = $frontController->getRouter();

        // 
        $lang = new Zend_Controller_Router_Route(
                        ':lang/:module/:controller/:action',
                        array(
                            'lang' => 'es',
                            'module' => 'default',
                            'controller' => 'index',
                            'action' => 'index'
                        ),
                        array(
                            'lang' => '[a-z]{2}'
                        )
        );
        $router->addRoute('lang', $lang);
}

Nota Importante: Para el resto de los router que vayamos a crear debemos agregar un par de cosas muy importantes! aca les dejo un ejemplos

        //Route for user list
        $route = new Zend_Controller_Router_Route(
                        ':lang/admin/index',
                        array(
                            'lang' => 'es',
                            'module' => 'admin',
                            'controller' => 'index',
                            'action' => 'index'
                        ),
                        array(
                            'lang' => '[a-z]{2}'
                        )
        );
        $router->addRoute('admin_user_list', $route);

Siempre tienen que agregar en :lang del inicio, en el array agregar ‘lang’ => ‘es’ y tambien el array(‘lang’ => ‘[a-z]{2}’) así no van a tener problemas con ningún route que agreguen!

 

 

 



About the Author

AgeValed
Pablo Ignacio de la Vega Ibañez, también conocido en algunos lugares como AgeValed, el creador de este blog. Actualmente estoy trabajando como Líder Técnico y Supervisor de Equipo en el área de desarrollo PHP.




 
 

 
PHP

Doctrine2 – Getting Started Issues

Luego de querer instalar y hacer funcionar doctrine en nuestro querido y amado Windows, me encontré con un par de problemas, y por lo que vi en internet a varios le paso lo mismo, vamos a tomar como ejemplo el Doctrine –...
by AgeValed
1

 
 
PHP

Zend Framework – Almacenamiento de sesión en base de datos

En este mini tutorial voy a mostrarles como guardar la sesión en base de datos con ZF 1, esto es muy util para manejo de sesiones en un entorno con múltiples servidores. Material Relacionado Zend_Session_SaveHandler_DbTable Z...
by AgeValed
0

 
 

PHP Conference Argentina 2013

El 4 y 5 de Octubre se celebrará, en la Ciudad de Buenos Aires (Argentina), la PHP Conference Argentina, edición local de la conferencia PHP más popular. Esta edición no solamente está destinada a los programadores PHP, ...
by AgeValed
0

 

 

PHP 5.4.0 liberado!

Les comento que ya se encuentra la nueva versión de PHP liberada, la versión 5.4.0, luego de varios updates que se hicieron a la versión PHP 5.3 ya contamos con nuevas versión que incluye (según ellos) un gran núme...
by AgeValed
0

 
 

Habemus Google+ API

Luego de esperar un par de meses, y una larga espera, Google decidió hacer publica la primera releace de la API de Google+, es algo que estaba esperando desde el primer día, antes de empezar a ver bien todo lo que se puede h...
by AgeValed
2

 




12 Comentarios


  1. Ricardo

    hola buen tutorial, una duda si en el bootstrap en esta parte

    $lang = new Zend_Controller_Router_Route(
    ‘:lang/:module/:controller/:action’,
    array(
    ‘lang’ => ‘es’,
    ‘module’ => ‘default’,
    ‘controller’ => ‘index’,
    ‘action’ => ‘index’
    ),
    array(
    ‘lang’ => ‘[a-z]{2}’
    )
    );

    quiero mandar el modulo, controlador y la acción dinamicamente como seria ya que no puedo obtenerlos por request directamente el bootstrap o si?


    • No entendí bien la pregunta, pero asumo lo siguiente…

      Vos queres hacer algo como el ultimo ejemplo del tutorial? o que es lo que queres hacer?


      • Ricardo

        Si pero en vez de :

        $lang = new Zend_Controller_Router_Route(
        ‘:lang/:module/:controller/:action’,
        array(
        ‘lang’ => ‘es’,
        ‘module’ => ‘default’,
        ‘controller’ => ‘index’,
        ‘action’ => ‘index’

        Hacer algo asi:

        $lang = new Zend_Controller_Router_Route(
        ‘:lang/:module/:controller/:action’,
        array(
        ‘lang’ => ‘es’,
        ‘module’ => $module,
        ‘controller’ => $controller,
        ‘action’ => $action

        Para no tener que estar creando “routers” a mano el problema es que desde el bootstrap no se puede (o no se) como conseguir el modulo,controlador y acción que se esta ejecutando


        • Ricardo:
          No necesitas hacer eso, ya que el array lo que tomaria por defecto cuando vayas a entrar al sitio

          ejemplo:

          si vas a http://www.agevaled.com

          toma por defecto el idioma español, modulo default, controller index, action index,

          si vas a http://www.agevaled.com/admin/user

          toma por defecto el idioma español, modulo admin, controller user, action index, (por defecto solo tomaria el idioma y el action) el resto es lo que le pasaste por url.

          y asi con todo, no tenes la necesidad de crear algo como lo que pusiste. Si lo dejas tal cual esta ahí en el ejemplo, debería funcionarte perfectamente, cualquier cosa me avisas y vemos el código, te paso mi mail o dejame el tuyo.

          Saludos


  2. leo

    Como podria cambiarlo dinamicamente digamos con dropdow list de ingles español el request el uri como seria a traves del html


  3. Ricardo

    Hola que tal (unos meses después) ya utilice Zend_Translate e igual tuve problemas con los “routes” pero recordé este post y quedo solucionado :). Saludos!


  4. Ricardo

    Hola que tal!, al intentar “unir” la paginación con Zend_Paginator + Zend_routes, tuve el problema que ya no me respeta la paginación, las urls para la paginación aparecen sin los parámetros para poder cambiar de paginas, de casualidad haz tenido un problema similar?


    • Nunca me paso algo parecido, siempre uso Zend_Paginator y el Zend_Routes en casi todos los projectos, cual es el error que te esta tirando?


      • Ricardo

        Mmm error que me tire ninguno el problema es que cuando uso zend_paginator y zend_route ya no me crea la url de la paginacion con los parametros de paginación por ejemplo:

        antes de aplicar zend_routes el link al a paginación luce asi:
        /index/page/2

        y si aplico zend_routes luce asi:
        /index/

        Por lo tanto ya no puedo paginar :(, se que es un problema con los routes que hago pero no se bien cual es.

        Saludos!


        • El problema es el siguiente,

          Estas pasando como parametro de Route Page y eso hace que se rompa todo, en vez de /index/page/2 hace lo siguiente /index?page=2

          O sino tenes q empezar a agragar cosas al route para q entienda page/2



Leave a Reply

Your email address will not be published. Required fields are marked *

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.