src/Service/LocaleService.php line 93

Open in your IDE?
  1. <?php
  2. namespace App\Service;
  3. use App\Services\LocaleDetectionService;
  4. use Symfony\Component\HttpFoundation\RequestStack;
  5. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  6. use Symfony\Component\Security\Core\Security;
  7. class LocaleService
  8. {
  9.     private LocaleDetectionService $localeDetectionService;
  10.     private RequestStack $requestStack;
  11.     private SessionInterface $session;
  12.     private Security $security;
  13.     public function __construct(
  14.         LocaleDetectionService $localeDetectionService,
  15.         RequestStack $requestStack,
  16.         SessionInterface $session,
  17.         Security $security
  18.     ) {
  19.         $this->localeDetectionService $localeDetectionService;
  20.         $this->requestStack $requestStack;
  21.         $this->session $session;
  22.         $this->security $security;
  23.     }
  24.     /**
  25.      * Applique la locale appropriée à la requête actuelle
  26.      */
  27.     public function applyLocale(): void
  28.     {
  29.         $request $this->requestStack->getCurrentRequest();
  30.         
  31.         if (!$request) {
  32.             return;
  33.         }
  34.         // Ignorer certaines routes
  35.         if ($this->shouldSkipLocaleDetection($request)) {
  36.             return;
  37.         }
  38.         // 1. PRIORITÉ ABSOLUE : Si une locale manuelle est définie, l'appliquer et STOP
  39.         if ($this->session->has('_locale_manual') && $this->session->has('_locale')) {
  40.             $sessionLocale $this->session->get('_locale');
  41.             if ($sessionLocale && $this->isLocaleSupported($sessionLocale)) {
  42.                 $request->setLocale($sessionLocale);
  43.                 return; // IMPORTANT: On ne fait pas de détection automatique si locale manuelle
  44.             }
  45.         }
  46.         // 2. Détection automatique pour les utilisateurs non connectés
  47.         $detectedLocale $this->localeDetectionService->detectLocale($request);
  48.         
  49.         if ($this->isLocaleSupported($detectedLocale)) {
  50.             $request->setLocale($detectedLocale);
  51.             $this->session->set('_locale'$detectedLocale);
  52.         }
  53.     }
  54.     /**
  55.      * Définit une locale manuellement
  56.      */
  57.     public function setManualLocale(string $locale): void
  58.     {
  59.         if ($this->isLocaleSupported($locale)) {
  60.             $this->session->set('_locale'$locale);
  61.             $this->session->set('_locale_manual'true);
  62.             
  63.             // Appliquer immédiatement à la requête actuelle
  64.             $request $this->requestStack->getCurrentRequest();
  65.             if ($request) {
  66.                 $request->setLocale($locale);
  67.             }
  68.         }
  69.     }
  70.     /**
  71.      * Réinitialise la détection automatique
  72.      */
  73.     public function resetToAutoDetection(): void
  74.     {
  75.         $this->session->remove('_locale_manual');
  76.         
  77.         // Redétecter automatiquement
  78.         $request $this->requestStack->getCurrentRequest();
  79.         if ($request) {
  80.             $detectedLocale $this->localeDetectionService->detectLocale($request);
  81.             if ($this->isLocaleSupported($detectedLocale)) {
  82.                 $request->setLocale($detectedLocale);
  83.                 $this->session->set('_locale'$detectedLocale);
  84.             }
  85.         }
  86.     }
  87.     /**
  88.      * Force la redétection de la locale après une connexion réussie
  89.      */
  90.     public function forceRedetectionAfterLogin(): void
  91.     {
  92.         $request $this->requestStack->getCurrentRequest();
  93.         if (!$request) {
  94.             return;
  95.         }
  96.         // Détecter la locale basée sur l'utilisateur maintenant connecté
  97.         $detectedLocale $this->localeDetectionService->detectLocale($request);
  98.         
  99.         if ($this->isLocaleSupported($detectedLocale)) {
  100.             // NOUVELLE LOGIQUE : Stocker la locale basée sur le pays comme locale "manuelle"
  101.             // Cela garantit qu'elle sera respectée lors des prochaines requêtes
  102.             $this->session->set('_locale'$detectedLocale);
  103.             $this->session->set('_locale_manual'true); // Marquer comme manuelle pour qu'elle soit respectée
  104.             $request->setLocale($detectedLocale);
  105.         }
  106.     }
  107.     /**
  108.      * Vérifie si la détection de locale doit être ignorée
  109.      */
  110.     private function shouldSkipLocaleDetection($request): bool
  111.     {
  112.         $path $request->getPathInfo();
  113.         
  114.         $skipPatterns = [
  115.             '/api/',
  116.             '/admin/',
  117.             '/_profiler/',
  118.             '/_wdt/',
  119.             '/locale/switch',
  120.             '/test-locale',
  121.         ];
  122.         foreach ($skipPatterns as $pattern) {
  123.             if (strpos($path$pattern) === 0) {
  124.                 return true;
  125.             }
  126.         }
  127.         return false;
  128.     }
  129.     /**
  130.      * Vérifie si la locale est supportée
  131.      */
  132.     private function isLocaleSupported(string $locale): bool
  133.     {
  134.         $supportedLocales = ['fr''en'];
  135.         return in_array($locale$supportedLocales);
  136.     }
  137. }