9

저는 Zend_Navigation, Zend_Translate 및 필요한 라우팅의 조합에 어려움을 겪고 있습니다.Zend_Translate - Zend_Navigation 및 라우팅 조합 문제!

내 사이트 탐색은 XML 파일을 기반으로 한 Zend_Navigation을 통해 이루어집니다. 지금 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); 

나는 다음 preDispatc 방법으로 View_Helper을 만들었습니다

$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/en/module/controller/action"잘 동작합니다. 내가 갈 때

: "사이트//모듈/컨트롤러/액션"번역은 잘 작동하지만 Zend_Navigation에서 내 링크는 언어 링크 "사이트//모듈 2 'EN'기본 가리키는/컨트롤러 2/"

나는 당신의 at/da/언어를 알아낼 수 없다. 도움이 될 것입니다.

종류와 관련,

모르 텐이 직접 귀하의 질문에 대답하지 않습니다

+0

url() 도우미를 사용하는 params는 무엇입니까? –

+0

XML 파일은 어떻게 작성하고 있습니까? –

+0

젠드 네비게이션의 자동 번역 관련 문제 -이 문서는이 문서에서 무용하다. –

답변

1

. 그러나 탐색을위한 뷰 도우미 인 Zend_View_Helper_Navigation에는 Zend_Navigation 컨테이너에 추가 한 탐색 페이지의 암시 적 변환을 제공하는 setTranslator() 메서드가 있습니다.

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

    //... 
} 

이 수동 setTranslator() 완료 되었기 때문에 자동으로 수행됩니다 각 항목

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

통역 전화 할 필요 절약 할 수 있습니다.

1

Zend_Navigation_Page_Mvc는 모듈, 컨트롤러 및 액션 만 검사하기 때문에 추가 라우팅 요소로 이동하지 않습니다.

한 가지 해결책은 언어를 처리 할 Zend_Navigation_Page_Mvcl과 같은 새로운 클래스를 사용하는 것입니다.

그러나 조금 복잡해 보였으므로 모든 언어의 모든 페이지가 포함 된 더 큰 탐색을 사용하여 하나의 해결책을 찾았습니다.

이의 "홈"이 페이지에 대한 탐색을위한 내 XML 설정, "테스트"입니다 프랑스어와 영어 :

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

당신은 그냥이 페이지에 대한 상당히 길어 볼 수 있듯이. 실제로는 (페이지 + 1) x 언어 항목이 내비게이션에 있습니다.

'트릭'을 사용했는데 홈페이지가 두 번 나타납니다.일단 메인 메뉴 항목으로

  • 한번 첫번째 메뉴 항목으로

    아이디어는 선택된 LANG에 기초하여 표시 할 메뉴를 정의하는 것이며,이 자동이므로 모든 라우터를 통해 이루어진다 응용 프로그램에 메뉴 대신 하위 메뉴를 그리도록 지시해야합니다.

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

    난 당신이 Bootstrap.php을 그래서 여기 Zend_Navigation을 추가 에서 내 얼마나 보지 못했다 : 그래서 여기 내 레이아웃 파일에 그것을 위해 사용하는 라인입니다

    <?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); 
    } 
    ?> 
    
    나는 'EN'에 기본 언어를 유지할 수 같은 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

  • 영어
  • 에서

    • 을 프랑스어

    에 도움이 되었기를 바랍니다.

    또 다른 미묘한 솔루션을 선호하지만 아직 찾지 못했습니다.