symfony 如何读取 php-translation 的语言环境

How symfony read locale for php-translation

我想在我的 Symfony 4 项目中使用 php-translation/symfony-bundle

我已经关注了configuration step

translation:
    locales: ["fr", "en", "de", "nl"]
    configs:
        applicationName:
            dirs: ['%kernel.project_dir%/templates', '%kernel.project_dir%/src']
            output_dir: '%kernel.project_dir%/translations'
            excluded_names: ['*TestCase.php', '*Test.php']
            excluded_dirs: [cache, data, logs]
            remote_storage: ['php_translation.adapter.loco']

但是我遇到了一个问题。当我想翻译成语言时,如果我不指定语言环境,它就不起作用。

 $trans = $translator->trans('portal.no_access', [], 'portal', $request->getLocale());
 $transWithoutLocale = $translator->trans('portal.no_access', [], 'portal');

var_dump($trans); ==> return 'string translated'
var_dump($transWithoutLocale); ==> return 'string in default locale format' ( fr )
var_dump($request->getLocale()); ==> return 'de'

如何强制 translator 使用像 symfony recommend it

这样的请求语言环境

因为翻译器没有像@yivi 所说的那样读取请求语言环境,而且我不想将请求语言环境提供给我对 trans 的所有调用。我添加了一个 Listener 来监听所有 KernelEvents::REQUEST 并将 locale 设置为 Translator:

class LocaleListener implements EventSubscriberInterface
{
    /** @var TranslatorInterface */
    private $translator;

    /**
     * LocaleListener constructor.
     */
    public function __construct(TranslatorInterface $translator)
    {
        $this->translator = $translator;
    }

    /**
     * {@inheritdoc}
     */
    public static function getSubscribedEvents(): array
    {
        return [
            KernelEvents::REQUEST => ['onKernelRequest', 10],
        ];
    }

    public function onKernelRequest(RequestEvent $event): void
    {
        $request = $event->getRequest();

        if (\method_exists($this->translator, 'setLocale')) {
            $this->translator->setLocale($request->getLocale());
        }
    }
}