src/EventSubscriber/LocaleSubscriber.php line 25

  1. <?php
  2. namespace App\EventSubscriber;
  3. use JetBrains\PhpStorm\ArrayShape;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpKernel\Event\RequestEvent;
  6. use Symfony\Component\HttpKernel\KernelEvents;
  7. class LocaleSubscriber implements EventSubscriberInterface
  8. {
  9.     private mixed $defaultLocale;
  10.     public function __construct($defaultLocale 'hr')
  11.     {
  12.         $this->defaultLocale $defaultLocale;
  13.     }
  14.     public function onKernelRequest(RequestEvent $event)
  15.     {
  16.         $request $event->getRequest();
  17.         $session $request->getSession();
  18.         // Check if the user has already chosen a locale in a previous visit
  19.         $userLocale $session->get('_locale');
  20.         if ($userLocale) {
  21.             $request->setLocale($userLocale);
  22.         } else {
  23.             $browserLocale $this->getLocaleFromIp($request->getClientIp());
  24.             // No user choice stored, so proceed with automatic detection
  25.             //$browserLocale = $this->getLocaleFromAcceptLanguageHeader();
  26.             if ($browserLocale) {
  27.                 $request->setLocale($browserLocale);
  28.             } else {
  29.                 $request->setLocale($this->defaultLocale);
  30.             }
  31.         }
  32.         // Allow user to change the language and store it in the session
  33.         $newLocale $request->query->get('_locale');
  34.         if (in_array($newLocale, ['hr''en''de''it''sl'])) {
  35.             $request->setLocale($newLocale);
  36.             $session->set('_locale'$newLocale);
  37.         }
  38.     }
  39.     #[ArrayShape([KernelEvents::REQUEST => "array[]"])] public static function getSubscribedEvents(): array
  40.     {
  41.         return [
  42.             KernelEvents::REQUEST => [['onKernelRequest'20]],
  43.         ];
  44.     }
  45.     private function getLocaleFromIp($ip)
  46.     {
  47.         $langs = ['hr''en''de''it''sl'];
  48.         $ipdat = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=" $ip));
  49.         $acceptLanguageHeader $ipdat && $ipdat->geoplugin_countryCode strtolower($ipdat->geoplugin_countryCode) : "";
  50.         $preferredLanguages array_map(
  51.             function ($language) {
  52.                 return substr($language02); // Extract the language code
  53.             },
  54.             explode(','$acceptLanguageHeader)
  55.         );
  56.         foreach ($preferredLanguages as $preferredLang) {
  57.             if (in_array($preferredLang$langs)) {
  58.                 return $preferredLang;
  59.             }
  60.         }
  61.         return null;
  62.     }
  63.     private function getLocaleFromAcceptLanguageHeader()
  64.     {
  65.         $langs = ['hr''en''de''it''sl'];
  66.         $acceptLanguageHeader $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? '';
  67.         $preferredLanguages array_map(
  68.             function ($language) {
  69.                 return substr($language02); // Extract the language code
  70.             },
  71.             explode(','$acceptLanguageHeader)
  72.         );
  73.         foreach ($preferredLanguages as $preferredLang) {
  74.             if (in_array($preferredLang$langs)) {
  75.                 return $preferredLang;
  76.             }
  77.         }
  78.         return null;
  79.     }
  80. }