Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour à tous,
Je souhaite obtenir des adresses de ce type pour mon site multilingue :
http://www.monsite.com/fr/moncontroller/monaction
Même controller et même action mais pour la version anglaise :
http://www.monsite.com/en/mycontroller/myaction
Je n'ai aucun soucis pour la partie langue dans l'url ('fr', 'en'). Là où je bloque c'est pour faire fonctionner l'url qui est traduite en anglais, autrement dit la partie "mycontroller/myaction".
En fait il s'agit en quelque sorte de créer un "Alias" de la vrai route qui est "moncontroller/monaction".
Je souhaite réaliser cela pour tous les controllers et actions de mon site et ce de façon automatique.
J'ai cherché un moment, sans trouver de réponse claire à cette question.
J'ai vu les liens suivants qui m'ont fait un peu avancer, mais je n'arrive toujours pas à mon objectif. Je ne comprends pas tout, je suis débutant ...
http://framework.zend.com/manual/en/zen … d-segments
http://www.z-f.fr/forum/viewtopic.php?id=3841
Mon arborescence est construite de cette façon :
application configs languages layouts modules admin frontend controllers layouts models views user plugins library public
Voici où j'en suis actuellement dans mon Bootstrap (racine) :
protected function _initTranslate() { $session = Zend_Registry::get('session'); $locale = new Zend_Locale('fr'); Zend_Registry::set('Zend_Locale', $locale); $langLocale = isset($session->lang) ? $session->lang : $locale; $translate = new Zend_Translate('array',APPLICATION_PATH.'/languages/fr_FR.php','fr'); $translate->addTranslation(APPLICATION_PATH.'/languages/en_US.php','en'); $translate->setLocale($langLocale); Zend_Registry::set('Zend_Translate', $translate); //Paramétrage du traducteur par défaut Zend_Controller_Router_Route::setDefaultTranslator($translate); return $translate; } protected function _initRoutes() { Zend_Loader::loadClass('Zend_Controller_Router_Rewrite'); $router = new Zend_Controller_Router_Rewrite(); $route = new Zend_Controller_Router_Route( "/:@language/:@controller/:@action/*", array( "language" => "fr", "module" => "frontend", "controller" => "index", "action" => "index" ) ); $route->assemble(array('controller'=>'birds', 'action'=>'list', 'language'=>'en')); $router->addRoute("birds",$route); $frontController = Zend_Controller_Front::getInstance() ; // Attribution de la route au front controller $frontController->setRouter($router); }
Je ne comprends pas le fonctionnement de assemble. Le lien vers la doc officielle que je vous ai donné plus haut pointe sur la partie "12.5.7.1.3. Translated segments". A noter que cette partie n'apparaît meme pas coté doc en français (un oubli de zend ?).
Merci à ceux qui vont se creuser la tête sur mon problème.
Dernière modification par Flizer (17-12-2009 19:26:45)
Hors ligne
L'erreur d'accès aux pages traduites venait de ma locale. Il suffit de modifier la valeur de "language" dans le Router_Route par :
"language" => Zend_Registry::get('Zend_Locale'),
Par contre je recherche toujours une solution pour que l'ensemble de mes routes soient traduites automatiquement sans créer à chaque fois une ligne spécifique :
$route->assemble(array('controller'=>'birds', 'action'=>'list', 'language'=>'en')); $router->addRoute("birds",$route);
J'aimerais dans l'idéal utiliser un array contenant les routes et les créer toutes dans cet array. Ensuite en bouclant j'espère pouvoir utiliser les 2 lignes ci dessus en y intégrant des variables qui prendrait les valeurs de mon array.
Pensez-vous que ce soit une bonne manière de faire ? ZF propose-t-il quelquechose me permettant de me faciliter le travail à ce niveau là ?
Dernière modification par Flizer (19-12-2009 18:38:38)
Hors ligne
J'essaie de passer par un plugin pour récupérer la langue présente dans l'url et la stocker dans le registre. Hors j'ai sans cesse une erreur dans mon bootstrap m'indiquant que ma clé n'existe pas.
L'erreur :
<br /> <b>Fatal error</b>: Uncaught exception 'Zend_Exception' with message 'No entry is registered for key 'Zend_Locale'' in /usr/local/library/Zend/Registry.php:147 Stack trace: #0 /var/www/projet/application/Bootstrap.php(65): Zend_Registry::get('Zend_Locale') #1 /usr/local/library/Zend/Application/Bootstrap/BootstrapAbstract.php(662): Bootstrap->_initTranslate() #2 /usr/local/library/Zend/Application/Bootstrap/BootstrapAbstract.php(615): Zend_Application_Bootstrap_BootstrapAbstract->_executeResource('translate') #3 /usr/local/library/Zend/Application/Bootstrap/BootstrapAbstract.php(579): Zend_Application_Bootstrap_BootstrapAbstract->_bootstrap(NULL) #4 /usr/local/library/Zend/Application.php(347): Zend_Application_Bootstrap_BootstrapAbstract->bootstrap(NULL) #5 /var/www/projet/public/index.php(25): Zend_Application->bootstrap() #6 {main} thrown in <b>/usr/local/library/Zend/Registry.php</b> on line <b>147</b><br />
Dans le Bootstrap.php :
$frontController = Zend_Controller_Front::getInstance(); require_once(APPLICATION_PATH . '/plugins/Translate.php'); $frontController->registerPlugin(new Plugin_Translate()); $translate->setLocale = Zend_Registry::get('Zend_Locale');
Dans le Plugin
public function routeShutdown(Zend_Controller_Request_Abstract $request) { $language = $request->getParam('language'); switch($language) { case 'en': $locale = new Zend_Locale($language); break; case 'ar': $locale = new Zend_Locale($language); break; default: $locale = new Zend_Locale('fr'); } Zend_Registry::set('Zend_Locale',$locale); }
J'ai vraiment besoin d'aide car là je bloque complètement.
Hors ligne
Zend Framework ne propose aucune solution pour accéder aux pages intérieures directement lorsque les urls sont traduites et de la forme : www.monsite.com/language/controller/action
La seule solution c'est de bidouiller. Je vais donc voir comment récupérer la langue présente dans l'url directement dans le Bootstrap.
Hors ligne
Vous avez des pistes pour faire cela ? je suis débutant, un peu d'aide sera la bienvenue. Et puis je pense que cela sera profitable à beaucoup de monde.
Dernière modification par Flizer (30-12-2009 11:46:50)
Hors ligne
Le bootstrap initialise ton application, les plugins agissent dans le cycle principale. Donc le bootstrap est exécuté avant ton plugin.
La détection devrait être fait dans un plugin en preDispatch (avant que ton action ne soit exécuté).
Dernière modification par 3uclide (31-12-2009 03:16:37)
Hors ligne
Je suis tout à fait d'accord là dessus, mais mes routes traduites ne fonctionnent pas lorsque je les créées dans un plugins.
Hors ligne
Après avoir détecter le langage dans ton plugin, il faut traduire les paramètres de ta requête.
foreach($request->getParams() as $key => $value) { $request->setParam($key, $translator->translate($value)); }
Je ne sais pas si c'est fonctionnel, mais ça montre l'idée.
Hors ligne
Je vais regarder ça 3uclide, merci. Pour le moment j'ai opté pour une solution qui me dépanne, cela me permet d'avancer plus vite.
Hors ligne
Salut,
Je recontre le même problème, enfin, moi je veux pousser un peu plus loin.
Je voudrais tenir compte des meilleurs pratiques de référencement et avoir ce type de traduction dans l'url
/fr/monControlleur/monAction/param ----> /en/myController/myAction/param
Hors, j'ai déjà utilisé une façon en créant des routes statiques pour toutes les sections, sauf que dans ce projet-ci, tout doit être dynamique...
Flizer, j'aimerais connaître ton avancement afin de m'aider à pousser le truc plus loin
Hors ligne
Toujours pas d'idée ? Car c'est moi qui bloque présentement...
Hors ligne
Même problématique pour moi, je vais essayer de creuser un peu la solution de Flizer...
Hors ligne
Pages: 1