2017-09-03 3 views
2

Symfony 3을 사용합니다. 내 웹 사이트는 프랑스어와 영어의 2 개 언어로되어 있으며 사람들은 선택 양식을 통해 전환 할 수 있습니다. 기본 언어는 프랑스어입니다. 기본 URL은 다음과 같습니다. example.com/fr (프랑스어 버전) example.com/en (영어 버전)Symfony 3, 브라우저 언어 감지

이제 사용자가 웹 사이트를 방문하여 브라우저 언어를 감지하고 자동으로 올바른 언어. 브라우저가 프랑스어 인 경우 Exemple는, 그는 프랑스어 버전으로 재 지정됩니다 : example.com/fr 그렇지 그는 영어 버전으로 재 지정됩니다 : example.com/en

제대로 그렇게 할 수있는 방법이 있나요 ?

는 당신의 도움을 주셔서 감사합니다

+0

'JMSI18nRoutingBundle'을 사용해보십시오. 또한'Accept-Language' 요청 헤더를 수동으로 분석 할 수 있습니다. –

답변

3

당신이 JMSI18nRoutingBundle 같은 다른 번들에 당신은, 예를 들어 심포니의 이벤트 시스템를 숙지해야 의존하지 않으려면 HttpKernel에서 읽을 수 있습니다.

귀하의 경우에는 kernel.request 이벤트에 연결하고 싶습니다.

일반적인 용도 : 요청에 정보를 추가하거나 시스템의 일부를 초기화하거나 가능한 경우 응답 (예 : 액세스를 거부하는 보안 계층)을 반환합니다.

사용자 정의 EventListener에서 해당 이벤트를 수신하여 라우터에서 사용되는 요청 객체에 정보를 추가 할 수 있습니다. 그것은이 같은 것을 볼 수 있었다 :

class LanguageListener implements EventSubscriberInterface 
{ 
    private $supportedLanguages; 

    public function __construct(array $supportedLanguages) 
    { 
     if (empty($supportedLanguages)) { 
      throw new \InvalidArgumentException('At least one supported language must be given.'); 
     } 

     $this->supportedLanguages = $supportedLanguages; 
    } 

    public static function getSubscribedEvents() 
    { 
     return [ 
      KernelEvents::REQUEST => ['redirectToLocalizedHomepage', 100], 
     ]; 
    } 

    public function redirectToLocalizedHomepage(GetResponseEvent $event) 
    { 
     // Do not modify sub-requests 
     if (KernelInterface::MASTER_REQUEST !== $event->getRequestType()) { 
      return; 
     } 
     // Assume all routes except the frontpage use the _locale parameter 
     if ($event->getRequest()->getPathInfo() !== '/') { 
      return; 
     } 

     $language = $this->supportedLanguages[0]; 
     if (null !== $acceptLanguage = $event->getRequest()->headers->get('Accept-Language')) { 
      $negotiator = new LanguageNegotiator(); 
      $best  = $negotiator->getBest(
       $event->getRequest()->headers->get('Accept-Language'), 
       $this->supportedLanguages 
      ); 

      if (null !== $best) { 
       $language = $best->getType(); 
      } 
     } 

     $response = new RedirectResponse('/' . $language); 
     $event->setResponse($response); 
    } 
} 

이 리스너는 요청의 Accept-Language 헤더를 확인하고 최적의 로케일을 결정하기 위해 협상 \의 LanguageNegotiator을 사용합니다. 사용 문을 추가하지 않았으므로주의해야하지만 상당히 명확해야합니다.

고급 버전의 경우 JMSI18nRoutingBundle에서 LocaleChoosingListener의 소스를 읽을 수 있습니다.

이 작업은 일반적으로 프론트 페이지에서만 필요하므로 게시 된 예제와 JMSBundle의 예제는 다른 모든 경로를 제외합니다. https://symfony.com/doc/current/session/locale_sticky_session.html 을 :

https://symfony.com/doc/current/translation/locale.html#the-locale-and-the-url

는 심포니 문서는 어떻게 로케일을 읽고 리스너를 사용하여 세션에서이 끈적 만드는 예제를 포함 문서에 설명 된대로 사람들을 위해 당신은 특별한 매개 변수 _locale을 사용할 수 있습니다 이 예제는 services.yml에 리스너를 등록하는 방법을 보여준다.