Hello,

J'ai un petit soucis pour la mise en place du changement de langue...

J'ai bien généré les fichiers de traduction en en_US et fr_FR sans soucis.

J'ai bien entendu modifier parameter.yml
Jusque là tout semble bon, lorsque j'arrive sur le site, la langue est bonne.

J'ai ensuite ajouté une action afin de changer de langue /changelocale/{locale}
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
33
34
/**
   * @Route("/changelocale/{locale}", name="frontend_changelocale")
   */
  public function changelocaleAction(Request $request, $locale)
  {
    $em = $this->getDoctrine()->getManager();
 
    switch ($locale){
      case "de":
        $newLocale = "de_DE";
        break;
      case "es":
        $newLocale = "es_ES";
        break;
      case "fr":
        $newLocale = "fr_FR";
        break;
      case "it":
        $newLocale = "it_IT";
        break;
      case "nl":
        $newLocale = "nl_NL";
        break;
      case "en":
      default:
        $newLocale = "en_US";
        break;
    }
 
    $this->get('session')->set('_locale', $newLocale);
    $request->setLocale($newLocale);
 
    return $this->redirect($request->server->get('HTTP_REFERER'));
  }
Mais la, il ne veut plus changer la langue...

Vous remarquerez que ne sachant pas quelle méthode utiliser, j'ai tenté les 2:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
    $this->get('session')->set('_locale', $newLocale);
    $request->setLocale($newLocale);
On parcourant la doc, celle ci parle de mettre en place un listener
Code yaml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
locale_listener:
        class: MyApp\GlobalBundle\Listener\LocaleListener
        arguments: ['@session', '%kernel.default_locale%']
        tags:
            - { name: kernel.event_subscriber }

Mais pour le code... celui de la doc ne me convient pas car il fait référence à une locale passée en paramètre de l'url.
Hors ici, je tente de la placer en session afin de ne pas avoir ce flag dans l'url et d'être plus propre...

J'ai donc tenté ceci:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php
namespace MyApp\GlobalBundle\Listener;
 
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
class LocaleListener implements EventSubscriberInterface
{
    private $defaultLocale;
 
    public function __construct(Session $session, $defaultLocale = 'en_US')
    {
      $this->session = $session;
      $this->defaultLocale = $defaultLocale;
    }
 
    public function onKernelRequest(GetResponseEvent $event)
    {
      $request = $event->getRequest();
 
      if ( $this->session->get('_locale') ) {
        $request->setLocale( $this->session->get('_locale') );
        return;
      }
 
      $headers = $request->headers;
 
      // récupération de la langue du browser (meme si ca semble innutile car c'est toujours anglais...)
      $known_langs = array('de', 'en', 'es', 'fr', 'it', 'nl');
      $user_pref_langs = explode(',', $headers->get('Accept-Language'));
      foreach ($user_pref_langs as $idx => $lang) {
        $lang = substr($lang, 0, 2);
        if (in_array($lang, $known_langs)) {
          break;
        }
      }
 
      switch ($lang) {
        case "de":
          $newLocale = "de_DE";
          break;
        case "es":
          $newLocale = "es_ES";
          break;
        case "fr":
          $newLocale = "fr_FR";
          break;
        case "it":
          $newLocale = "it_IT";
          break;
        case "nl":
          $newLocale = "nl_NL";
          break;
        case "en":
        default:
          $newLocale = "en_US";
          break;
      }
 
      $request->setLocale($newLocale);
      $this->session->set('_locale', $newLocale);
    }
 
    public static function getSubscribedEvents()
    {
      return [
        // must be registered before (i.e. with a higher priority than) the default Locale listener
        KernelEvents::REQUEST => [['onKernelRequest', 20]],
      ];
    }
Arrivé ici, c'est parfait mon changement de langue fonctionne !!!

...Enfin jusqu’à ce que je change de page ou actualise la page...
Dés que je quitte la page, il oublie la langue actuelle et reprend celle par default...

Je ne vois pas comment m'en sortir...
J'ai beau retourner ce code dans tous les sens, je ne comprends pas la logique interne a symfony pour gérer les langues...

Avez vous une solution pour moi?

Merci à vous !!!