Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

551
Views
Symfony 5: redirección después de la traducción del sitio web según el idioma del navegador

Actualmente estoy trabajando en Symfony 5 y he traducido completamente mi sitio web en varios idiomas. Tengo un botón para seleccionar el idioma, pero me gustaría que el idioma por defecto del sitio sea el del usuario (de su navegador más precisamente). De momento he encontrado una solución, pero no es nada óptima.

Lo que hago es que en mi índice compruebo si el usuario ya ha navegado por el sitio antes, y si no, lo redirijo a una ruta change_locale que tomará como parámetro el idioma en cuestión (Entra en la condición solo si es su primera visita)

 public function index(Request $request): Response { // If this is the first visit to the site, the default language is set according to the user's browser language if (!$request->hasPreviousSession()) { return $this->redirectToRoute('change_locale', ['locale' => strtolower(str_split($_SERVER['HTTP_ACCEPT_LANGUAGE'], 2)[0])]); } return $this->render('accueil/index.html.twig'); }

Aquí simplemente registro la variable en la sesión para cambiar el idioma. Y mi problema es justo después de este paso. Cuando el usuario simplemente hace clic en el botón de cambio de idioma en el sitio, vuelve a la página anterior (no ingresa el si). Sin embargo, si llega al sitio por primera vez, es redirigido desde el índice, y cuando llega a esta ruta, ingresa la condición if (!$request->hasPreviousSession()) y... Ese es el problema . Porque si no ha visitado nada antes, no puedo redirigirlo a la página que estaba visitando.

 /** * @Route("/change-locale/{locale}", name="change_locale") */ public function changeLocale($locale, Request $request) { $request->getSession()->set('_locale', $locale); // Storing the requested language in the session // If it's the first page visited by the user if (!$request->headers->get('referer')) { return $this->redirectToRoute('index'); } // Back to the previous page return $this->redirect($request->headers->get('referer')); }

Así que trato de eliminar esta condición de mi ruta change_locale y encuentro una manera de agregar en el encabezado de la solicitud el atributo 'referer' que apunta a la página anterior. Podría hacer esto en mi índice antes de hacer redirectToRoute to change_locale .

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

No utilice una redirección para establecer la configuración regional.

La documentación de Symfony sobre Cómo trabajar con la configuración regional del usuario tiene una excelente sugerencia: usa un detector de eventos personalizado en su lugar. Lea también Hacer que la configuración regional sea "fija" durante la sesión de un usuario .

Puede usar este ejemplo de la documentación:

 class LocaleSubscriber implements EventSubscriberInterface { private $defaultLocale; public function __construct(string $defaultLocale = 'en') { $this->defaultLocale = $defaultLocale; } public function onKernelRequest(RequestEvent $event) { $request = $event->getRequest(); if (!$request->hasPreviousSession()) { return; } // try to see if the locale has been set as a _locale routing parameter if ($locale = $request->attributes->get('_locale')) { $request->getSession()->set('_locale', $locale); } else { // if no explicit locale has been set on this request, use one from the session $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale)); } } public static function getSubscribedEvents() { return [ // must be registered before (ie with a higher priority than) the default Locale listener KernelEvents::REQUEST => [['onKernelRequest', 20]], ]; } }

Y algunos consejos gratuitos: en el método onKernelRequest puede usar HTTP_ACCEPT_LANGUAGE para ver qué idioma podría usar el usuario, pero (¡como todas las demás entradas del usuario!) puede no estar disponible o no ser confiable. Es posible que desee utilizar información de la dirección IP del usuario u otra lógica.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!