我刚开始使用Api平台,在翻译验证程序的消息时遇到问题。
我有:
...创建了两个带有翻译的文件:/translations/validators.en.yaml和/translations/validators.fr.yaml
...添加了适当的自定义验证器消息
...将default_locale设置为en
...在实体中添加了翻译验证器定义:
/**
* @ORM\Column(type="text", nullable=true)
* @Assert\NotBlank(message="test.message")
*/
private $title;
此后,正确返回了我的自定义翻译消息。
现在,我要依赖于Accept-Language标头而不是default_locale启用翻译。
我知道symfony不会在Accept-Language标头上中继。取而代之的是,我创建了负责确定首选语言的订户(通过“接受语言”):
namespace App\EventSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
class LocaleSubscriber implements EventSubscriberInterface
{
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
$locale = substr($request->getPreferredLanguage(), 0, 2);
$request->setDefaultLocale($locale);
$request->setLocale($locale);
}
public static function getSubscribedEvents()
{
return [
'kernel.request' => 'onKernelRequest',
];
}
}
不幸的是这种方式行不通。即使我直接将'fr'作为参数作为setLocale和setDefaultLocale的参数,翻译仍然在kernel.default_locale
上进行。
有人知道如何解决我的问题吗?
查看此Symfony文档页面:https://symfony.com/doc/current/session/locale_sticky_session.html
我认为您的侦听器应具有更高的优先级(例如20),因此它在本地侦听器之前被加载。