gpt4 book ai didi

Symfony2 语言环境检测 : not considering _locale in session

转载 作者:行者123 更新时间:2023-12-04 13:07:17 26 4
gpt4 key购买 nike

我正在尝试实现一个 LocaleListener 来检测用户的首选语言(考虑 Accept-Language header )并将其存储在 session 中以避免每次请求都检查它。我开发了下面的代码来完成这个:

public function onKernelRequest(GetResponseEvent $event) {
$request = $event->getRequest();

if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
return;
}

$preferredLocale = $request->getPreferredLanguage($this->availableLocales);

if ($this->container->has('session')) {
$session = $this->container->get('session');
if (!$session->has('_locale')) {
$session->set('_locale', $preferredLocale);
}
} else {
$request->setLocale($preferredLocale);
}
}

代码正在运行,首选语言存储在 session 中,但 symfony 不考虑存储在 session 中的语言环境来翻译字符串。就我而言,我的首选语言是“pt_BR”,当我转义时:
{{ app.request.locale }}

symfony 正在逃避“en”。 symfony 不应该考虑存储在 session('_locale') 中的值来定义请求语言环境吗?这是正确的行为吗?我怎样才能做到这一点?

最佳答案

这是一个工作语言监听器。第二种方法是将语言更改为用户选择的用户首选项。如果您的用户没有能力定义他们的语言,您可以省略此方法。

<?php

namespace Acme\UserBundle\EventListener;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;

class LanguageListener
{
private $session;

public function setSession(Session $session)
{
$this->session = $session;
}

/**
* kernel.request event. If a guest user doesn't have an opened session, locale is equal to
* "undefined" as configured by default in parameters.ini. If so, set as a locale the user's
* preferred language.
*
* @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
*/
public function setLocaleForUnauthenticatedUser(GetResponseEvent $event)
{
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
return;
}
$request = $event->getRequest();
if ('undefined' == $request->getLocale()) {
if ($locale = $request->getSession()->get('_locale')) {
$request->setLocale($locale);
} else {
$request->setLocale($request->getPreferredLanguage());
}
}
}

/**
* security.interactive_login event. If a user chose a language in preferences, it would be set,
* if not, a locale that was set by setLocaleForUnauthenticatedUser remains.
*
* @param \Symfony\Component\Security\Http\Event\InteractiveLoginEvent $event
*/
public function setLocaleForAuthenticatedUser(InteractiveLoginEvent $event)
{
$user = $event->getAuthenticationToken()->getUser();

if ($lang = $user->getLanguage()) {
$this->session->set('_locale', $lang);
}
}
}

在您的 services.yml 中:
services:
acme.language.interactive_login_listener:
class: Acme\UserBundle\EventListener\LanguageListener
calls:
- [ setSession, [@session] ]
tags:
- { name: kernel.event_listener, event: security.interactive_login, method: setLocaleForAuthenticatedUser }

acme.language.kernel_request_listener:
class: Acme\UserBundle\EventListener\LanguageListener
tags:
- { name: kernel.event_listener, event: kernel.request, method: setLocaleForUnauthenticatedUser }

哦,你必须在 config.yml 中定义一个未定义的 fallback_language 才能让它工作。
framework:
translator: { fallback: "undefined" }
default_locale: "en"

关于Symfony2 语言环境检测 : not considering _locale in session,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16350846/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com