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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part locale_default: en_US
J'ai ensuite ajouté une action afin de changer de langue /changelocale/{locale}
Mais la, il ne veut plus changer la langue...
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')); }
Vous remarquerez que ne sachant pas quelle méthode utiliser, j'ai tenté les 2:
On parcourant la doc, celle ci parle de mettre en place un listener
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $this->get('session')->set('_locale', $newLocale); $request->setLocale($newLocale);
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:
Arrivé ici, c'est parfait mon changement de langue fonctionne !!!
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]], ]; }
...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 !!!
Partager