9

Tôi gặp một số khó khăn khi kết hợp Zend_Navigation, Zend_Translate và định tuyến cần thiết.Zend_Translate - Zend_Navigation và định tuyến sự cố kết hợp!

Điều hướng trang web của tôi được thực hiện thông qua Zend_Navigation dựa trên và tệp XML. bây giờ tôi đã thêm dịch đến các trang web dựa trên Zend_Translate và thêm vào sau thay đổi định tuyến để 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); 

sau đó tôi đã tạo ra một View_Helper với một phương pháp 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); 

Bây giờ khi tôi đi đến: "site/vi/module/controller/action" nó hoạt động tốt.

Khi tôi đi đến: "Trang web/da/module/controller/action" bản dịch hoạt động tốt, nhưng liên kết của tôi từ Zend_Navigation được trỏ đến mặc định 'en' liên kết ngôn ngữ "trang web/en/module2/controller2/"

Tôi không thể biết được rằng bạn/at/da/language. Bất kỳ trợ giúp nào sẽ được đánh giá cao.

Trân trọng!

Morten

+0

Với thông số nào bạn sử dụng url() helper? –

+0

cách bạn tạo tệp XML của mình? –

+0

Ngoài ra có vấn đề với bản dịch tự động của Zend Navigation - tài liệu là vô ích về điều này - hoặc rất tốt ẩn. –

Trả lời

1

này không trực tiếp trả lời câu hỏi của bạn. Nhưng Zend_View_Helper_Navigation, trình trợ giúp xem cho điều hướng, có phương thức setTranslator() sẽ cung cấp bản dịch ngầm định của các trang 'điều hướng' mà bạn đã thêm vào thùng chứa 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); 

    //... 
} 

này giúp bạn tiết kiệm phải tự gọi dịch cho từng hạng mục

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

vì nó sẽ được thực hiện tự động bởi vì setTranslator() đã được thực hiện.

1

Vì Zend_Navigation_Page_Mvc chỉ kiểm tra Mô-đun, Bộ điều khiển và Hành động, có vẻ như nó sẽ không bao giờ đi đến phần tử định tuyến bổ sung.

Một giải pháp có thể là sử dụng một lớp mới như: Zend_Navigation_Page_Mvcl sẽ xử lý ngôn ngữ.

Nhưng có vẻ hơi phức tạp nên tôi tìm thấy một giải pháp bằng cách sử dụng điều hướng lớn hơn bao gồm tất cả các trang bằng tất cả các ngôn ngữ.

Đây là cấu hình của tôi xml để điều hướng cho 2 trang "nhà", "thử nghiệm" trong tiếng Pháp và tiếng Anh:

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

Như bạn có thể thấy nó khá dài chỉ dành riêng cho 2 trang. Thực tế bạn sẽ có (trang + 1) x mục ngôn ngữ trong điều hướng

Tôi đã sử dụng 'thủ thuật': trang chủ hiện diện hai lần.

  • một lần như mục menu chính
  • một lần như mục menu con đầu tiên

Ý tưởng là để xác định những menu con để hiển thị dựa trên lang lựa chọn và điều này được tự động thực hiện thông qua các bộ định tuyến, vì vậy tất cả bạn phải làm là để nói cho ứng dụng của bạn để vẽ menu phụ thay vì menu. Vì vậy, đây là dòng tôi sử dụng cho rằng trong tôi tập bố trí:

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

Tôi không thấy làm thế nào bạn thêm Zend_Navigation vì vậy đây là của tôi từ 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); 
} 
?> 

Bằng cách này, trong cùng Bootstrap.php tôi có thể giữ ngôn ngữ mặc định để 'en', đây là _initRoutes của tôi():

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

Và để dịch tự động được thực hiện nếu bạn đã đăng ký Zend_Translate. Trong ví dụ của tôi: menu.home sẽ cung cấp cho:

  • Home bằng tiếng Anh
  • Accueil ở Pháp

Tôi hy vọng điều này sẽ giúp.

Tôi thích một giải pháp tinh tế hơn nhưng tôi chưa tìm thấy giải pháp đó.

Các vấn đề liên quan