2017-12-08 4 views
1

나는 슬림하고 Laravel의 조명/번역을 사용하고 있습니다. 이 모든 것을 처음 접했을 때 페이지를 번역 할 수있는 해결책을 찾았지만 다른 변환기 인스턴스 (페이지 변환을 변경)를 실행 중에 컨테이너에 전달하려고 할 때 문제가 있습니다. 번역을 변경할 시간. 내가 내비게이션과 같은 나뭇 가지에 줄이 있습니다 :슬림 프레임 워크에서 번역기 인스턴스를 바꾸는 방법은 무엇입니까?

<li><a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">lang<span class="caret"></span> </a> 
        <ul class="dropdown-menu"> 
         <li><a href="{{path_for('en')}}" >english</a> </li> 
         <li><a href="{{path_for('fr')}}">french</a> </li> 
        </ul> 
        </li> 

내가 컨테이너에 번역자의 새로운 인스턴스를 설정 언어 컨트롤러 :

public function getFrench($request, $response){ 
    $loader = new FileLoader(new Filesystem(), __DIR__ . '/../resources/lang'); 
    // Register the french translator (set to "en" for English) 
    $translator = new Translator($loader, "fr"); 

    $this->translator=$translator; 

    } 

을 는 여기에 내가 뭘하는지입니다 이것은 내 컨테이너를 설정하는 방법입니다 :

$container['translator']= function($container){ 

    $loader = new FileLoader(new Filesystem(), __DIR__ . '/../resources/lang'); 
    // Register the french translator (set to "en" for English) 
    $translator = new Translator($loader, "en"); 

    return $translator; 
}; 

** 뷰 ** 나는 translationExtension을 추가 해요 여기서

$container['view']= function($container){ 
    $view= new \Slim\Views\Twig(__DIR__ .'/../resources/views',['cache'=> false,]); 

    // add translator functions to Twig 
    $view->addExtension(new TranslatorExtension($container->get('translator'))); 

    return $view; 

}; 

내가 잘못 했어도 런타임에 변환을 변경할 수 없기 때문에이 방법이 잘못 될지 모르겠다. 컨테이너 (이 경우에는 영어) 컨트롤러 방식 대신 전역 변수를 사용해야합니까? 어떻게 내가 이것에 대해 가겠습니까?

+0

당신은 미들웨어를 구현해야합니다 :

첫째로 당신은 형성

$container['view']= function($container){ $view= new \Slim\Views\Twig(__DIR__ .'/../resources/views',['cache'=> false,]); return $view; }; 

그리고이 분석 된 언어, 미들웨어를 통해 확장자를 추가 헤더를 확장-추가 컨테이너에서 제거해야합니다 그에 대한. 이 미들웨어에서는 언어를 헤더 수용 언어 또는 라우트 또는 세션별로 감지하고 언어를 번역기 객체로 설정합니다. – DanielO

+0

그런데 어떻게합니까? 미들웨어의 메커니즘을 이해하지만,보기 (내 경우에는 나뭇 가지)의 출력을 다른 변환기로 어떻게 관련 지을 수 있습니까? 컨테이너에 대한 변환기 인스턴스와 함께 TranslatorExtension을 뷰에 추가해야한다는 점을 고려해야합니다. –

+0

번역기 스위치를 트리거해야하는 것은 무엇입니까? 내 말은, 런타임에서 어떤 시점에서 변경하고 싶습니까? –

답변

1

use the Accept-Language-header to detect which language a user want to see 수 있습니다. 이것은 미들웨어 내부에서 할 수 있습니다.

$container = $app->getContainer(); 
$app->add(function (\Slim\Http\Request $request, $response, $next) use ($container) { 
    $lang = $request->getHeader('Accept-Language'); 

    // $lang could be something like 'de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7' 
    // see above link for more information about parsing it 
    $parsedLang = parseLang($lang); 

    $loader = new FileLoader(new Filesystem(), __DIR__ . '/../resources/lang'); 

    $translator = new Translator($loader, $parsedLang); 

    // add the extension to twig 
    $view = $container->get('view'); 
    $view->addExtension(new TranslatorExtension($translator)); 

    // execute the other middleware and the actual route 
    return $next($request, $response); 
}); 
+0

실제로 브라우저에서 기본 언어를 선택하는 것은 고려하지 않았습니다. 실제로 기본 언어를 선택하는 것보다 낫습니다. 귀하의 대답은 정말 도움이되었다 +1 –

관련 문제