Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1 2
Bonjour à tous,
Je débute dans l'utilisation du ZF et je me pose quelques question sur les moyens de faire un site multilingue.
1)
Tout d'abord, je ne sais pas comment mettre en place une URL qui permet de connaitre la langue d'utilisation du site.
Je suis pour l'instant sous cette forme:
www.monsite.com/:module/:controller/:action
et je souhaiterais avoir ceci.
www.monsite.com/:langue/:module/:controller/:action
Mais je ne sais pas comment rajouter un élément dans l'url qui sera utilisable sur tout le site.
2)
Comment gérer la traduction des différentes pages?
J'ai entendu parler de la fonction translate de ZF permettant de stocker les textes dans différentes langues dans des fichiers sous forme de tableau.
Je pense utiliser les fichiers CSV mais je n'ai pas assez de recule là dessus pour savoir si c'est facilement utilisable sur le long terme.
Ensuite, je ne sais pas comment on peut stocker un texte avec une mise en page (lien, gras, italique) en utilisant ce moyen.
Pouvez vous me donner des pistes sur ces différentes questions?
Merci d'avance.
Dernière modification par slaughter (15-04-2008 20:30:41)
Hors ligne
Bonjour,
personnellement j'utilise plusieurs systèmes
au niveau du layout, j'initialise un fichier Traduction en fonction de la langue du visiteur ( auto détection grâce a Zend_Translate )
$T = new Zend_Translate(Zend_Translate::AN_ARRAY, $this->layout()->getLayoutPath().'/lang'); echo $T->_('YOU_ARE_HERE');
lang/layout_en.php
<?php return array( 'YOU_ARE_HERE' => 'You are here', ); ?>
lang/layout_fr.php
<?php return array( 'YOU_ARE_HERE' => 'Vous êtes ici', ); ?>
en ce qui concerne la mise en place des URL, il faut regarder du coté de Zend_Router
( jetter un oeil ici aussi http://www.z-f.fr/forum/viewtopic.php?id=178 )
une fois que c'est fait il faudra donc spécifier la langue dans le constructeur
$lang = 'fr'; $T = new Zend_Translate(Zend_Translate::AN_ARRAY, $this->layout()->getLayoutPath().'/lang/layout_'.$lang, $lang); echo $T->_('YOU_ARE_HERE');
c'est un exemple, il existe d'autres manières d'organiser la traduction.
Pistes:
Zend_Translate
Zend_Router
Dernière modification par lethak (10-04-2008 08:52:18)
Hors ligne
Merci pour ces infos,
Qu'est ce que tu appelles "layout"?
Dans ton exemple de translate (you are here). Tu utilises cette phrase comme clé, c'est a dire que si tu veux changer cette phrase (en anglais) par "hello, you are here !", la correspondance en français ne va pas suivre...
Pour moi, tout ça n'est pas encore très clair.
Hors ligne
c'est un tableau associatif, donc oui : "YOU_ARE_HERE" est une clé universelle présente dans tous mes fichiers locaux.
quand j'appel
echo $T->_("YOU_ARE_HERE")
et bien c'est la valeur correspondante qui va s'afficher, donc ou
"Vous êtes ici :"
si mon navigateur web est en francais (fr), ou
"You are here:"
si mon navigateur est en anglais (en).
je suis en ce moment même en train d'implémenter le multi lang dans mon application, donc je ne connais pas toutes les ficèles encore
PS: Zend_Layout est un composant du framework, considère que c'est une vue pour faire simple, tu peux utiliser les translation depuis n'importe quel endroit du moment ou php arrive a faire un file_exists() sur ton fichier de traduction.
Dernière modification par lethak (10-04-2008 14:51:44)
Hors ligne
Comment faire pour traduire un paragraphe entier avec une mise en page (gras, italique, lien) ?
Il faut inclure le code html en entier dans le "tableau" des langues?
Hors ligne
Il me reste à savoir comment intégrer le nom de la langue dans l'url et je n'arrive pas à comprendre le fonctionnement de router. La documentation est assez incompréhensible à mon gout.
Avez vous une piste à me donner?
Hors ligne
philippe a écrit:
J'ai souvent bcp de routages dans une appli, mais ça peut être du genre :
Code:
$router->addRoute( "category", new Zend_Controller_Router_Route( ":language/category/:categoryId/:action", array( "language"=>"en", "controller"=>"catalog", "action"=>"category", "categoryId"=>null) ) );Avec une URL de la forme : http://monsite.com/fr/category/12/edit
on arrive sur le controller "CatalogController" et l'action "editAction".
ensuite dans ton controlleur, tu peux récupérer la valeur avec $this->_getParam("language");
A+, Philippe
Hors ligne
Voilà la totalité de mon bootstrap. J'ai donc rajouté tout ce qui à un rapport avec le routage mais cela ne change pas le fonctionnement de mon application. Je dois toujours accéder à mon écran "album" par cette adresse: http://192.168.2.11/zf-test2/album et non par cette adresse: http://192.168.2.11/zf-test2/fr/album
<?php error_reporting(E_ALL|E_STRICT); date_default_timezone_set('Europe/Paris'); set_include_path('.' . PATH_SEPARATOR . realpath('./../library') . PATH_SEPARATOR . realpath('./../application/models/') . PATH_SEPARATOR . get_include_path()); include "Zend/Loader.php"; //Zend_Loader::registerAutoload(); Zend_Loader::loadClass('Zend_Controller_Front'); Zend_Loader::loadClass('Zend_Config_Ini'); Zend_Loader::loadClass('Zend_Registry'); Zend_Loader::loadClass('Zend_Db'); Zend_Loader::loadClass('Zend_Db_Table'); Zend_Loader::loadClass('Zend_Controller_Router_Rewrite'); // load configuration $config = new Zend_Config_Ini('./../application/config.ini', 'general'); $registry = Zend_Registry::getInstance(); $registry->set('config', $config); // setup database $db = Zend_Db::factory($config->db->adapter, $config->db->config->toArray()); Zend_Db_Table::setDefaultAdapter($db); // setup controller $frontController = Zend_Controller_Front::getInstance(); $frontController->throwExceptions(true); $frontController->setBaseUrl('/zf-test2/'); $frontController->setControllerDirectory(array( 'album' => './../application/modules/album/controllers' )); $frontController->addModuleDirectory('./../application/modules'); //router $router = new Zend_Controller_Router_Rewrite(); $router->addRoute( "basic", new Zend_Controller_Router_Route( "/:language/:module/:controller/:action/:parameter1/:parameter2", array( "language"=>"fr", "modules"=>"album", "controller"=>"index", "action"=>"index", "parameter1"=>null, "parameter2"=>null) ) ); // run! $frontController->dispatch();
J'ai également essayé de remplacer la ligne suivante:
/:language/:module/:controller/:action/:parameter1/:parameter2
par:
/fr/:module/:controller/:action/:parameter1/:parameter2
pour faire un test, mais sans succès.
Pouvez vous m'aider?
Hors ligne
Sans succes ? Quel est ton problème ? Ton erreur ?
Hors ligne
apsy a écrit:
Sans succes ? Quel est ton problème ? Ton erreur ?
C'est vrai que j'aurai peut être pu mettre le message d'erreur.
En gros, il me marque que fr n'a pas de controller par defaut. Il doit considérer que lorsque je tape "http://192.168.2.11/zf-test2/fr/album", je veux atteindre le module fr.
Je pourrais mettre le message d'erreur exact ce soir...
Dernière modification par slaughter (14-04-2008 17:25:35)
Hors ligne
Bonjour à vous 2 !
Je suis actuellement en train de me former sur le ZF et je suis un peu dans la même panade concernant un site multi-langues que je dois développer... Donc à trois on devrait bien y arriver non !!
Pour le moment j'ai fait des essais basés sur le livre "Zend Framework in action" mais apparemment il y a des erreurs...
Bon en tout cas je planche sur les mêmes choses que vous, Zend_Locale, Zend_Translate, langue dans l'URL, traductions dans les vues...
Hors ligne
Mais "fr" n'est pas un module là. C'est un paramètre seulement.
Hors ligne
C'est bien ça le problème. J'ai l'impression que le ZF ne tient pas compte des nouvelles routes que j'ai définies.
Voici l'erreur exacte:
----------------------------------------------------------------------
Fatal error: Uncaught exception 'Zend_Controller_Exception' with message 'No default module defined for this application' in /var/www/zf-test2/library/Zend/Controller/Dispatcher/Standard.php:392 Stack trace: #0 /var/www/zf-test2/library/Zend/Controller/Dispatcher/Standard.php(211): Zend_Controller_Dispatcher_Standard->getControllerClass(Object(Zend_Controller_Request_Http)) #1 /var/www/zf-test2/library/Zend/Controller/Dispatcher/Standard.php(245): Zend_Controller_Dispatcher_Standard->isDispatchable(Object(Zend_Controller_Request_Http)) #2 /var/www/zf-test2/library/Zend/Controller/Front.php(914): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #3 /var/www/zf-test2/public/index.php(56): Zend_Controller_Front->dispatch() #4 {main} thrown in /var/www/zf-test2/library/Zend/Controller/Dispatcher/Standard.php on line 392
----------------------------------------------------------------------
Dernière modification par slaughter (14-04-2008 17:53:25)
Hors ligne
Si je regarde de plus pres ton code :
$router->addRoute( "basic", new Zend_Controller_Router_Route( "/:language/:module/:controller/:action/:parameter1/:parameter2", array( "language"=>"fr", "modules"=>"album", "controller"=>"index", "action"=>"index", "parameter1"=>null, "parameter2"=>null) ) );
Tu t'es trompé dans les clés de ton tableau associatif. Tu as mis un "s" à "modules" alors que ta clé ":module" n'en prend pas...
Hors ligne
Bien vu, malheureusement ce n'est pas encore ça. J'ai également remarqué que j'ai exactement le même message si je veux accéder à la page suivante : "http://192.168.2.11/zf-test2". Cela me parait normal puisque je n'ai ni de module/controller/action avec le nom index et je n'ai pas défini de module/controller/action par défaut.
J'ai également une question sur le router.
A quoi ca sert de mettre "album" en face de "modules" par exemple au lieu de "null" ?
Hors ligne
Il fallait tout simplement que j'enlève le "s" à module. J'avais pour l'instant tout mis au pluriel....
Résolu
Hors ligne
Etape suivante:
Comment je créer les liens. Faut-il que je recherche la valeur de :language pour concaténer avec le reste?
href="<?php echo $this->baseUrl.$this->language;?>/mon/chemin/" />
Ou est ce que je peux faire cela de façon automatique et avoir simplement cela?
href="<?php echo $this->baseUrl;?>/mon/chemin" />
Hors ligne
Avez vous une idée?
Hors ligne
Je me pose aussi la meme question pour les url ... si tu trouves fait moi signe
Hors ligne
Toujours personne?
Hors ligne
Moi j'ajoute effectivement la langue à la main dans les URL.
A priori, si personne ne répond, c'est que personne n'a de solution magique. Evite de relancer tes threads.
A+, Philippe
Hors ligne
Merci philippe.
Autre question maintenant (on finira bien par faire le tour)
Comment faire en sorte qu'il rajoute le paramétre de la langue dans l'url.
Mise en situation:
J'accède à mon site par l'url www.monsite.com et je voudrais être dirigé directement vers www.monsite.com/fr
fr étant soit la langue de mon navigateur soit enregistré dans une session.
Je pense que cela se fait dans le bootstrap mais sans trop savoir comment mis prendre. Avez vous une piste?
Hors ligne
Tu peux détecter la langue du navigateur avec le code ci-dessous. Ensuite tu peux faire une redirection en renvoyant un header.
Je te laisse ajouter les tests qui vont bien pour savoir si la langue est déjà dans l'URL, si tu dois faire la redirection, etc...
Zend_Loader::loadClass("Zend_Locale"); $locale = new Zend_Locale(); $lang = $locale->getLanguage(); // puis si besoin header("Location: http://monsite.com/fr"); exit();
A+, Philippe
Hors ligne
Pour les routes, faut-il créer autant de route qu'on a de page possible ou est-ce qu'il y a moyen de faire quelque chose de général ?
Quand je dis un truc général, je veux dire juste lui indiquer qu'il y a la langue en plus dans l'url mais ne rien fixer (module/controlleur/action).
Hors ligne
Pages: 1 2