Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 09-11-2007 10:14:00

x0r
Nouveau membre
Date d'inscription: 08-11-2007
Messages: 9

Meilleure méthode pour le choix de la langue

Bonjour,

J'ai pensé principalement à 2 moyens pour changer la langue du site :
- Une première en utilisant des routes telles que site.fr/langue/module/controller/action
Sachant que j'aimerai que site.fr/module/controller/action fonctionne aussi en redirigeant vers /fr/module/... par exemple ou mieux, en le faisant interne, sans changer d'url.
Jusqu'à présent je n'ai pas réussi à configurer les routes correctement, j'ai failli réussir avec un Router_Route_Regex mais malheureusement, je n'arrive pas à nommer les paramètres après.
Le problème que j'ai eu avec un Router_Route, c'est que je ne pouvais pas récupérer les variables si l'url n'est pas complète (par exemple juste site.fr/langue/module)

-Une deuxième solution en utilisant une variable de session, que l'on change avec un controller (site.fr/langue/fr par exemple). Mais dans ce cas les URLs du site seront toujours identiques et j'ai peur que cela cause pb pour le référencement (le site risque d'être référencé dans une seule langue, celle du robot) je me trompe ?

Si quelqu'un pouvait déjà m'éclairer sur la meilleure des solutions entre les 2 et éventuellement s'il a quelque chose de fonctionnel pour la première.

Merci

Hors ligne

 

#2 09-11-2007 10:30:39

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Meilleure méthode pour le choix de la langue

Le problème que j'ai eu avec un Router_Route, c'est que je ne pouvais pas récupérer les variables si l'url n'est pas complète (par exemple juste site.fr/langue/module)

Pour cela il faut précisé dans ta route que la valeur par defaut est null, et le paramètre devient donc facultatif!

Code:

$router->addRoute("listeBlog", new Zend_Controller_Router_Route("/blog/tous-les-billets/:year/:month/:day/",array(
        'controller' => 'blog',
        'action'     => 'tous-les-billets',
        'year'       => null,
        'month'      => null,
        'day'        => null
    )));

Hors ligne

 

#3 09-11-2007 10:49:34

Isilgawen
Membre
Lieu: Limoges
Date d'inscription: 23-03-2007
Messages: 106

Re: Meilleure méthode pour le choix de la langue

L'ideal pour les routes en multilangue, c'est d'utiliser l'héritage du fichier des routes.

Code:

Le fichier ini des routes

[routes]
root.route              = ":controller/:action"
rootId.route             = ":controller/:action/:id"
login.defaults.controller    = "Auth"
login.defaults.action          = "login"

[routes_fr_FR : routes]
login.route              = "connexion"

[routes_en_US : routes]
login.route              = "login"

Et ensuite dans ton boostrap :

$router    = new Zend_Controller_Router_Rewrite();
$router->addConfig(new Zend_Config_Ini($pathRouteIni,null),'routes_'.$lang);
$controller->setRouter($router);

Avec cette approche tu peux utiliser le $this-url dans tes vues et en plus tu obtiens des url localisées parfaite pour le réferencement par langue.

Hors ligne

 

#4 09-11-2007 12:06:44

TiTerm
Membre
Date d'inscription: 01-07-2007
Messages: 175

Re: Meilleure méthode pour le choix de la langue

La solution que nous avons implémenté semble être proche de celle que tu souhaites
c'est a dire routage standard sans réécriture (traitement de la langue en interne)

Voila comment nous avons procédé.
On passe par un fichier de config ou on définie les routes de la plus générique a la plus spécifique. (Le dispatcher test les routes en partant de la fin)
Une particularité, nous utilisons très peu le module default car nous avons groupé les modules par catégorie, mais si nous devons faire référence au module defaut, pour prendre en compte la langue, on doit le nommer.

http://monsite.com/module/controleur
et avec une langue
http://monsite.com/fr/default/module/controleur
http://monsite.com/en/default/module/controleur

Pour le reste du site, le problème ne se pose pas car une partie statique du chemin permet de matcher les routes avec ou sans langue avant d'arriver sur la route générique.
ex:

groupe est un chemin static, resau-vente un module, presentation-reseau un controleur, etc...

http://monsite.com/groupe/reseau-vente/ … ion-reseau (fr par default)
http://monsite.com/en/groupe/reseau-ven … ion-reseau
http://monsite.com/fr/groupe/reseau-ven … ion-reseau

;; on reutilise la route Module mais on lui ajoute une default lang
routes.default.type = "Zend_Controller_Router_Route_Module"
routes.default.defaults.lang = fr
routes.default.defaults.module = default
routes.default.defaults.controller = index
routes.default.defaults.action = index

;; route par defaut avec lang
routes.default_lang.route = ":lang/:module/:controller/:action/*"
routes.default_lang.defaults.module = default
routes.default_lang.defaults.controller = index
routes.default_lang.defaults.action = index

; routes avec prise en compte de la langue...
routes.groupe_lang.route = ":lang/groupe/:module/:controller/:action/*"
routes.groupe_lang.defaults.module = default
routes.groupe_lang.defaults.controller = index
routes.groupe_lang.defaults.action = groupe
routes.groupe_lang.path = groupe

; les routes sans langues
routes.groupe.route = "groupe/:module/:controller/:action/*"
routes.groupe.defaults.module = default
routes.groupe.defaults.controller = index
routes.groupe.defaults.action = groupe
routes.groupe.defaults.lang = fr
routes.groupe.path = groupe


Lors de la lecture du fichier de config, on ajoute une restriction sur les langues gérés
un peu comme si on definissait en dur :
routes.groupe_lang.reqs = array('lang' => '(fr|en)'

Cela nous permet de rendre indépendant le fichier des routes et la liste des langues gérées.

Hors ligne

 

#5 09-11-2007 15:57:14

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Meilleure méthode pour le choix de la langue

Juste pour répondre à une question du 1er message : pour nommer un paramètre avec Route_Regexp :

Code:

        new Zend_Controller_Router_Route_Regex(
            '(.+)\.php',
            array(
                'controller' => 'index',
                'action' => 'cms'
            ),
            array(
                1 => 'pageName'
            )
        )

avec la route ci-dessus, le paramètre 1 de la regexp s'appelle avec $this->_getParam("pageName");

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#6 09-11-2007 17:16:07

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Meilleure méthode pour le choix de la langue

pourquoi le comportement de l'application dépendrait-il de la langue ?
changer de contrôleur ou de module signifie dans MVC changer le comportement de l'application (le contrôleur ne s'occupe que du comportement)
à priori le choix de la langue ne doit intervenir que sur la vue
qui elle vas chercher des modèles de pages ou des texte adapté à la langue.

il peut arriver aussi que cela influe sur le module en limitant les donnée à un sous ensemble propre à la langue.

mais le comportement donc les contrôleurs n'ont pas à changer.

personnellement je mettrait ça dans la vue. le contrôleur mettant la langue choisit dans la session au moment du changement pour la rendre visible à toute l'application.

la vue n'a plus alors soit à charger le modèle de page en fonction de la langue soit à charger un fichier de locale pour mettre les textes dans la bonne langue.

bien évidement il faut avoir respecter la séparation des couche et ce n'est pas au contrôleur de donner les messages d'erreurs ou de confirmation mais à la vue le contrôleur donnant un code d'erreur ou de confirmation.

A+JYT

Hors ligne

 

#7 09-11-2007 22:04:15

x0r
Nouveau membre
Date d'inscription: 08-11-2007
Messages: 9

Re: Meilleure méthode pour le choix de la langue

Merci beaucoup pour toutes ces réponses !

Pour phillipe, concernant le Router_Route_Regex, voici ma seule et unique route définie :
$router->addRoute("default",new Zend_Controller_Router_Route_Regex(
        "(fr|en|it)"),
        array(),
        array(1=>'language'));
En faisant un Zend_Debug::dump($front->getRequest()->getParam('language'));
j'obtiens NULL !
Et en faisant Zend_Debug::dump($front->getRequest()->getParams());
J'obtiens
array(1) {
  [1] => string(2) "fr"
}

Je n'ai donc pas vraiment l'impression que cela soit le comportement voulu... Qu'est-ce que je fais mal ?


Merci Mr.MoOx, je ne suis pas encore très aguerrit avec le fonctionnement du framework mais en faisant ceci :
$router->addRoute("default",new Zend_Controller_Router_Route(
        "/:language/:module/:controller/:action/*"),
        array('language' => null,'module' => null,'controller' => null, 'action' => null));
Si je tape juste site.fr/fr, je n'obtiens aucune variable en faisant getParams(); ! Alors que je souhaiterais obtenir la variable language.
Par contre en mettant site.fr/fr/index/index/index j'obtiens toutes les variables :
array(4) {
  ["language"] => string(2) "fr"
  ["module"] => string(5) "index"
  ["controller"] => string(5) "index"
  ["action"] => string(5) "index"
}



Isilgawen, ta solution me plaît beaucoup, c'est très pratique ce système d'héritage et pour la localisation je doute qu'on puisse faire mieux effectivement.
Juste une question qui me turlupine : Quand tu fais $this->url, tu utilises quelle langue pour nommer les controlleurs / actions ? Tu les notes en français ou anglais, ou cela n'a pas d'importance ??


TiTerm, j'ai essayé d'une manière similaire à la tienne :
$router->addRoute("default",new Zend_Controller_Router_Route_Module(
        array('lang' => 'none','module' => 'default', 'controller' => 'index', 'action' => 'index')));
$router->addRoute("default_lang",new Zend_Controller_Router_Route(
        '/:lang/:module/:controller/:action/*',array('module' => 'default', 'controller' => 'index', 'action' => 'index')));
Cela fonctionne très bien pour site.fr/fr ou site.fr/module et compagnie par contre si jamais j'essaye d'accéder à un module inexistant site.fr/module_inexistant sans paramètre de langue, la variable lang=module_inexistant et la page par défaut s'affiche du coup.
Comment as-tu traité ce cas ? Est-ce la contrainte sur les langues dont tu parles à la fin de ton message ?

Et enfin sekaijin, je suis désolé mais j'ai relu 2 fois ton message et je n'ai pas bien compris ce que tu voulais dire :s
Pour ma part je ne cherche pas à changer le comportement de l'application, juste à récupérer une variable de langue pour traduire le site avec Zend_Translate. Eventuellement changer les routes pour les internationaliser comme le fait Isilgawen.
Mes contrôleurs ne seront pas modifiés. Tout cela doit être fait dans le bootstrap. La vue quant à elle sera elle aussi très peu modifiée (différenciation avec Zend_Locale, c'est tout ce que je vois)

En tout cas merci beaucoup pour toutes ces réponses, je suis ravi de voir une communauté active comme celle-ci, ca fait plaisir à voir. J'avais un peu peur étant donné la relative jeunesse du framework.

Hors ligne

 

#8 09-11-2007 22:38:18

Isilgawen
Membre
Lieu: Limoges
Date d'inscription: 23-03-2007
Messages: 106

Re: Meilleure méthode pour le choix de la langue

Concernant le $this->url tu appel la référence de ta route.

Exemple :

Code:

[routes]
root.route              = ":controller/:action"
rootId.route             = ":controller/:action/:id"
login.defaults.controller    = "Auth"
login.defaults.action          = "login"
showUser.defaults.controller    = "User"
showUser.defaults.action    = "show"

[routes_fr_FR : routes]
login.route              = "connexion"
showUser.route       = "visualiser/utilisateur/:idToShow"

[routes_en_US : routes]
login.route              = "login"
showUser.route       = "show/user/:idToShow"

--------------------
Si tu veux une url vers la connexion :
$this->url(array(),"login");

Si tu veux une url vers un user :
$this->url(array("idToShow"=>$idToShow),"showUser");

L'avantage de fonctionner comme ceci c'est d'avoir une flexibilité totale dans les url et les langues.
De plus si tu utilises systématiquement le $this->url tu peux changer tes routes sans toucher a rien d'autre qu'au ini.

Si demain je veux changer l'url de visualisation d'un user en francais je remplace showUser.route avec par exempe    "utilisateur/:idToShow" et tout fonctionne avec cette nouvelle url sans rien toucher.
Flexibilité totale.
Rien ne t'empèche, et je te le conseil même, de garder l'ancienne url avec une autre référence pour garder le routing pour tes pages référencés, backlinks ...

Dernière modification par Isilgawen (09-11-2007 22:44:12)

Hors ligne

 

#9 10-11-2007 10:26:36

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Meilleure méthode pour le choix de la langue

Ce que je dis c'est que si tu change de route tu change de contrôleur or changer de controleur c'est changer de comportement.
il ne s'agit que de changer l'url et de pointer sur le même contrôleur alors plutôt que d'utiliser une route mieux vaut utiliser une rewrite_rule

à priori a mois de vouloir adapter l'url à la langue tu n'as pas besoin de tous ça il suffit de garder en session la langue choisie

quant au changement de langue il peut très bien s'opérer sur un lien en ajoutant /lang/fr à la fin.

enfin pour finir je disais que dans le modèle MVF il ne revient pas au contrôleur de traduire l'interface mais à la vue. le contrôleur dit QUOI afficher et la vue COMMENT
donc le Contrôleur donne le contenu le nom de la langue étant un de ces contenus et la vue Elle l'affiche.

Il n'y donc normalement dans une internationalisation pas de changement de route à moins d'avoir un comportement spécifique à une langue.

A+JYT

Hors ligne

 

#10 10-11-2007 19:17:54

Isilgawen
Membre
Lieu: Limoges
Date d'inscription: 23-03-2007
Messages: 106

Re: Meilleure méthode pour le choix de la langue

Tout à fait d'accord avec toi sekaijin, ce que je lui propose va dans ce sens.

Hors ligne

 

#11 11-11-2007 23:12:26

x0r
Nouveau membre
Date d'inscription: 08-11-2007
Messages: 9

Re: Meilleure méthode pour le choix de la langue

Merci beaucoup Isilgawen,
Je vais utiliser ta solution, elle me plaît.
Par contre je vais certainement faire directement une section [route_fr] et faire hériter les autres de celle-ci, j'ai lu dans Zend_Config que si les paramètres sont rédéfinis dans une section héritant d'une autre, elle écrase les paramètres de la section parente. Je vais donc utiliser cette propriété afin de ne pas avoir à traduire toutes les routes immédiatement si je veux que le site fonctionne tout de suite dans toutes les langues.

Encore deux questions big_smile et un conseil smile
Je vais utiliser la langue du navigateur par défaut, donc si jamais la langue n'est pas une langue disponible dans le site ca va causer pb. Tu fais donc un test du genre if($lang!='fr' || $lang!='en ...) ou tu as trouvé une solution plus élégante / tu n'utilises pas cela ?

Concenant Zend_Translate, quel format de fichiers me conseillez-vous ? sachant que je ne cherche pas forcément la performance mais à utiliser des outils pratiques pour traduire rapidement le site. Je me penchait vers les fichiers binaires 'po' avec le gettext de Zend_Translate. Avez-vous déjà utilisé poedit ? Vous en pensez quoi ?

Cela m'amène à ma dernière question, est-ce qu'en utilisant quelque chose comme $translate->_("text") Permet d'utiliser les outils existants pour extraire les chaînes de caractères du fichier et de générer la liste des choses à traduire ?

Merci beaucoup pour tous ces conseils.
@+

Hors ligne

 

#12 12-11-2007 08:33:04

TiTerm
Membre
Date d'inscription: 01-07-2007
Messages: 175

Re: Meilleure méthode pour le choix de la langue

Xor, concernant le pb du module default, j'en parle brièvement au début.
Effectivement, nous utilisons une partie static juste après la langue, nous utilisons donc très peu le module default. Mais quand nous devons l'utiliser, c'est en général pour des actions transverse et qui n'ont pas de lien avec la langue, mais si nous devons a toute fin gérer la langue sur le module default, nous somme contraint de spécifier le  nom du module, soit par exemple http://monsite.com/fr/default/controller/action, mais une fois encore, dans notre cas, ce genre d'url ne sera pas utilisés par l'utilisateur mais a la rigueur via de l'ajax dans certain cas extrèment rare.

C'est un problème que nous avons constaté et je n'ai malheureusement pas eu le temps d'approfondir, mais il y à peut être un problème sous jacent dans la gestion du module defaut du ZF.

Hors ligne

 

#13 17-11-2007 18:23:21

x0r
Nouveau membre
Date d'inscription: 08-11-2007
Messages: 9

Re: Meilleure méthode pour le choix de la langue

Ok, merci TiTerm

Isilgawen, j'ai quand même une question sur ta méthode (que je mets en oeuvre), comment fais-tu pour fournir l'URL d'une page à quelqu'un ? Je m'explique : Seules les routes correspondantes à la langue courante sont chargées et pour ma part la langue est choisie initialement par celle du navigateur de l'internaute, si jamais la langue ne correspond pas à une des langues disponibles sur le site, la langue devient le francais.
Donc si jamais je fournis une URL sur un forum / par mail ou autre, localisée en anglais, et que le navigateur du visiteur accepte par défaut la langue francaise, le client va avoir une belle page 404 parce que la route anglaise n'est pas définie... Suis-je clair ?

Comment faire face à se pb ?

++

Hors ligne

 

#14 18-11-2007 19:30:24

Isilgawen
Membre
Lieu: Limoges
Date d'inscription: 23-03-2007
Messages: 106

Re: Meilleure méthode pour le choix de la langue

En effet, tu as tout à fait raison. Pour ma part je me base sur l'extension du ndd .com en us et .fr en français donc je n'ai pas ce souçi.
Le mieux pour toi serait de gérer l'exception sur le routeur afin de switcher de langue si il ne trouve pas de route puis 404 quand il a fini de tester toutes les langues.

Hors ligne

 

#15 19-11-2007 21:47:03

Seb
Membre
Lieu: Thuin (Belgique)
Date d'inscription: 19-11-2007
Messages: 62
Site web

Re: Meilleure méthode pour le choix de la langue

sekaijin a écrit:

pourquoi le comportement de l'application dépendrait-il de la langue ?
changer de contrôleur ou de module signifie dans MVC changer le comportement de l'application (le contrôleur ne s'occupe que du comportement)
à priori le choix de la langue ne doit intervenir que sur la vue
qui elle vas chercher des modèles de pages ou des texte adapté à la langue.

