9

Mam pewne trudności z połączeniem Zend_Navigation, Zend_Translate i potrzebnego routingu.Zend_Translate - problem łączenia kombinacji Zend_Navigation and Routing!

Moja nawigacja po stronie odbywa się poprzez Zend_Navigation na podstawie pliku XML. Mam teraz dodaje tłumaczenie na miejscu w oparciu o Zend_Translate i dodany do następujących zmianę trasy do bootstrap:

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

Mam następnie stworzył View_Helper z metodą 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); 

Teraz, kiedy idę do: "site/en/module/controller/action" działa poprawnie.

Kiedy idę do: "site/da/modułu/kontrolera/akcji" tłumaczenie działa dobrze, ale moje linki z Zend_Navigation jest skierowany do domyślnej 'en' Link język „site/PL/module2/controller2/"

Nie mogę dowiedzieć się, że twój/da/język. Każda pomoc byłaby przydatna.

poważaniem,

Morten

+0

W jakich paramertach używasz pomocnika url()? –

+0

jak tworzysz swój plik XML? –

+0

Masz również problemy z automatycznym tłumaczeniem Zend Navigation - dokumentacja jest bezużyteczna - lub bardzo dobrze ukryta. –

Odpowiedz

1

nie bezpośrednio odpowiedzieć na Twoje pytanie. Ale Zend_View_Helper_Navigation, helper widoku dla nawigacji, ma metodę setTranslator(), która zapewni niejawne tłumaczenie "stron" nawigacyjnych dodanych do kontenera 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); 

    //... 
} 

To oszczędza konieczności ręcznego zadzwonić przetłumaczyć dla każdej pozycji

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

jak będzie się to odbywać automatycznie, ponieważ setTranslator() zostało zrobione.

1

Ponieważ Zend_Navigation_Page_Mvc sprawdza tylko moduł, kontroler i działanie, wygląda na to, że nigdy nie przejdzie do dodatkowego elementu routingu.

Jednym z rozwiązań może być użycie nowej klasy, takiej jak: Zend_Navigation_Page_Mvcl, która będzie obsługiwać język.

Ale wydaje się nieco skomplikowane, więc znalazłem jedno rozwiązanie za pomocą większej nawigacji, która zawiera wszystkie strony we wszystkich językach.

To mój xml config do nawigacji dla 2 stron „domu”, „test” w języku francuskim i angielskim:

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

Jak widać jest to dość długo, tylko na 2 stronach. W rzeczywistości będziesz mieć (strony + 1) x elementy językowe w nawigacji

Użyłem "sztuczki": strona główna jest obecna dwa razy.

  • raz w menu głównym
  • raz jako pierwsza pozycja podmenu

Chodzi o to, aby określić, które podmenu do wyświetlenia na podstawie wybranego lang a to automatycznie odbywa się za pośrednictwem routera, więc wszystko musisz tylko powiedzieć aplikacji, aby narysowała podmenu zamiast menu. Więc tutaj jest linia używam do tego w moim pliku układu:

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

nie widzę, w jaki sposób dodaje Zend_Navigation więc tutaj jest moje od 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); 
} 
?> 

Nawiasem mówiąc, w tej samej bootstrap.php mogę zachować domyślny język „en”, tutaj jest moje _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); 
} 
?> 

Tłumaczenie jest automatycznie wykonywane, jeśli zarejestrowałeś Zend_Translate. W moim przykładzie: będzie menu.home podać:

  • Home w języku angielskim
  • Accueil w francuski

Mam nadzieję, że to pomaga.

Wolałbym inne, bardziej subtelne rozwiązanie, ale jeszcze go nie znalazłem.