Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour à tous,
Je travaille toujours sur mon application (pour votre plus grand malheur ) et suis de nouveau confronté à un problème certainement banal.
J'initialise mes routes dans mon boostrap ainsi que ma navigation et mes plugins
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
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
Une piste s'il vous plaît?
Je n'y arrive vraiment pas
J'ai tenté d'intégrer le code d'un autre post, tout fonctionne sauf la traduction du routeur (encore)
<?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
Pages: 1