Changer la langue dans Symfony 2

Ce contenu a 5 ans et n'est donc peut-être plus à jour.

Vous souhaitez faire une application Symfony 2 multilingue ?
Ce n’est pas difficile, il suffit de modifier 4 fichiers.


PS: Je part du principe que vous avez déjà fait vos fichiers de traduction. Si ce n’est pas le cas, rendez-vous dans le Book Symfony 2 !

Premièrement, il faut créer un listener.
Créez le fichier VotreBundle/EventListener/LocalListener.php et collez-y ceci:

Ensuite, dans VotreBundle/Resources/config/services.yml (je travaille en YAML, je vous laisse adapter à vos besoins si vous êtes en XML ou autre), ajouter les lignes suivantes:

Il nous faut un contrôleur pour demander le changement de langue:

Et enfin, dans votre twig, mettez des petits boutons avec, par exemple, un drapeau:

And Voila ! 🙂

14 commentaires

  • Bonjour,

    Il manque une virgule dans l’anotation de la fonction du controller (ligne 7), remplacer par :

    @Route(“/setlocale/{language}”, name=”setlocale”)

  • Salut, merci pour ton code 🙂
    Quand je l’utilise moi j’ai un
    ReflectionException in RegisterListenersPass.php line 101: Class Fw\FollowBundle\EventListener\LocaleListener does not exist

    J’ai trouvé un post sur la même chose sur stackoverflow, mais pas de réponse. (je précise que, contrairement a la personne qui a eu le pb sur stack, je n’ai pas fait d’erreur sur le namespace)
    As-tu eu le pb ? merci 🙂

  • Bonjour,Je me permets de vous contacter suite à votre tutoriel : Changer la langue dans Symfony 2.En effet, j’ai appliqué à la lettre ce que vous aviez fait, mais je suis tombé sur une erreur que je ne comprend pas et que je n’arrive pas à corriger.Ci-dessous mon erreur :InvalidArgumentException in RegisterListenerPass.php line 103:Service “front_bundle.locale_listener” must implement interface “Symfony\Component\EventDispatcher\EventSubscriberInterface”.Mon fichier : services.ymlservices: front_bundle.locale_listener: class: FrontBundle\EventListener\LocaleListenere arguments: [“%kernel.default_locale%”] tags: – { name: kermel.event_subscriber }Avez-vous une idée sur ce type d’erreur? Si quelqu’un l’a déjà traité. Je ne trouve rien sur le net.Merci par avance !

    • Bonjour 🙂

      Vous avez écrit:

      Mon fichier : services.yml

      services:
      front_bundle.locale_listener:
      class: FrontBundle\EventListener\LocaleListenere
      arguments: [“%kernel.default_locale%”]
      tags:
      – { name: kermel.event_subscriber }

      Le problème ne viendrait pas du
      class: FrontBundle\EventListener\LocaleListenere
      au lieu de class: FrontBundle\EventListener\LocaleListener (Un “e” en trop dans “LocaleListener” à la fin) ?

      • Merci d’avoir pris le temps de me répondre.
        Oui justement c’était une erreur de saisie. J’ai corrigé mais toujours l’erreur s’affiche.

        • C’est bon j’ai trouvé la solution au problème. Il suffit de rajouter le namespace de mon bundle (FrontBundle) dans les fichiers: services.yml et LocaleListener.php.

          Merci bcp ! A bientôt!

  • Bonjour, merci pour ce tuto !

    Je voulais savoir s’il était possible de détecter la locale de l’utilisateur et de la charger, tout en laissant la possibilité de choisir la langue via une liste déroulante ?

    Pour le moment j’ai mis en place une liste déroulante qui fonctionne (juste français / anglais pour le moment) cependant quand je me rends sur la page d’accueil, c’est automatiquement la langue anglaise qui est chargée !

    Savez-vous comment faire ? Merci d’avance !

  • Bonjour,J’ai un problème, lorsque je clique sur mon EN ou FR j’obtiens cette erreur:You have requested a non-existent service “request”. Did you mean one of these: “data_collector.request”, “fos_rest.request.param_fetcher”, “fos_rest.request.param_fetcher.reader”, “monolog.logger.request”, “request_stack”, “router.request_context”, “validate_request_listener”?et correspond à la ligne:$url = $this->container->get(‘request’)->headers->get(‘referer’);Merci d’avance pour votre réponse.