Вы можете попробовать что-то вроде этого.
Я создал LocaleSubscriber для прослушивания onkernelRequest со значением Accept-language в каждом заголовке запроса и автоматически изменил локаль.
Таким образом, вы можете положиться на |trans
в веточке для перевода на нужный язык
Здесь код:
class LocaleSubscriber implements EventSubscriberInterface
{
private $defaultLocale;
private $supportedLanguages;
public function __construct($defaultLocale = 'fr')
{
$this->defaultLocale = $defaultLocale;
$this->supportedLanguages = ['en', 'fr', 'es'];
}
public function onKernelRequest(GetResponseEvent $event): void
{
if (null !== $acceptLanguage = $event->getRequest()->headers->get('Accept-Language')) {
$locale = Locale::acceptFromHttp($acceptLanguage);
if (\strlen($locale) > 2) {
$locale = substr($locale, 0, 2);
}
if (\in_array($locale, $this->supportedLanguages, false)) {
$event->getRequest()->setLocale($locale);
} else {
$locale = $this->defaultLocale;
$event->getRequest()->setLocale($locale);
}
}
}
public static function getSubscribedEvents(): array
{
return [
// must be registered before (i.e. with a higher priority than) the default Locale listener
KernelEvents::REQUEST => [['onKernelRequest', 20]],
];
}
}