Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
symfony如何读取php翻译的语言环境_Symfony_Translation - Fatal编程技术网

symfony如何读取php翻译的语言环境

symfony如何读取php翻译的语言环境,symfony,translation,Symfony,Translation,我想在我的symfony4项目中使用 我一直在关注这个问题 但我有个问题。当我想翻译成语言时,如果我不指定语言环境,它就不起作用 $trans = $translator->trans('portal.no_access', [], 'portal', $request->getLocale()); $transWithoutLocale = $translator->trans('portal.no_access', [], 'portal'); var_dump($t

我想在我的symfony4项目中使用

我一直在关注这个问题

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

 $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'

我如何强制
翻译人员
使用请求区域设置,就像一样,因为翻译人员没有像@yivi所说的那样读取请求区域设置,并且我不想将请求区域设置赋予我对
trans
的所有调用。我添加了一个
侦听器
,它侦听所有
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());
        }
    }
}

您没有使用Symfony的翻译包。使用Symfony的翻译包,您将无法指定用户的区域设置。但有了这个第三方软件包,您似乎需要这样做。您要么装饰服务并封装调用,要么在每个
trans()
调用上传递请求区域设置,这似乎很简单。
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());
        }
    }
}