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

Symfony PHP Discussion :

Traduction avec Symfony 2.4.2 [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    PHP + JAVA
    Inscrit en
    Mars 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : PHP + JAVA

    Informations forums :
    Inscription : Mars 2009
    Messages : 65
    Par défaut Traduction avec Symfony 2.4.2
    Bonjour à tous et à toutes.
    Comme le titre l'indique je veux effectuer des traductions dans mes twig sur Symfony 2.4.2. J'ai regardé longuement la documentation et je n'arrive toujours pas à arriver à mes fins. Voici ma situation:
    J'ai tout d'abord établit deux fichiers de traduction messages.en.yml et messages.fr.yml (assez succinct pour le test) comme il est conseillé dans la documentation dans le répertoire Resources/translations de mon Bundle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    distances.semantiques:  Semantic distances
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    distances.semantiques:  Distances sémantiques
    J'ai vérifié s'ils étaient bien pris en compte en changeant ma locale dans le fichier parameters.yml et c'est le cas. Ensuite dans mon contrôleur DefaultController j'ai mis le code suivant:
    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
     public function changeLanguageAction($langue=null){
        	$request = $this->getRequest();
        	if($langue != null){
    //\Doctrine\Common\Util\Debug::dump($langue);
        		$request->setLocale($langue);
        		$request->setDefaultLocale($langue);
        	        $this->get('translator')->setLocale($langue);
        	}
    // on tente de rediriger vers la page d'origine
        	$url = $this->container->get('request')->headers->get('referer');
        	if(empty($url)) {
        		$url = $this->container->get('router')->generate('acme_biomedical_homepage');
        	}
        	return new RedirectResponse($url);
        }
    Dans la documentation il est écrit que:
    La locale de l'utilisateur actuel, qui est stockée dans la requête (ou stockée comme_locale en session), est déterminée
    et que
    New in version 2.1: Le paramètre default_locale était à la base défini dans la clé session, cependant cela a changé dans la version 2.1. C'est parce que la locale est maintenant définie dans la requête et non plus dans la session
    Alors je me suis dit que le fait de faire un "setLocale" et "setDefaultLocale" suffirai à la traduction (je n'ai pas voulu mettre en place le système suivant:/{_locale}/contact ). Or je constate que ce n'est pas le cas. Alors ma question est: Es-t-on obligé de mettre en place ce fameux système de rajout de locale dans l'url ou alors est-ce qu'il manque quelque-chose que j'ai oublié de faire (j'ai bien fait le cache:clear recommandé)?
    Merci de vos réponses.

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Bonjour,

    D'aprés ton code tu change la locale de la requete et du translator, donc si tu fais une traduction à ce moment là le résultat doit être bon.

    Mais tu fais une redirectResponse, donc une nouvelle requete HTTP se produit, et les modifs que tu as pu faire sont perdus (c'est un nouvel objet Request qui est créé), la locale redevient la locale par défaut défini dans ton parameters.yml

    Il s'agit donc d'un problème de persistance
    -> avec SF <2.1, la locale de l'utilisateur était stocké dans la session
    -> avec SF >2.1 cela est stocké dans l'url ( avec possibilité d'émuler l'ancien comportement https://github.com/symfony/symfony/b...e-old-behavior)

    Donc:
    Es-t-on obligé de mettre en place ce fameux système de rajout de locale dans l'url
    Obligé, non, mais ce sera beaucoup + stable d'utiliser cette manière de faire

  3. #3
    Membre confirmé
    Homme Profil pro
    PHP + JAVA
    Inscrit en
    Mars 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : PHP + JAVA

    Informations forums :
    Inscription : Mars 2009
    Messages : 65
    Par défaut
    Salut et merci pour ta réponse. En effet il n'y a pas de problème comme je l'ai dit pour la prise en compte de mes deux fichiers. Bien vu le coût du HTTP Bon alors j'ai créé deux classes: l'une s'appelant LocaleListener (j'ai fait un superbe copié collé du code) du lien que tu m'as donné, ensuite j'ai créé une autre classe s'appelant ChangeLanguageEvent ainsi:
    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
    use Symfony\Component\HttpKernel\Event\GetResponseEvent;
    use Symfony\Component\HttpFoundation\Request;
    
    
    class ChangeLanguageEvent extends GetResponseEvent{
        
    protected $langue;
        
        public function __construct($langue){
            $this->langue=$langue;
        }
        
    public function getRequest(){
            $request =new Request();
            $request->setDefaultLocale($this->langue);
            $request->setLocale($this->langue);
            return $request;
        }
    }
    Lors de l'appel de la page d'accueil (donc dès la première entrée de l'utilisateur), j'ai enregistré le listener ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $dispatcher = $this->get('event_dispatcher');
    $subscriber = new LocaleListener();
    $dispatcher->addSubscriber($subscriber);
    puis j'ai remplacé ma méthode changeLanguageAction comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public function changeLanguageAction($langue=null){
            $url = $this->container->get('router')->generate('acme_biomedical_homepage');
            $dispatcher = $this->get('event_dispatcher');
            $event=new ChangeLanguageEvent($langue);
            $dispatcher->dispatch("kernel.request",$event);
            return $this->redirect($url);
        }
    Et évidemment c'est le même phénomène qui se produit cad que la redirection efface les motif. Je suis entrain d'essayer de trouver une astuce pour appeler cette méthode sans pour autant rediriger (j'ai pensé à l'appeler via un JS). Je fais un EDIT si besoin dès que j'avance sur ce problème.
    EDIT: Je suis passé par la fonction ajax de JQuery mais rien n'y fait (là je ne fait plus la redirection). C'est comme si je ne faisais rien .

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Comme dit + haut, la solution la + propre est de mettre la locale dans l'url.
    A partir de là, faire un langage switcher est trés simple, ça ne requiert même plus de créer des actions pour cela, juste un peu de code twig.

  5. #5
    Membre confirmé
    Homme Profil pro
    PHP + JAVA
    Inscrit en
    Mars 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : PHP + JAVA

    Informations forums :
    Inscription : Mars 2009
    Messages : 65
    Par défaut
    AHAHAH la solution que tu m'as indiqué m'a l'air de me convenir et du coup les deux classes que j'ai créé ne servent pas à grand chose au final. Dans mon twig j'ai fait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <a href="{{  path(app.request.get('_route'), app.request.get('_route_params')|merge({'_locale':'fr'}))}}" >
    <imgid="flag_1"alt="Drapeau français"src="{{ asset('bundles/acmebiomedical/images/drapeau-Francais.jpg')}}" title="Drapeau français"lang="fr"/>
    			</a>
    			<a href="{{  path(app.request.get('_route'), app.request.get('_route_params')|merge({'_locale':'en'}))}}">
    <imgid="flag_2"alt="Drapeau anglais"src="{{ asset('bundles/acmebiomedical/images/drapeau-Anglais.jpg')}}" title="Drapeau anglais"lang="en"/>
    			</a>
    (Ce sont des images clivables). Et dans mon contrôleur de ma page d'accueil je fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public function indexAction(){
        	$langue = $this->container->get('request')->get("_locale");
        	if (isset($langue)){
        		$request = $this->getRequest();
        		$request->setDefaultLocale($langue);
        		$request->setLocale($langue);
        		$session = new Session();
        		$session->start();
        		$session->set('_locale', $langue);
        	}
    return $this->render('AcmeBiomedicalBundle:Default:index.html.twig',array('title'=>'BioMedicalSemantic'));
        }
    Après il suffira que sur les autres méthodes des autres contrôleurs je récupère la valeur de _locale de ma session et que je force à nouveau ma locale (en effet dès que je change de page l'appel à HTTP efface les modifications). Une dernière question et je pense que mon problème sera résolu. Dois-je faire le fameux session->start à chaque fois pour récupérer ma valeur avec get (a priori oui mais je voudrais avoir confirmation. Ouaip effectivement c'est le cas je viens de tester ). Et en fait sur chaque chaque contrôleur susceptible de récupérer l'action de changement de langue je suis obligé de récupérer la langue par le même moyen (si l'utilisateur veut à nouveau changer).
    C'est un peu lourd mais bon ça fonctionne plutôt bien. Donc je met ce sujet en résolu.
    Merci encore pour ton aide précieuse.

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

Discussions similaires

  1. [1.x] Retours d'expérience avec Symfony
    Par ygrim dans le forum Symfony
    Réponses: 6
    Dernier message: 05/09/2007, 15h13
  2. Traduction avec Gettext
    Par glsn dans le forum Langage
    Réponses: 3
    Dernier message: 25/07/2007, 10h29
  3. [FASM=>NASM] Problème traduction avec MOD et $
    Par SteelBox dans le forum Assembleur
    Réponses: 4
    Dernier message: 30/05/2005, 14h16
  4. Traduction avec gettext
    Par aA189 dans le forum Linux
    Réponses: 7
    Dernier message: 19/10/2004, 14h57
  5. Traduction avec Polyglot
    Par TheViviTouch' dans le forum Outils
    Réponses: 3
    Dernier message: 01/08/2004, 23h32

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