Zend_Translate - Zend_Navigation ve Yönlendirme kombinasyonu sorun!

2 Cevap php

Ben Zend_Navigation, Zend_Translate ve gerekli yönlendirme kombinasyonu ile bazı zorluklar yaşıyorum.

My site navigation is done through Zend_Navigation based on and XML file. I've now added translation to the site based on Zend_Translate and added to following change of routing to the 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);

Sonra bir preDispatc yöntemi ile bir View_Helper yarattık:

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

Ben gittiğimde Şimdi: "site / en / modül / denetleyicisi / eylem" iyi çalışıyor.

Ben gittiğimde: "site / da / modül / denetleyicisi / eylem" çeviri çalışıyor, ama Zend_Navigation benim bağlantılar 'tr' varsayılan işaret dili link "site / {[(1) ]} / module2/controller2 / "

I cant figure out to know that your at /da/ language. Any help would be appriciated.

Saygılarımızla,

Morten

2 Cevap

Bu doğrudan cevap vermez. Ama Zend_View_Helper_Navigation, navigasyon için görünüm yardımcı, sen Zend_Navigation konteyner eklediğiniz navigasyon sayfaları 'örtük çeviri sağlayacak bir setTranslator () yöntemi vardır.

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

    //...
}

Bu el her madde için tercüme aramak zorunda kaydeder

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

setTranslator () yapıldı çünkü otomatik olarak yapılacaktır gibi.

Ek yönlendirme elemanı gider asla gibi Zend_Navigation_Page_Mvc sadece Modülü, Kontrolör ve Eylem denetler görünüyor çünkü.

Dil idare edecek Zend_Navigation_Page_Mvcl: Bir çözüm gibi yeni bir sınıf kullanmak olabilir.

Ama bu yüzden tüm dillerde tüm sayfaları içeren daha büyük bir navigasyonu kullanarak bir çözüm buldum biraz karmaşık gibi görünüyor.

Bu 2 sayfa "ev" için navigasyon için benim xml yapılandırma, Fransızca ve İngilizce "test" dir:

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

As you can see it's quite long just for 2 pages. Actually you will have (pages + 1) x languages items in the navigation

Anasayfa kez mevcut: Ben bir 'hile' kullandı.

  • gibi bir kez ana menü öğesi
  • bir kere ilk olarak alt menü öğesi

Fikir seçilen lang dayalı görüntülemek ve bu otomatik olarak router üzerinden yapılıyor, bu yüzden yapmanız gereken tüm menü yerine alt menüsüne çizmek için uygulamayı anlatmak için hangi alt tanımlamaktır. Yani burada benim bunun için kullanabileceğiniz çizgidir layout file:

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

Sana Zend_Navigation işte mayın katma nasıl görmek Bootstrap.php etmedi:

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

Bu arada, aynı Bootstrap.php Ben burada, 'tr' için varsayılan dili tutabilir benim _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 );
}
?>

Eğer Zend_Translate kayıtlı olmadığını ve çeviri için otomatik olarak yapılır. Benim örnekte: menu.home verecektir:

  • Home ingilizce
  • Accueil fransızca

Bu yardımcı olur umarım.

Başka daha ince bir çözümü tercih ederim ama henüz bulamadık.