il peut arriver aussi que cela influe sur le module en limitant les donnée à un sous ensemble propre à la langue.

mais le comportement donc les contrôleurs n'ont pas à changer.

personnellement je mettrait ça dans la vue. le contrôleur mettant la langue choisit dans la session au moment du changement pour la rendre visible à toute l'application.

la vue n'a plus alors soit à charger le modèle de page en fonction de la langue soit à charger un fichier de locale pour mettre les textes dans la bonne langue.

bien évidement il faut avoir respecter la séparation des couche et ce n'est pas au contrôleur de donner les messages d'erreurs ou de confirmation mais à la vue le contrôleur donnant un code d'erreur ou de confirmation.

A+JYT

Je tente de faire ce que tu expliques ici mais sans succès pour le moment. Aurais-tu un exemple ?

Merci


Sébastien Bervoets

Hors ligne

 

#16 03-05-2010 18:02:17

ptitjib
Membre
Date d'inscription: 03-12-2009
Messages: 10

Re: Meilleure méthode pour le choix de la langue

Ma solution :
Dans le Bootstrap principal:
    protected function _initTranslatedRoute() {
        $frontController = Zend_Controller_Front::getInstance();
        $frontController->registerPlugin(new App_Plugin_TranslatedRoute());

        $router = $frontController->getRouter();
        $router->addRoute('default',
                            new Zend_Controller_Router_Route(
                                '/:sys-language/:module/:controller/:action/*',
                                array('module'=>'default','controller'=>'index','action'=>'index'),
                                array('sys-language'=>'fr|it')
                            )
                        );
    }

