Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Salut,
Après avoir fais mes premiers pas avec le Zend Framework il y a quelques semaines, je me suis lancé dans l'écriture d'un petit tutoriel sur l'implémentation d'un site multilingue utilisant le Zend_Translate et l'adaptateur TMX.
De plus, ce tutoriel explique également comment utiliser des URL de ce type :
http://localhost/site/fr/default/Contact ou http://localhost/site/en/default/Contact
Voici le lien vers ce tutoriel :
http://www.joecarbure.com/dw2/doku.php? … _framework
Etant donné que je suis encore un novice dans l'utilisation de ce Framework, j'attends avec impatience vos remarques et suggestions
Dernière modification par acharrex (17-06-2008 20:57:45)
Hors ligne
Moi je dis: "Super boulot !!"
Très bien expliquer et très complet, ça fait plaisir.
Malheureusement je bloque tout à la fin, après avoir ajouter le router pour récuperer la variable de langue dans l'url
j'ai donc ceci dans mon bootstrap:
$controller = Zend_Controller_Front::getInstance(); $controller->setControllerDirectory('../application/default/controllers'); $controller->throwExceptions(true); // should be turned on in development time $controller->setRouter($router); /** * Setup Translation */ $language = $controller->getRequest()->getParams(); switch ($language){ case "en": $locale = new Zend_Locale("en"); break; case "fr": $locale = new Zend_Locale("fr"); break; default: $locale = new Zend_Locale("en"); break; }
Et j'ai cette vilaine erreur qui m'arrive en pleine face:
Fatal error: Call to a member function getParams() on a non-object in /home/www/zend-test/public/index.php on line 55
et la lilgne 55 c'est celle-ci:
$language = $controller->getRequest()->getParams();
Si quelqu'un à une idée du comment du pourquoi, je suis preneur
Dernière modification par Asfaloth (20-06-2008 12:21:50)
Hors ligne
Salut,
$controller->getRequest()->getParams() va te renvoyer tous les paramêtres de ta requête (module, contrôleur, action, paramêtres utilisateur, etc...) alors que tu ne souhaites récupérer que le paramêtre de la langue.
Donc, il faut que tu fasses:
$language = $controller->getRequest()->getParam('language');
A+
Hors ligne
Salut,
En effet dans le code que j'ai copié ici il ne l'était pas parce que je faisais différent test pour trouver ce qui clochait exactement, mais même en spécifiant le paramètre language, et en ajoutant (ou pas) le paramètre par défaut, je me retrouve avec la même erreur...
c'est réellement le getParam() qui bloque, car si je fait un getRequest uniquement, je n'ai aucun message d'erreur :-/
Hors ligne
Hum... le $controller->getRequest() ne peut a priori pas fonctionner dans le bootstrap. L'objet request n'est créé qu'à partir du dispatch je pense.
Je n'ai pas le temps de tester maintenant, mais ça me paraît bizarre.
Intuitivement j'aurais tendance à déplacer ce traitement dans un plugin.
A+, Philippe
Hors ligne
Super, ça marche au poil
j'aurais du y penser plus tôt, mais j'avoue ne pas encore avoir le réflexe plugin/helper
Tant que j'y suis, encore une petite question subsidiaire:
via ce plugin, plutot que de faire un appel au registry translator dans chaque controller, puis-je passer directement la methode dans mes view ?
j'ai essayé ceci (dans mon plugin à la fonction preDispatch()):
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); $viewRenderer->view->_translate = $translator;
mais il me retourne cette erreur:
Strict Standards: Creating default object from empty value in /home/www/zend-test/application/plugins/PluginTranslate.php on line 21
Ce qui est bizarre car j'ai le même code dans un autre plugin (mais en postDispatch celui-là, c'est peut-être de là que ça vient...) pour m'afficher le nombre de requete SQL dans ma page et qui fonctionne sans problème...
Hors ligne
Effectivement ce traitement devrait être fais dans un plugin. Je vais effectuer, durant le week-end, les modifications nécessaires au tutoriel afin qu'il soit correct à 100%
Dernière modification par acharrex (20-06-2008 17:20:40)
Hors ligne
philippe a écrit:
Hum... le $controller->getRequest() ne peut a priori pas fonctionner dans le bootstrap. L'objet request n'est créé qu'à partir du dispatch je pense.
Je n'ai pas le temps de tester maintenant, mais ça me paraît bizarre.
Intuitivement j'aurais tendance à déplacer ce traitement dans un plugin.
A+, Philippe
Yep, j'avais le même genre de soucis dans un autre post. Le request n'est pas créé dans le bootstrap donc impossible de récupérer les params
Sinon, pour le tutoriel, le switch est inutile puisque tu mettras par défaut "fr" dans $language.
Donc tu peux directement faire :
$locale = new Zend_Locale($language);
Dernière modification par Akis (20-06-2008 17:40:45)
Hors ligne
Le switch inutile ? Pas tout à fait puisque il faudrait tout de même contrôler si la langue passée en paramètre est prise en charge ou non. Car la langue par défaut "fr" est utilisée seulement si le paramètre "language" n'est pas défini dans l'URL.
Donc en gros, un petit test basique suffirait à remplacer le switch
Hors ligne
Salut Acharrex,
Le lien que tu donnes pour le tutoriel renvoie vers ton site et non vers le tutoriel en question. Pourrais-tu le remettre, s'il te plait?
A+
Hors ligne
-=blu3+3y3s=- a écrit:
Salut Acharrex,
Le lien que tu donnes pour le tutoriel renvoie vers ton site et non vers le tutoriel en question. Pourrais-tu le remettre, s'il te plait?
A+
Voilà c'est fait (et désolé pour dérangement)
Hors ligne
Merci beaucoup.
Ca va m'aider
Hors ligne
Salut,
Comme beaucoup me l'ont fait remarqué, il est "impossible" d'appeler la méthode getRequest() depuis le bootstrap. Donc pour régler ce problème il faut créer un plugin selon ce modèle (qui utilise l'aide de vue "Translate") :
./application/plugins/translations.php
<?php class Translations extends Zend_Controller_Plugin_Abstract { /** * * @param Zend_Controller_Request_Abstract $request */ public function preDispatch(Zend_Controller_Request_Abstract $request) { $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); $viewRenderer->initView(); $language = $request->getParam("language", null); $browserLanguage = Zend_Locale::BROWSER; $defaultLanguage = "fr"; if ( $this->checkLanguage($language) ) { $locale = new Zend_Locale($language); } else { if ( $this->checkLanguage($browserLanguage) ) { $locale = new Zend_Locale(Zend_Locale::BROWSER); } else { $locale = $defaultLanguage; } } $translator = new Zend_Translate('tmx', 'application/index/translations/translations.tmx', $locale); Zend_Registry::set('Zend_Translate', $translator); return; } private function checkLanguage($language) { $isValid = false; $languages = array ( "de", "it", "en" ); if( $language != null && in_array($language, $languages) ) { $isValid = true; } return $isValid; } }
Et depuis votre vue :
<?php echo $this->translate("messageid"); ?>
Configuration du bootstrap :
require_once('./application/plugins/translations.php'); $frontController->registerPlugin(new Translations());
Voilà, j'espère que cela vous permettra de vous en sortir
Dernière modification par acharrex (29-08-2008 17:00:57)
Hors ligne
Bonjour,
Juste une petite intervention pour proposer une autre alternative pour le choix de la langue. En tout cas c'est comme cela que je pense procéder sur mes prochains sites multilingues.
Utiliser le sous domaine.
$languages = array ( "de", "it", "en" ); list($Langue, ) = explode(".", $_SERVER['HTTP_HOST']); if( !in_array($Langue, $languages) ) { $Langue = "fr"; } $translator = new Zend_Translate('tmx', 'application/index/translations/translations.tmx', $Langue); Zend_Registry::set('Zend_Translate', $translator);
L'avantage que j'y vois est qu'il est possible de mettre ce code dans le bootstrap (pour répondre au dernier message).
Pas besoin de se soucier à passer le paramètre de langue dans l'url. Le sous domaine ne changera pas.
Pour les moteurs http://www.monsite.com et http://uk.monsite.com sont deux sites différents.
Il suffit d'utiliser Google WebmasterTools pour indiquer à Google de localiser le sous domaine "uk" dans les pages anglaises et ainsi de suite pour vos autres langues.
Perso je considères les différentes langues comme tant des sites différents. Je n'ai pas d'url identiques sur les sites fr et us.
Par exemple je ne fais pas :
http://www.monsite.com/fr/contactez-nous et http://www.monsite.com/uk/contactez-nous
mais plutôt :
http://www.monsite.com/contactez-nous et http://uk.monsite.com/contact-us
Ainsi au niveau de référencement j'essaie de bien séparer les différentes version de mon site.
Mais c'est sur qu'il faut avoir certains droits sur l'hébergement pour créer les sous-domaines et les rediriger vers le même emplacement.
Voilà En espérant avoir apporté une critique constructive
Cordialement,
Kaimite
Dernière modification par Kaimite (29-08-2008 17:50:31)
Hors ligne
Oui c'est également une bonne solution, peut-être plus propre que la mienne
Dernière modification par acharrex (29-08-2008 18:45:21)
Hors ligne
En tout cas pour moi elle me semble plus simple.
Plus propre... finalement ça revient au même.
Il y a possibilite dans Google WebmasterTools de préciser que http://www.monsite.com/uk/ doit être considéré comme étant dans les "Pages anglaises"...
Après c'est une question de goût.
Un jour j'ai un client pour qui nous avons réalisé un site en 4 langues, en fait plutôt 4 versions :
- Française
- Anglaise
- Américaine
- Portugaise
Chaque version avait un contenu différent. C'est pourquoi maintenant chaque version d'un site a ses propres URLs.
Et puis j'avoue aussi que c'est un poil plus simple à gérér que d'aller chercher la correspondance us de l'article 154 !
@++ Kaimite
Hors ligne
Pages: 1