9

Tengo algunas dificultades con la combinación de Zend_Navigation, Zend_Translate y el enrutamiento necesario.Zend_Translate - Zend_Navigation and Routing ¡problema de combinación!

La navegación de mi sitio se realiza a través de Zend_Navigation en base a un archivo XML. Ahora he añadido traducción al sitio basado en Zend_Translate y se añade a continuación el cambio de encaminamiento a la rutina de carga:

protected function _initRoutes() 

    $config = new Zend_Config($this->getOptions()); 
    $languages = array_keys($config->languages->toArray()); 
    $zl = new Zend_Locale(); 
    $lang = in_array($zl->getLanguage(), $languages) 
        ? $zl->getLanguage() : 'en'; 

    $zfc = Zend_Controller_Front::getInstance(); 


    // add language to default route 
    $route = new Zend_Controller_Router_Route(
      ':lang/:module/:controller/:action/*', 
     array('controller'=>'index', 
       'action' => 'index', 
       'module'=>'default', 
       'lang'=>$lang)); 

    $router = $zfc->getRouter(); 
    $router->addRoute('default', $route); 
    $zfc->setRouter($router); 

continuación, he creado un View_Helper con un método preDispatc:

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

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

$language = $request->getParam('lang'); 
if ($language == 'en') 
    $locale = 'en_EN'; 
else 
    $locale = 'da_DK'; 

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

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

Ahora cuando voy a: "site/en/module/controller/action" funciona bien.

Cuando voy a: "sitio/da/módulo/controlador/acción" la traducción funciona bien, pero mis enlaces de Zend_Navigation está apuntando a los valores predeterminados 'es' enlace del idioma del sitio /" en/modulo2/controller2/"

No puedo entender que su at/da/language. Cualquier ayuda se apruebe.

Saludos cordiales,

Morten

+0

¿Con qué params usas url() helper? –

+0

¿cómo está creando su archivo XML? –

+0

También tiene problemas con la traducción automática de Zend Navigation, la documentación es inútil en esto, o está muy bien escondida. –

Respuesta

1

Esto no responde directamente a su pregunta. Pero Zend_View_Helper_Navigation, view helper for navigation, tiene un método setTranslator() que proporcionará una traducción implícita de las 'páginas' de navegación que ha agregado al contenedor Zend_Navigation.

class MyModule_Bootstrap extends Zend_Application_Module_Bootstrap 
{ 
    protected function _initMyModuleNavigation() 
    { 
    $langSess = new Zend_Session_Namespace('language'); 
    $translate = $langSess->translate; 

    $this->getApplication()->bootstrap('navigation'); 

    $view = $this->getApplication()->getResource('view'); 

    $navigationHelper = $view->getHelper('navigation'); 

    $navigation = $navigationHelper->getContainer(); 

    $navigationHelper->setTranslator($translate); 

    //... 
} 

Esto le ahorra tener que llamar manualmente a traducir para cada elemento

$navigation->addPages(array(
     new Zend_Navigation_Page_Mvc(array(
      'label' => $translate->_('Wiki'), //<-- This can be eliminated 
      'action' => 'index', 
      'controller' => 'article', 
      'module' => 'wiki', 
      'pages' => //... 

ya que se hará automáticamente porque setTranslator) se hizo (.

1

Debido a que Zend_Navigation_Page_Mvc solo comprueba Módulo, Controlador y Acción, parece que nunca irá a un elemento de enrutamiento adicional.

Una solución podría ser utilizar una nueva clase como: Zend_Navigation_Page_Mvcl que manejará el idioma.

Pero parece un poco complejo, así que encontré una solución usando una navegación más grande que incluye todas las páginas en todos los idiomas.

Esta es mi configuración XML para la navegación por páginas 2 "casa", "prueba" en francés e Inglés:

<?xml version="1.0" encoding="UTF-8"?> 
<config> 
    <nav> 
     <fr> 
      <label>menu.home</label> 
      <params> 
       <lang>fr</lang> 
      </params> 
      <action>index</action> 
      <controller>homepage</controller> 
      <route>langcontrolleraction</route> 
      <pages> 
       <home> 
        <label>menu.home</label> 
        <params> 
         <lang>fr</lang> 
        </params> 
        <action>index</action> 
        <controller>homepage</controller> 
        <route>langcontrolleraction</route> 
       </home> 
       <test> 
        <label>menu.wallet</label> 
        <params> 
         <lang>fr</lang> 
        </params> 
        <action>index</action> 
        <controller>wallet</controller> 
        <route>langcontrolleraction</route> 
       </test> 
      </pages> 
     </fr> 
     <en> 
      <label>menu.home</label> 
      <params> 
       <lang>en</lang> 
      </params> 
      <action>index</action> 
      <controller>homepage</controller> 
      <route>langcontrolleraction</route> 
      <pages> 
       <home> 
        <label>menu.home</label> 
        <params> 
         <lang>en</lang> 
        </params> 
        <action>index</action> 
        <controller>homepage</controller> 
        <route>langcontrolleraction</route> 
       </home> 
       <test> 
        <label>menu.wallet</label> 
        <params> 
         <lang>en</lang> 
        </params> 
        <action>index</action> 
        <controller>wallet</controller> 
        <route>langcontrolleraction</route> 
       </test> 
      </pages> 
     </en> 
    </nav> 
</config> 

Como se puede ver que es bastante largo sólo por 2 páginas. En realidad, tendrá (páginas + 1) x elementos de idiomas en la navegación

Utilicé un 'truco': la página de inicio está presente dos veces.

  • vez como elemento del menú principal
  • vez como elemento de primer submenú

La idea es definir qué submenú para mostrar basa en el idioma seleccionado y esto se hace de forma automática a través del router, por lo que todo lo que tienes que hacer es decirle a tu aplicación que dibuje el submenú en lugar del menú. Así que aquí es la línea que utilizo para que en mi archivo diseño:

<?php 
echo $this->navigation()->menu()->renderSubMenu() 
?> 

que no veía cómo ha agregado el Zend_Navigation Así que aquí está la mina de Bootstrap.php:

<?php 
protected function _initNavigation() { 
    $config = new Zend_Config_Xml(Zend_Registry::get ('config') 
      ->resources->navigation->file, 'nav'); 
    $navigationContainer = new Zend_Navigation($config); 
    // Store the container in the proxy helper: 
    $view = $this->getResource ('view'); 
    $view->getHelper('navigation')->setContainer($navigationContainer); 
} 
?> 

Por cierto, en la misma Bootstrap.php puedo mantener el idioma por defecto a 'es', aquí está mi _initRoutes ():

<?php 
protected function _initRoutes() { 
    $router = Zend_Controller_Front::getInstance()->getRouter(); 
    $router->removeDefaultRoutes(); 
    $myRoute = new Zend_Controller_Router_Route (
     ':lang/:controller/:action', 
     array (
      'lang' => 'en', 
      'controller' => 'index', 
      'action' => 'index', 
     ) 
    ); 
    $router->addRoute ('langcontrolleraction', $myRoute); 
} 
?> 

Y para la traducción se hace automáticamente si registró su Zend_Translate. En mi ejemplo: menu.home dará:

  • Inicio en Inglés
  • Accueil en francés

espero que esto ayude.

Preferiría otra solución más sutil pero no la encontré todavía.

Cuestiones relacionadas