Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 24-06-2010 10:19:23

omageus
Membre
Date d'inscription: 27-05-2010
Messages: 17

Zend_Translate et Zend_Controller_Router_Route::setDefaultTranslator()

Bonjour à tous,

Je travaille toujours sur mon application (pour votre plus grand malheur smile ) et suis de nouveau confronté à un problème certainement banal.

J'initialise mes routes dans mon boostrap ainsi que ma navigation et mes plugins

Code:

protected function _initNavigation()
    {
    $this->bootstrap('layout');
        $layout = $this->getResource('layout');
        $view = $layout->getView();        
        $configMenu = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
        $containerMenu = new Zend_Navigation($configMenu);
    
        if(!$this->_auth->hasIdentity()) {$view->navigation($containerMenu)->setAcl($this->_acl)->setRole('guest');}
        else $view->navigation($containerMenu)->setAcl($this->_acl)->setRole($this->_auth->getStorage()->read()->role);
    }
    

    
    protected function _initRoutes()
    {
        $router = new Zend_Controller_Router_Rewrite();
        $router->addRoute(
            "basic",
            new Zend_Controller_Router_Route(
                "/:lang/:module/:controller/:action/*",
                array(
                    //"language"=>"fr",
                    "lang"=>"fr",
                    "module"=>"index",
                    "controller"=>"index",
                    "action"=>"index")
            )
        );
         
        $frontController = Zend_Controller_Front::getInstance();
        $frontController->throwExceptions(true);
        $frontController->setRouter($router);
    }
    
    protected function _initPlugins()
    {
        $front = Zend_Controller_Front::getInstance();
        $front->registerPlugin(new monProjet_LangSelector());
    }

Le plugin contient la sélection de la langue à utiliser ainsi que le chargement des traductions

Code:

class monProjet_LangSelector
extends Zend_Controller_Plugin_Abstract
{

    
    public function routeShutdown (Zend_Controller_Request_Abstract $request)
    {
    $lang = $request->getParam('lang','');
    if ($lang !== 'en' && $lang !== 'fr')
        $request->setParam('lang','en');
    
    $lang = $request->getParam('lang');


    $zl = new Zend_Locale();
    $zl->setLocale($lang);
    Zend_Registry::set('Zend_Locale', $zl);
    $this->_langue=$lang;

    $translate = new Zend_Translate('csv', APPLICATION_PATH . '/languages/'. $lang . '.csv' , $lang);
    Zend_Registry::set('Zend_Translate', $translate);
    
    Zend_Controller_Front::getInstance()->getRouter()->setGlobalParam('lang', $lang);
    }

}

Tout ceci fonctionne presque parfaitement. La navigation est traduite, Zend_Registry::set('Zend_Translate', $translate); semble remplir son travail.

Cependant, le router lui ne traduit pas les url. D'où peut venir le problème?
La doc de Zend_Router indique bien :

Translated segments

The standard route supports translated segments. To use this feature, you have to define at least a translator (an instance of Zend_Translate) via one of the following ways:

    *

      Put it into the registry with the key Zend_Translate.
    *

      Set it via the static method Zend_Controller_Router_Route::setDefaultTranslator().
    *

      Pass it as fourth parameter to the constructor.

Une petite aide à nouveau s'il vous plaît?

Hors ligne

 

#2 30-06-2010 11:46:18

omageus
Membre
Date d'inscription: 27-05-2010
Messages: 17

Re: Zend_Translate et Zend_Controller_Router_Route::setDefaultTranslator()

Une piste s'il vous plaît?
Je n'y arrive vraiment pas sad

J'ai tenté d'intégrer le code d'un autre post, tout fonctionne sauf la traduction du routeur (encore)

Code:

<?php

class monProjet_LangSelector
extends Zend_Controller_Plugin_Abstract
{
/** Liste des langues autorisées */
    protected $languages = array('en','fr');
    
    /** Langue par défaut */
    private $_lang = 'fr';
    
    /** Pays par défaut */
    private $_country = 'FR';
    
    /**
     * Charge les routes dans la bonne langue
     * 
     * (non-PHPdoc)
     * @see Controller/Plugin/Zend_Controller_Plugin_Abstract#routeStartup($request)
     */
    public function routeStartup(Zend_Controller_Request_Abstract $request) {
        
        // Si la langue n'est pas définie dans la requete
        if (substr($request->getRequestUri(), 0, -1) == $request->getBaseUrl()){

            $this->_lang = $this->getBrowserLanguage();
            $request->setRequestUri($request->getRequestUri() . $this->_lang . '/');
            $request->setParam('lang', $this->_lang);
        }
              // Traductions spécifiques pour les routes
        $translate = new Zend_Translate('csv', APPLICATION_PATH . '/languages/'. $this->_lang . '.csv' , $this->_lang);
        Zend_Registry::set('Zend_Translate', $translate);
        Zend_Controller_Router_Route::setDefaultTranslator($translate);
    }
    
    
    /**
     * Défini la langue du site en fonction de l'url et des préférences du navigateur
     * 
     * (non-PHPdoc)
     * @see Controller/Plugin/Zend_Controller_Plugin_Abstract#routeShutdown($request)
     */
    public function routeShutdown(Zend_Controller_Request_Abstract $request)
    {
        // Test de l'url et des préférences du navigateur si on ne la connait pas déjà
        if (!$this->_lang = $request->getParam('lang'))
        {
            $this->_lang = $this->getBrowserLanguage();
        }
        
        // Récupération du pays dans les préférences du navigateur
        Zend_Registry::set('Zend_Country', $this->getBrowserCountry());
        
        // Création de la locale
        $locale = new Zend_Locale($this->_lang);
        Zend_Registry::set('Zend_Locale', $locale);
        
        // Définition de la langue du contrôleur
        $route = Zend_Controller_Front::getInstance()->getRouter();
        $route->setGlobalParam('lang', $locale->getLanguage());
        
        // Traductions pour les textes
        $translate = new Zend_Translate('csv', APPLICATION_PATH . '/languages/'. $this->_lang . '.csv' , $this->_lang);
        $translate->setLocale($locale);
        
        // Stockage dans le registre
        Zend_Registry::set('Zend_Translate', $translate);
        
        // On paramètre les modules avec la langue
        Zend_Validate_Abstract::setDefaultTranslator($translate);
        Zend_Form::setDefaultTranslator($translate);
    }
    
    /**
     * Retourne la langue du navigateur, ou la langue par défaut si l'autre n'est pas acceptée
     * 
     * @return string, La langue à appliquer 
     */
    public function getBrowserLanguage()
    {
        $langs = Zend_Locale::getBrowser();
        
        foreach ($langs as $this->_lang => $pref) {
            
            if (in_array(substr($this->_lang, 0, 2), $this->languages)) {
                
                return substr($this->_lang, 0, 2);
                
            }
        }
        return $this->_lang;
    }
    
    
    /**
     * Retourne le pays du navigateur
     * 
     * @return string, Le pays du navigateur 
     */
    public function getBrowserCountry()
    {
        $countries = Zend_Locale::getBrowser();
        
        foreach ($countries as $country => $pref) {
            
            $position = strpos($country, '_');
            if($position !== false) {
                return substr($country, $position + 1);
            }
        }
        return $this->_country;
    }

}

Dernière modification par omageus (30-06-2010 11:47:54)

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages