는 작업 언어 청취자입니다. 두 번째 방법은 언어를 사용자가 선택한 사용자 기본 설정으로 변경하는 것입니다. 사용자가 언어를 정의 할 수있는 기능이없는 경우이 방법을 생략 할 수 있습니다.
<?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() 메서드는 무엇을 반환합니까? –
내 프로젝트에 아무런 문제가 없습니다. 이 소스 코드를 다른 소스에서 가져 왔지만 더 이상 URL을 모르겠습니다. 세션에서'_locale' 만 사용하도록 수정할 수 있습니다. 과거에 내가 이것을 소개했을 때, 그것은 효과가 없었습니다.'$ user-> getLanguage()'는 사용자 엔티티에서 단순한 언어 필드입니다. 왜냐하면 내 사용자가 브라우저 로켈과 독립적으로 웹 응용 프로그램을 사용할 언어를 결정할 수 있기 때문입니다. –