Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 17-12-2009 19:26:05

Flizer
Membre
Date d'inscription: 17-12-2009
Messages: 34

[Zend_Controller_Router_Route][1.9.6] Site multilingue & url traduites

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 :

Code:

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) :

Code:

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

 

#2 19-12-2009 18:21:30

Flizer
Membre
Date d'inscription: 17-12-2009
Messages: 34

Re: [Zend_Controller_Router_Route][1.9.6] Site multilingue & url traduites

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 :

Code:

"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 :

Code:

$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

 

#3 27-12-2009 15:43:46

Flizer
Membre
Date d'inscription: 17-12-2009
Messages: 34

Re: [Zend_Controller_Router_Route][1.9.6] Site multilingue & url traduites

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 :

Code:

<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-&gt;_initTranslate()
#2 /usr/local/library/Zend/Application/Bootstrap/BootstrapAbstract.php(615): Zend_Application_Bootstrap_BootstrapAbstract-&gt;_executeResource('translate')
#3 /usr/local/library/Zend/Application/Bootstrap/BootstrapAbstract.php(579): Zend_Application_Bootstrap_BootstrapAbstract-&gt;_bootstrap(NULL)
#4 /usr/local/library/Zend/Application.php(347): Zend_Application_Bootstrap_BootstrapAbstract-&gt;bootstrap(NULL)
#5 /var/www/projet/public/index.php(25): Zend_Application-&gt;bootstrap()
#6 {main}
  thrown in <b>/usr/local/library/Zend/Registry.php</b> on line <b>147</b><br />

Dans le Bootstrap.php :

Code:

$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

Code:

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

 

#4 30-12-2009 00:49:32

Flizer
Membre
Date d'inscription: 17-12-2009
Messages: 34

Re: [Zend_Controller_Router_Route][1.9.6] Site multilingue & url traduites

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

 

#5 30-12-2009 11:46:16

Flizer
Membre
Date d'inscription: 17-12-2009
Messages: 34

Re: [Zend_Controller_Router_Route][1.9.6] Site multilingue & url traduites

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.
smile

Dernière modification par Flizer (30-12-2009 11:46:50)

Hors ligne

 

#6 31-12-2009 03:16:22

3uclide
Membre
Date d'inscription: 09-08-2008
Messages: 194

Re: [Zend_Controller_Router_Route][1.9.6] Site multilingue & url traduites

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

 

#7 31-12-2009 10:02:46

Flizer
Membre
Date d'inscription: 17-12-2009
Messages: 34

Re: [Zend_Controller_Router_Route][1.9.6] Site multilingue & url traduites

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

 

#8 31-12-2009 17:25:32

3uclide
Membre
Date d'inscription: 09-08-2008
Messages: 194

Re: [Zend_Controller_Router_Route][1.9.6] Site multilingue & url traduites

Après avoir détecter le langage dans ton plugin, il faut traduire les paramètres de ta requête.

Code:

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

 

#9 02-01-2010 15:45:33

Flizer
Membre
Date d'inscription: 17-12-2009
Messages: 34

Re: [Zend_Controller_Router_Route][1.9.6] Site multilingue & url traduites

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

 

#10 16-02-2010 19:20:46

probitaille
Membre
Lieu: Montréal
Date d'inscription: 20-04-2009
Messages: 336
Site web

Re: [Zend_Controller_Router_Route][1.9.6] Site multilingue & url traduites

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

 

#11 19-02-2010 16:05:05

probitaille
Membre
Lieu: Montréal
Date d'inscription: 20-04-2009
Messages: 336
Site web

Re: [Zend_Controller_Router_Route][1.9.6] Site multilingue & url traduites

Toujours pas d'idée ? Car c'est moi qui bloque présentement...

Hors ligne

 

#12 20-02-2010 23:20:04

martinsupiot
Membre
Lieu: Nantes
Date d'inscription: 20-03-2007
Messages: 52
Site web

Re: [Zend_Controller_Router_Route][1.9.6] Site multilingue & url traduites

Même problématique pour moi, je vais essayer de creuser un peu la solution de Flizer...

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