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 :

Changer la langue (traduction) [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut Changer la langue (traduction)
    Bonjour,

    voila je cherche à faire une traduction des page d'une application,

    voici un extrait de routing.yml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    isea_choisir_langue:
        pattern: /{_locale}/choisir-langue/{langue}
        defaults: { _controller: IseaAgtsBundle:Default:choisirLangue}
     
    isea_dossierTransport_lister:
      pattern: /{_locale}/dossierTransport/
      defaults: { _controller: IseaAgtsBundle:DossierTransport:lister}
     
    isea_dossierTransport_ajouter:
      pattern: /{_locale}/dossierTransport/ajouter
      defaults: { _controller: IseaAgtsBundle:DossierTransport:editer}
    et le lien de changement de langue:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	<div id="choisir_langue">Choisir la langue :
                <a href="{{ path('isea_choisir_langue', {'langue' : 'fr'}) }}">FR</a> |
                <a href="{{ path('isea_choisir_langue', {'langue' : 'en'}) }}">EN</a>
            </div>
    et la fonction de choisirLangue():

    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 choisirLangueAction($langue = null)
    	{
    	    if($langue != null)
    	    {
    	        // On enregistre la langue en session
    	        $this->container->get('request')->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('isea_dossierTransport_lister');
    	    }
    	    return new RedirectResponse($url);
        }

    avec ce code si je clique sur le lien pour passer de Français à Anglais, le rechargement de la même page passe bien mais avec la même langue.

    Si je tape directement l'url : http://localhost/Symfony2/web/app_de...sierTransport/
    ou
    http://localhost/Symfony2/web/app_de...sierTransport/

    ça marche.

    Je me demande devient l'erreur?


    Merci.

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,
    sur Symfony2.1> la gestion des locales passe par l'url, auparavant c'était en session.
    c'est ce que tu as configuré dans ton routing, si tu redirige sur l'url précédente (le referer qui contient donc l'ancienne locale), c'est normal que ça ne fonctionne pas.


    ce code devrait fonctionner (mais j'ai pas testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    {%for locale,localeLabel in {'en':'english','fr':'français'} %}{#les langues disponibles#}
      {%set route_name=app.request.attribute.get('_route_name')%}{#le nom de la route actuelle#}
      {%set route_parameters={'_locale':locale}| merge(app.request.attribute.get('_route_params'))%}{#les paramètres de la route actuelle avec modification du paramètre "_locale"#}
      <a href="{{url(route_name,route_parameters)}}">{#on regenère la route actuelle avec le paramètre '_locale' différent #}
      {{localeLabel}}
      </a>
    {%endfor%}

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    j'ai inclut votre script, dans la Template (est ce c'est le bon endroit??)

    mais ça me donne l'erreur:
    Method "attribute" for object "Symfony\Component\HttpFoundation\Request" does not exist in IseaAgtsBundle::layout.html.twig


    j'ai essayé d'ajouter au début du script
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {% use Symfony\Component\HttpFoundation\Request %}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {{ use Symfony\Component\HttpFoundation\Request }}
    mais ça me donne une erreur de syntaxe:
    Unexpected character "\"


    autres propositions?


    Merci.

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Essaie avec app.request.get directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    {%for locale,localeLabel in {'en':'english','fr':'français'} %}{#les langues disponibles#}
      {%set route_name=app.request.get('_route_name')%}{#le nom de la route actuelle#}
      {%set route_parameters={'_locale':locale}| merge(app.request.get('_route_params'))%}{#les paramètres de la route actuelle avec modification du paramètre "_locale"#}
      <a href="{{url(route_name,route_parameters)}}">{#on regenère la route actuelle avec le paramètre '_locale' différent #}
      {{localeLabel}}
      </a>
    {%endfor%}

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    merci pour votre réponse,

    je viens de tester avec votre 2 éme proposition, mais ça donne une erreur:

    An exception has been thrown during the rendering of a template ("Route "" does not exist.") in "IseaAgtsBundleossierTransport:lister.html.twig".


    Juste pour s'assurer ce code devrait être dans la template et non pas dans le controleur?

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    le mieux serait alors d'aller dans le profiler, onglet "Request" et voir ce qui est disponible dans la section "Request Attributes"

    en SF2.0 il y avait "_controller" et "_route"
    en SF2.1 il y a "_controller" , "_route_name', "_route_params",...
    il faut s'assurer que ces attributs sont bien présent dans l'objet Request et modifier le twig en conséquences.

    pour débug dans twig:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    {%set route_name=app.request.get('_route_name','undefined')%}{#le nom de la route actuelle#}
    le nom de la route est {{route_name}}
    <br/> les paramètres sont:
    {%for key,value in app.request.get('_route_params',{'un':'defined'})%}
    <br/>{{key}}=>{{value}}
    {%endfor%}
    Juste pour s'assurer ce code devrait être dans la template et non pas dans le controleur?
    Oui il s'agit bien d'un code twig

    [edit]
    Dans tout les cas un petit test pour vérifier l'existence des paramètres ne peut pas faire de mal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    {%for locale,localeLabel in {'en':'english','fr':'français'} %}{#les langues disponibles#}
      {%set route_name=app.request.get('_route_name')%}{#le nom de la route actuelle#}
       {%if route_name%} {#si le nom de la route actuelle est disponible#}
      {%set route_parameters={'_locale':locale}| merge(app.request.get('_route_params'))%}{#les paramètres de la route actuelle avec modification du paramètre "_locale"#}
      <a href="{{url(route_name,route_parameters)}}">{#on regenère la route actuelle avec le paramètre '_locale' différent #}
      {{localeLabel}}
      </a>
      {%else%}
      <a href="{{url('home',{'_locale':locale})}}">{#redirection vers l'accueil#}
       {{localeLabel}}
      </a>
      {%endif%}
    {%endfor%}

  7. #7
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    super ça marche, avec le dernier code.


    juste que là il y a une redirection vers la page d’accueil, je vais voir comment la faire vers la page courante. mais c'est pas une priorité; j'ai d'autres points à apprendre et à régler.

    et pour les gents qui vont evetuellement voir ce post:

    _la version que j'utilise est: 2.1.7

    et dans profiler j'ai:

    _locale en
    _route_params 'Array(_locale => en, id => 1)'
    id '1'



    Merci bcp.

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

Discussions similaires

  1. Changer la langue des raccourcis clavier?
    Par tictactouc dans le forum C++Builder
    Réponses: 1
    Dernier message: 06/01/2006, 03h07
  2. [VCL] Comment changer de langue à l'exécution ?
    Par Zatoobux dans le forum Composants VCL
    Réponses: 1
    Dernier message: 27/09/2005, 19h08
  3. Changer la langue de l'application
    Par dabeuliou dans le forum Qt
    Réponses: 3
    Dernier message: 26/09/2005, 16h40
  4. [Debutant(e)] changer la langue dans eclipse
    Par omega dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 16/03/2004, 17h47
  5. fonction MessageDlg Delphi :changer la langue
    Par julie20 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 06/06/2003, 18h44

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