Skip to content

Commit

Permalink
[HttpKernel] Fix respecting default locale in Accept-Language-based l…
Browse files Browse the repository at this point in the history
…ocale detection
  • Loading branch information
chalasr committed Dec 21, 2023
1 parent 1de8768 commit e9887af
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 1 deletion.
Expand Up @@ -41,6 +41,15 @@ public function __construct(RequestStack $requestStack, string $defaultLocale =
$this->requestStack = $requestStack;
$this->router = $router;
$this->useAcceptLanguageHeader = $useAcceptLanguageHeader;

// Make $defaultLocale first in $enabledLocales so that Request::getPreferredLanguages() uses it as fallback
if ($defaultLocale !== ($enabledLocales[0] ?? false)) {
if (false !== ($k = \array_search($defaultLocale, $enabledLocales))) {
unset($enabledLocales[$k]);
}
array_unshift($enabledLocales, $defaultLocale);
}

$this->enabledLocales = $enabledLocales;
}

Expand Down Expand Up @@ -68,7 +77,7 @@ private function setLocale(Request $request)
{
if ($locale = $request->attributes->get('_locale')) {
$request->setLocale($locale);
} elseif ($this->useAcceptLanguageHeader && $this->enabledLocales && ($preferredLanguage = $request->getPreferredLanguage($this->enabledLocales))) {
} elseif ($this->useAcceptLanguageHeader && $this->enabledLocales && $request->headers->has('Accept-Language') && ($preferredLanguage = $request->getPreferredLanguage($this->enabledLocales))) {
$request->setLocale($preferredLanguage);
$request->attributes->set('_vary_by_language', true);
}
Expand Down
Expand Up @@ -117,6 +117,17 @@ public function testRequestLocaleIsNotOverridden()
$this->assertEquals('de', $request->getLocale());
}

public function testRequestLocaleIsNotOverridenIfNoAcceptLanguageHeaderSet()
{
$request = Request::create('/');
$request->setLocale('de');
$listener = new LocaleListener($this->requestStack, 'de', null, true, ['fr', 'pl', 'de']);
$event = $this->getEvent($request);

$listener->onKernelRequest($event);
$this->assertEquals('de', $request->getLocale());
}

public function testRequestPreferredLocaleFromAcceptLanguageHeader()
{
$request = Request::create('/');
Expand Down

0 comments on commit e9887af

Please sign in to comment.