这里是工作语言监听器。第二种方法是将语言更改为用户选择的用户偏好。如果您的用户没有设施来定义他们的语言,您可以省略此方法。
<?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"
谢谢@Pazi。我有两个关于你的代码片段的问题:1)在每个请求中设置语言环境是否是一个好想法?我试图避免在会话中存储区域设置。 2)你在哪里设置了你的语言环境?你的方法$ user-> getLanguage()返回什么? – 2013-05-03 14:00:29
在我的项目中没有问题。我也从另一个来源获得了这个片段,但是我不知道这个url了。可以修改它以仅在会话中使用'_locale'。在过去,我介绍了这一点,它没有奏效。'$ user-> getLanguage()'在我的用户实体中是简单的语言字段,'因为我的用户可以独立于浏览器语言环境来决定使用Web应用程序的语言。 – 2013-05-03 17:21:12