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