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

मैं तो एक 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); 

अब जब मैं जाता हूं: "साइट/en/मॉड्यूल/नियंत्रक/क्रिया" यह ठीक काम करता है।

जब मैं करने के लिए जाना: "साइट/दा/मॉड्यूल/नियंत्रक/कार्रवाई" अनुवाद ठीक काम करता है, लेकिन Zend_Navigation से अपने लिंक डिफ़ॉल्ट 'en' भाषा लिंक "साइट/एन/module2 की ओर इशारा करते है/नियंत्रक 2/"

मुझे पता नहीं है कि आपकी at/da/language है। किसी भी मदद की सराहना की जाएगी।

सधन्यवाद,

मोर्टेन

+0

आप किस यूआरएल() सहायक का उपयोग करते हैं? –

+0

आप अपनी एक्सएमएल फाइल कैसे बना रहे हैं? –

+0

ज़ेंड नेविगेशन के स्वचालित अनुवाद के साथ भी समस्याएं हैं - दस्तावेज़ीकरण इस पर बेकार है - या बहुत अच्छी तरह छुपा हुआ है। –

उत्तर

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 जो भाषा को संभालेगा।

लेकिन यह थोड़ा जटिल लगता है इसलिए मुझे एक बड़ी नेविगेशन का उपयोग करके एक समाधान मिला जिसमें सभी भाषाओं में सभी पेज शामिल हैं।

2 पृष्ठों के लिए "घर" नेविगेशन के लिए मेरी xml config, "परीक्षण" में है फ्रेंच और अंग्रेजी:

<?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 पृष्ठों के लिए है देख सकते हैं। असल में आपके पास नेविगेशन में

मैंने 'चाल' का उपयोग किया था: मुखपृष्ठ दो बार मौजूद है।

  • एक बार मुख्य मेनू आइटम के रूप में
  • एक बार पहले सबमेनू आइटम के रूप में

विचार जो सबमेनू चयनित लैंग के आधार पर प्रदर्शन करने को परिभाषित करने और यह स्वचालित रूप से, रूटर के माध्यम से किया जाता है ताकि सभी आपको मेनू के बजाए सबमेनू खींचने के लिए अपने आवेदन को बताना है।

<?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 में

    • होम फ्रेंच

    में मुझे उम्मीद है कि इस मदद करता है।

    मैं एक और अधिक सूक्ष्म समाधान पसंद करूंगा लेकिन मुझे अभी तक यह नहीं मिला।

  • संबंधित मुद्दे