Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour à tous,
Je suis tout nouveau sur ZF et j'ai un problème que je n'arrive pas à résoudre malgré maintes recherches ...
Je voudrais en fait que mes URLs soient traduites dans d'autres langages, comme par exemple :
nomdomaine/fr/incription/nouveau
nomdomaine/en/register/new
... HELP !
Greg.
Hors ligne
Voilà le plugin que j'utilise pour avoir mes routes dans la langue de l'utilisateur
<?php class MBGLib_Controller_Plugin_Language 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()){ $lang = $this->getBrowserLanguage(); $request->setRequestUri($request->getRequestUri() . $lang . '/'); $request->setParam('language', $lang); } // Traductions spécifiques pour les routes $translate = new Zend_Translate ('gettext', APPLICATION_PATH . '/languages/route', null, array('scan' => Zend_Translate::LOCALE_FILENAME)); 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 (!$lang = $request->getParam('language')) { $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($lang); Zend_Registry::set('Zend_Locale', $locale); // Définition de la langue du contrôleur $route = Zend_Controller_Front::getInstance()->getRouter(); $route->setGlobalParam('language', $locale->getLanguage()); // Traductions pour les textes $translate = new Zend_Translate ('gettext', APPLICATION_PATH . '/languages', null, array('scan' => Zend_Translate::LOCALE_FILENAME)); $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 $lang => $pref) { if (in_array(substr($lang, 0, 2), $this->languages)) { return substr($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; } }
Attention, il est très important de prendre un fichier de langue différent pour les routes afin de ne pas interférer avec les traductions du site !
Hors ligne
Je me permet d'upper cette discussion : comment utiliser gettext avec la traduciton des routes ? Puisqu'il est impossible d'ajouter manuellement des chaînes aux fichiers .po, je ne vois pas comment faire pour scanner les chaînse de caractère.
Hors ligne
Perso pour les chaines qui ne sont pas récupérées par gettext automatiquement je créée un fichier php bidon avec des lignes translate:
<?php translate ('chaine bidon'); ...
Dernière modification par Ithier (07-02-2011 09:48:46)
Hors ligne
merci pour ce post tres utile
Parcontre sur mon site j ai un soucis
la structure de mes pages est /lang/controller/action
pour la page d'enregistrement j ai pour le francais et l anglais
/fr/enregistrement/privee
/en/register/private
je permet a chaque page de changer de langue.
pour changer de langue j ai donc juste a faire un
href="<?php echo $this->url(array('lang'=>'en')) ?>">
mais dans ce cas l 'url devinent /en/enregistrement/prive ce qui n existe pas
comment puis je indiquer a l 'urlHelper de traduire ma demande dans une langue
merci
Dernière modification par lacha07 (20-04-2011 15:57:16)
Hors ligne
Bonjour, après une lecture du code Zend et du helper url la solution est simple
Je définie ma règle de routage
$route = new Zend_Controller_Router_Route(':lang/:@controller/:@action/*', array('controller'=>'category', 'action' => 'index', 'module'=>'default', 'lang'=>$lang));
donc le contrôleur et l action sont traduit, c est ma règle par default.
Apres cela je défini mon traducteur spécific au url avec tous les langages disponible sur ma webapp:
$routesTranslator = new Zend_Translate( 'array', $translationsroutefr,'fr'); $routesTranslator->addTranslation($translationsroutede,'de'); $routesTranslator->addTranslation($translationsrouteen,'en'); $routesTranslator->addTranslation($translationsroutees,'es'); $routesTranslator->addTranslation($translationsrouteit,'it');
donc pour ecrire un url j'utlise le url helper
$this->url(array("lang" => $langLink, "controller" =>"register", "action"=>"agency"))
en fonction de la locale du client j'aurais soit:
/fr/enregistrement/agence
/en/registration/agency
etc etc .
Par contre le problème etais de traduire l'url sur des lien permettant de changer de langue et la c'est tres simple (merci ZEND)
$this->url(array('lang'=>'it','@locale'=>'it'))
il faut juste spécifier la locale désiré avec le paramètre @locale.
Comme l application existe déjà, et donc est conséquente je ne vais pas changer tous les liens, sinon pour le paramètre :lang je me baserais sur la locale pour éviter les redondance.
Merci
Hors ligne