Sto provando ad implementare un LocaleListener che rileva la lingua preferita dell'utente (considerando l'intestazione Accept-Language) e lo memorizza in sessione per evitare di controllarlo ogni richiesta. Ho sviluppato il codice qui sotto per ottenere questo risultato:Rilevamento locale Symfony2: non considerando _locale in sessione
public function onKernelRequest(GetResponseEvent $event) {
$request = $event->getRequest();
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
return;
}
$preferredLocale = $request->getPreferredLanguage($this->availableLocales);
if ($this->container->has('session')) {
$session = $this->container->get('session');
if (!$session->has('_locale')) {
$session->set('_locale', $preferredLocale);
}
} else {
$request->setLocale($preferredLocale);
}
}
Il codice funziona, la lingua preferita viene memorizzato in sessione, ma symfony non sta prendendo in considerazione il locale memorizzato nella sessione di tradurre le stringhe. Nel mio caso, la mia lingua preferita era 'pt_BR' e quando scappo:
{{ app.request.locale }}
symfony fuoriesce 'en'. Symfony non dovrebbe considerare il valore memorizzato nella sessione ('_ locale') per definire le impostazioni locali della richiesta? È un comportamento corretto? Come posso farlo?
Grazie, @Pazi. Ho due domande sul tuo frammento di codice: 1) è una buona idea quella di impostare il locale in ogni richiesta? Ho cercato di evitare questa memorizzazione locale in sessione. 2) Dove hai impostato la tua locale in sessione? Cosa restituisce il tuo metodo $ user-> getLanguage()? –
Nel mio progetto non c'è problema. Ho preso questo frammento anche da un'altra fonte, ma non conosco più l'url .. Puoi modificarlo per usare solo il _ _locale' nella sessione. In passato, come ho introdotto questo, non aveva funzionato.'$ user-> getLanguage()' è un campo linguistico semplice nella mia entità utente, perché i miei utenti possono decidere in quale lingua utilizzare l'applicazione web, indipendentemente dalle impostazioni internazionali del browser. –