Programación

27/02/2012

Zend Framework – Zend_Translate + Zend_Route

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

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

Zend Framework – Mail Templates usando Zend_Mail & Zend_View

Me pareció útil compartir esta función con el resto de los programadores, esta función no es de mi autoría, el creador es Jonathan Street, yo solamente la arregle un poco ya que tenia un par de errores, le agregue una fu...
by AgeValed
2

 
 

ZendCon 2010 Podcast – Introducción Zend Framework 2.0

Acá les dejo una introducción sobre Zend Framework 2.0, una charla en ZendCom 2010 Podcast, los oradores de la charla fueron Ralph Schindler (Penn) y Matthew Weier O’Phinney (Teller). Presentación: Audio: Las sesiones ...
by AgeValed
0

 
 
PHP

Zend Framework Screencasts by Jon Lebensold

Zend Framework Screencasts by Jon Lebensold (2008-2010) | 4GB English | MPEG4 Video (H264) 800?540 | AAC 44100Hz stereo 96Kbps Con estos screencasts, vamos a crear una aplicación web con Zend Framework, aprenderá a crear proy...
by AgeValed
3

 

 
PHP

10 motivos para usar Zend Framework

Ayer leí un post muy interesante, que me gustaría compartir con ustedes, ya que últimamente el blog esta semi abandonado, ya que como algunos saben, y otros no, cambio de trabajo por un par de motivos personales, y ademas es...
by AgeValed
1

 
 
PHP

Zend Framework – Configuración e Instalación

Esta es la segunda entrega de la saga “Zend Framework”, en una nota anterior “Zend Framework – Estructura de Directorios, Esqueleto & Modelo MVC!” podemos encontrar como es un esqueleto en Zend y ...
by AgeValed
8

 




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



Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*