IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MVC PHP Discussion :

Routage et internationalisation [ZF 1.7]


Sujet :

MVC PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Par défaut Routage et internationalisation
    Salut à tous,
    J'aimerai pouvoir autoriser 3 langues pour mon site du genre:

    \\monsite/fr/actions //pour le français
    \\monsite/en/actions //pour la partie anglaise.
    \\monsite/ar/actions //pour l'Arabe

    NB : j'utilise pour la traduction le fichier TMX qui contient les 3langues
    Le problème est que je ne sais pas comment faire le routage.

    Ou devrais je mettre les langues comme paramètres comme ceci:


    Merci de bien vouloir me donner un coup de main.

  2. #2
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Bonjour,

    Pour être traité dans tes contrôleurs, il faut que la langue soit passée en paramètre. Pour cela, par défaut, il suffit d'avoir des adresses sous la forme :
    http://monsite/controleur/action/langue/[fr|en|ar]

    Dans ce cas, la langue peut être récupérée dans le paramètre 'langue'. Si tu veux améliorer la présentation de ces adresses, en proposant à la place http://monsite/[fr|en|ar]/controleur/action, il faut que tu définisse une route personnalisée au niveau de ton bootstrap, quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $route = new Zend_Controller_Router_Route(':langue/:controller/:action/*',
        array('controller' => 'index',
              'action' => 'index',
              'module' => 'default',
              'langue' => 'fr'));
    $router = $frontController->getRouter();
    $router->addRoute('default', $route);
    $frontController->setRouter($router);
    De la même façon, la langue se retrouvera dans le paramètre 'langue' (avec par défaut 'fr').

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Par défaut
    voici le cde que j'ai ajouter à mon bootstrap pour réaliser le routage des langues:

    code bootstrap :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    //Définition de la langue à afficher
    $locale=new Zend_Locale(Zend_Locale::BROWSER);
    //charegement du fichier de traduction
    $translator=new Zend_Translate('tmx',"./application/languages/languages.tmx",$locale);
    Zend_Registry::set('translator',$translator);
    //Ajouter la nouvelle route
    $router=new Zend_Controller_Router_Rewrite();
    $router->addRoute(
       new Zend_Controller_Router_Route("/:language/:controller/:action/*",
       array(
         "language" => "fr",
         "controller" => "index",
         "action" => "index",
         )  ));
    //attribution de la route au front controller
    $frontController->setRouter($router);
    //définition des langues
    $language=$frontController->getRequest()->getParam("langauge", "fr");
    switch($language)
    {
    	case "en":
    		$locale=new Zend_Locale("en");
    		break;
    	case "ar":
    		$locale=new Zend_Locale("ar");
    		break;
    	default:
    		$locale=new Zend_Locale("fr");
    		break;	
    }
    $frontController->dispatch();
    mais j'ai l'erreur suivant suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fatal error: Call to a member function getParam() on a non-object in /var/www/Morogoo/index.php on line 44
    est la ligne 44 c'est : $language=$frontController->getRequest()->getParam("langauge", "fr");

    si qlq à une idée sur cette erreur

  4. #4
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    C'est qu'à ce moment là le contrôleur frontal n'a pas encore initialisé son objet requête. En fait, il le fait après appel à dispatch()...

    Je pense qu'il faudrait plutôt que tu initialises ta variable $locale dans un plugin, par exemple dans la fonction dispatchLoopStartup, qui est appelée avant que le contrôleur frontal ne commence le dispatching.

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Par défaut
    SVP Eusebe je suis un débutant dans ZF est ce que tu peut me dire comment initialises la variable $local dans un "plugin"

    et merci d'avance

  6. #6
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Un plugin de contrôleur permet d'exécuter du code à différents instants du processus de dispatching : http://framework.zend.com/manual/fr/...r.plugins.html

    Dans ton cas, puisque je suppose que tu veux que la langue choisie soit valable quelle que soit l'action appelée, l'idéal est de récupérercette information le plus tôt possible, après que la requête soit définie. Je t'ai proposé la méthode dispatchLoopStartup(), mais on pourrait aussi le faire sur routeShutdown().

    Voici un exemple de plugin (à tester et améliorer...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    class MyApp_Controller_Plugin_Language extends Zend_Controller_Plugin_Abstract
    {
        public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
        {
            $language = $request->getParam('language');
            switch($language)
            {
                case 'en':
                case 'ar':
                    $locale=new Zend_Locale($language);
                    break;
                default:
                    $locale=new Zend_Locale('fr');
            }
            $adapter = new Zend_Translate('tmx',
                                    'chemin/vers/mytranslation.tmx',
                                    $locale);
            Zend_Registry::set('Zend_Translate', $adapter);
        }
    }
    Dans ce plugin, je récupère la langue choisie (comme tu l'avais fait), puis je l'utilise pour initialiser un objet Zend_Translate que j'enregistre dans le registre sous la clé 'Zend_Translate'. Si je te propose ça, c'est simplement pour pouvoir utiliser ensuite l'aide vue 'Translate'.

    Ce plugin doit être dans un fichier 'Language.php' situé dans /library/MyApp/Controller/Plugin/ suivant le nom de la classe (en supposant que le dossier library existe chez toi et soit dans l'include_path de PHP).

    Enfin, pour activer ce plugin, il faut le déclarer dans le bootstrap :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $frontController->registerPlugin(new MyApp_Controller_Plugin_Language());
    Si tu as des questions, n'hésites pas !
    Bon courage !

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Par défaut
    Merci beaucoup Eusebe pour tes propositions et tes efforts.
    mais veuillez à m'excuse j'ai encore d'autre question :

    j'ai sais pas encore ou je vais ajouter ce plugin (ou je vais trouve le dossier library) et comment (est ce que je vais l'ajouter au fichier Language.php)
    NB : j'utilise wamp

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Struts] Internationalisation
    Par kayoups dans le forum Struts 1
    Réponses: 2
    Dernier message: 01/09/2004, 16h19
  2. [Kylix] internationalisation
    Par bohort dans le forum EDI
    Réponses: 1
    Dernier message: 26/07/2004, 18h26
  3. [STRUTS] INTERNATIONALISATION ==>> EXEMPLE
    Par zarbydigital dans le forum Struts 1
    Réponses: 10
    Dernier message: 23/03/2004, 14h55
  4. [Unicode] Internationalisation d'une application
    Par Thierry Laborde dans le forum Langage
    Réponses: 4
    Dernier message: 21/10/2003, 20h15
  5. [CR] internationalisation d'un report
    Par osoudee dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 24/06/2002, 16h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo