9

У меня возникли трудности с комбинацией Zend_Navigation, Zend_Translate и необходимой маршрутизации.Zend_Translate - проблема Zend_Navigation и маршрутизации!

Мое навигация по сайту осуществляется через Zend_Navigation на основе и XML-файла. Я теперь добавил перевод на сайт на основе Zend_Translate и добавлены следующие изменения маршрутизации в загрузчике:

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

Я тогда создал View_Helper с методом 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); 

Теперь, когда я перехожу к: «site/ru/module/controller/action« он отлично работает.

Когда я иду: «сайт/да/модуль/контроллер/действие» перевод работает отлично, но мои ссылки от Zend_Navigation указывает на значение по умолчанию «ан» язык ссылку «сайт/ан/module2/controller2/"

Я не могу понять, что ваш язык/da/язык. Любая помощь будет назначена.

С наилучшими пожеланиями,

Morten

+0

С какими параметрами вы используете помощник url ​​()? –

+0

как вы создаете свой XML-файл? –

+0

Также есть проблемы с автоматическим переводом Zend Navigation - документация бесполезна на этом - или очень хорошо скрыта. –

ответ

1

Это не прямо ответить на ваш вопрос. Но Zend_View_Helper_Navigation, помощник представления для навигации, имеет метод setTranslator(), который обеспечит неявный перевод страниц навигации, которые вы добавили в контейнер 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); 

    //... 
} 

Это позволяет Вам экономить вручную вызвать перевод для каждого элемента

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

, как это будет сделано автоматически, так как setTranslator) было сделано (.

1

Поскольку Zend_Navigation_Page_Mvc проверяет только модуль, контроллер и действие, похоже, что он никогда не перейдет к дополнительному элементу маршрутизации.

Одним из решений может быть использование нового класса, такого как Zend_Navigation_Page_Mvcl, который будет обрабатывать язык.

Но это кажется немного сложным, поэтому я нашел одно решение, используя большую навигацию, которая включает в себя все страницы на всех языках.

Это мой XML-конфигурации для навигации для 2-х страниц «дома», «тест» на французском и английском:

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

Как вы можете видеть, что это довольно долго только для 2-х страниц. На самом деле у вас есть (страницы + 1) x Языки элементов в навигации

Я использовал «трюк»: домашняя страница присутствует дважды.

  • один раз в качестве пункта главного меню
  • один раз как первый пункт подменю

Идея заключается в том, чтобы определить, какие подменю отображения на основе выбранного Ланг и это происходит автоматически через маршрутизатор, так что все вам нужно сказать, чтобы ваше приложение рисовало подменю вместо меню. Так вот линия я использую для этого в моем файле макета:

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

Я не видел, как вы добавили Zend_Navigation так вот мое от 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); 
} 
?> 

Кстати, в том же bootstrap.php я могу держать язык по умолчанию «ан», вот мой _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); 
} 
?> 

И для перевода это делается автоматически, если вы зарегистрировали свой Zend_Translate. В моем примере: menu.home даст:

  • Главная на английском языке
  • Accueil на французском

Я надеюсь, что это помогает.

Я предпочел бы еще одно более тонкое решение, но пока не нашел его.

Смежные вопросы