Un plugin de gestion :
class App_Plugin_TranslatedRoute extends  Zend_Controller_Plugin_Abstract {

protected $languages = array('fr','it');

private $_lang = 'fr';

    public function routeShutdown(Zend_Controller_Request_Abstract $request)    {

        if ($this->getRequest()->getParam('sys-language')!='')    {
            $lang = $this->getRequest()->getParam('sys-language');
        } else {
            $lang = $this->getBrowserLanguage();
            $this->_response->setRedirect('/'.substr($lang,0,2));
        }
        //echo $lang.'---';
        $locale = new Zend_Locale($lang);
        Zend_Registry::set('Zend_Locale',$locale);

        $route = Zend_Controller_Front::getInstance()->getRouter();
        $route->setGlobalParam('sys-language',$locale->getLanguage());
       
        $this->setLanguage($locale);
    }
   
    public function getBrowserLanguage() {
        $langs = Zend_Locale::getBrowser();
        foreach ($langs as $lang => $pref) {
            if (in_array(substr($lang,0,2), $this->languages)) {
                return $lang;
            }
        }   
        return $this->_lang;
        }
       
    public function setLanguage($locale) {
        $translate = new Zend_Translate('array', APPLICATION_PATH.'/languages/fr.php', 'fr');
        $translate->addTranslation(APPLICATION_PATH.'/languages/it.php', 'it');
        //$ajouter tous les langages...
        $translate->setLocale($locale);
        Zend_Registry::set('Zend_Translate', $translate);
    }
       
}

Voilà ce que j'ai fait.
Les liens sont de la forme http://mon-site/sys-language/controleur/action/parm=x&..., ou http://mon-site/sys-language/module/controleur/action/parm=x&....
Par default une langue est choisie, ici: fr.
C'est le navigateur qui donne la langue.
Il faut maintenant changer de locale par un lien de choix de langue pour laisser libre à l'utilisatuer le chois de sa langue.

Espérant bien vous aider.
JB

Dernière modification par ptitjib (03-05-2010 18:04:06)

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages