<?php
namespace App\Service;
use App\Services\LocaleDetectionService;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Core\Security;
class LocaleService
{
private LocaleDetectionService $localeDetectionService;
private RequestStack $requestStack;
private SessionInterface $session;
private Security $security;
public function __construct(
LocaleDetectionService $localeDetectionService,
RequestStack $requestStack,
SessionInterface $session,
Security $security
) {
$this->localeDetectionService = $localeDetectionService;
$this->requestStack = $requestStack;
$this->session = $session;
$this->security = $security;
}
/**
* Applique la locale appropriée à la requête actuelle
*/
public function applyLocale(): void
{
$request = $this->requestStack->getCurrentRequest();
if (!$request) {
return;
}
// Ignorer certaines routes
if ($this->shouldSkipLocaleDetection($request)) {
return;
}
// 1. PRIORITÉ ABSOLUE : Si une locale manuelle est définie, l'appliquer et STOP
if ($this->session->has('_locale_manual') && $this->session->has('_locale')) {
$sessionLocale = $this->session->get('_locale');
if ($sessionLocale && $this->isLocaleSupported($sessionLocale)) {
$request->setLocale($sessionLocale);
return; // IMPORTANT: On ne fait pas de détection automatique si locale manuelle
}
}
// 2. Détection automatique pour les utilisateurs non connectés
$detectedLocale = $this->localeDetectionService->detectLocale($request);
if ($this->isLocaleSupported($detectedLocale)) {
$request->setLocale($detectedLocale);
$this->session->set('_locale', $detectedLocale);
}
}
/**
* Définit une locale manuellement
*/
public function setManualLocale(string $locale): void
{
if ($this->isLocaleSupported($locale)) {
$this->session->set('_locale', $locale);
$this->session->set('_locale_manual', true);
// Appliquer immédiatement à la requête actuelle
$request = $this->requestStack->getCurrentRequest();
if ($request) {
$request->setLocale($locale);
}
}
}
/**
* Réinitialise la détection automatique
*/
public function resetToAutoDetection(): void
{
$this->session->remove('_locale_manual');
// Redétecter automatiquement
$request = $this->requestStack->getCurrentRequest();
if ($request) {
$detectedLocale = $this->localeDetectionService->detectLocale($request);
if ($this->isLocaleSupported($detectedLocale)) {
$request->setLocale($detectedLocale);
$this->session->set('_locale', $detectedLocale);
}
}
}
/**
* Force la redétection de la locale après une connexion réussie
*/
public function forceRedetectionAfterLogin(): void
{
$request = $this->requestStack->getCurrentRequest();
if (!$request) {
return;
}
// Détecter la locale basée sur l'utilisateur maintenant connecté
$detectedLocale = $this->localeDetectionService->detectLocale($request);
if ($this->isLocaleSupported($detectedLocale)) {
// NOUVELLE LOGIQUE : Stocker la locale basée sur le pays comme locale "manuelle"
// Cela garantit qu'elle sera respectée lors des prochaines requêtes
$this->session->set('_locale', $detectedLocale);
$this->session->set('_locale_manual', true); // Marquer comme manuelle pour qu'elle soit respectée
$request->setLocale($detectedLocale);
}
}
/**
* Vérifie si la détection de locale doit être ignorée
*/
private function shouldSkipLocaleDetection($request): bool
{
$path = $request->getPathInfo();
$skipPatterns = [
'/api/',
'/admin/',
'/_profiler/',
'/_wdt/',
'/locale/switch',
'/test-locale',
];
foreach ($skipPatterns as $pattern) {
if (strpos($path, $pattern) === 0) {
return true;
}
}
return false;
}
/**
* Vérifie si la locale est supportée
*/
private function isLocaleSupported(string $locale): bool
{
$supportedLocales = ['fr', 'en'];
return in_array($locale, $supportedLocales);
}
}