9

Ich habe einige Schwierigkeiten mit der Kombination von Zend_Navigation, Zend_Translate und dem benötigten Routing.Zend_Translate - Zend_Navigation und Routing Kombinationsproblem!

Meine Site Navigation erfolgt durch Zend_Navigation basierend auf und XML-Datei. Ich habe jetzt Übersetzung auf der Website basiert auf Zend_Translate und hinzugefügt, um folgende Änderung der Routing zu dem Bootstrap hinzugefügt:

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); 

Ich habe dann eine View_Helper mit einem preDispatc Methode erstellt:

$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); 

Jetzt, wenn ich gehe zu: "site/de/Modul/Controller/Aktion" es funktioniert gut.

Wenn ich auf: "site/da/module/controller/action", die Übersetzung funktioniert gut, aber meine Links von Zend_Navigation verweist auf den Standard 'en' Sprache Link „Site/en/module2/controller2/"

Ich kann nicht herausfinden, dass Ihr at/da/Sprache. Jede Hilfe würde geschätzt werden.

Mit freundlichen Grüßen

Morten

+0

Mit welchen Parametern verwenden Sie URL() Helfer? –

+0

Wie erstellen Sie Ihre XML-Datei? –

+0

Auch Probleme mit der automatischen Übersetzung von Zend Navigation - die Dokumentation ist dabei nutzlos - oder sehr gut versteckt. –

Antwort

1

Dies gilt nicht direkt Ihre Frage beantworten. Aber Zend_View_Helper_Navigation, der View-Helfer für die Navigation, hat eine setTranslator() -Methode, die eine implizite Übersetzung der Navigations-Seiten liefert, die Sie dem Zend_Navigation-Container hinzugefügt haben.

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); 

    //... 
} 

So sparen Sie für jedes Element übersetzen manuell aufrufen zu müssen

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

, da sie automatisch durchgeführt werden, weil setTranslator() durchgeführt wurde.

1

Da Zend_Navigation_Page_Mvc nur nach Modul, Controller und Aktion sucht, sieht es so aus, als würde es nie zu einem zusätzlichen Routing Element gehen.

Eine Lösung könnte darin bestehen, eine neue Klasse wie Zend_Navigation_Page_Mvcl zu verwenden, die mit Sprache umgehen kann.

Aber es scheint ein bisschen komplex, also fand ich eine Lösung mit einer größeren Navigation, die alle Seiten in allen Sprachen enthält.

Das ist mein xml Config für die Navigation für 2 Seiten "Home", "test" in Französisch und Englisch:

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

Wie Sie es ziemlich lange nur für zwei Seiten sehen kann. Eigentlich haben Sie (Seiten + 1) x Sprachen Artikel in der Navigation

Ich habe einen 'Trick' verwendet: Die Homepage ist zweimal vorhanden.

  • einmal als Hauptmenüpunkt
  • einmal als erster Untermenüpunkt

Die Idee ist, das Untermenü zu definieren, basierend auf der ausgewählten lang angezeigt werden, und dies wird automatisch über den Router erfolgt, so dass all Sie müssen Ihrer Anwendung sagen, dass sie das Untermenü anstelle des Menüs zeichnen soll. Also hier ist die Linie, die ich für diese Verwendung in meinem Layout-Datei:

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

ich nicht sehen, wie Sie hinzugefügt, um die Zend_Navigation so hier ist mein von 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); 
} 
?> 

By the way, in dem gleichen Bootstrap.php ich die Standardsprache 'en' halten kann, ist hier mein _initRoutes():

Und für die Übersetzung ist es automatisch getan, wenn Sie Ihre Zend_Translate registriert haben. In meinem Beispiel: menu.home geben:

  • Startseite in Englisch
  • Accueil in französisch

Ich hoffe, das hilft.

Ich würde eine andere subtilere Lösung bevorzugen, aber ich habe es noch nicht gefunden.