2017-12-08 17 views
1

私はスリムでLaravelのilluminate/Translationを使用しています。私はこのすべてに新しいです、私は私のページを翻訳する解決策を見つけましたが、私は別の翻訳者のインスタンス(ページの翻訳を変更する)を実行中にコンテナに渡そうとしているときに問題があります翻訳を変更する時間。 を私はこのような小枝とナビゲーションバーがあります:スリムフレームワークでトランスレータインスタンスを置き換える方法は?

<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

あなたはミドルウェアを実装する必要がありますそれのために。このミドルウェアでは、言語を(ヘッダー受け入れ言語またはルートまたはセッションによって)検出し、トランスレータオブジェクトに言語を設定します。 – DanielO

+0

どうやってそれをしますか?私はミドルウェアの仕組みを理解していますが、ビューからの出力(私の場合はtwig)を別のトランスレータにどのように関係させますか? TranslatorExtensionをコンテナへのトランスレータインスタンスとともにビューに追加する必要があることを考慮してください。 –

+0

トランスレータスイッチをトリガする必要がありますか?つまり、実行時のどの時点で変更したいのですか? –

答えて

1

use the Accept-Language-header to detect which language a user want to seeです。これはミドルウェアの内部で行うことができます。

まずあなたは、コンテナ

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

から延長-追加を削除してから、ミドルウェアを通じて拡張を追加し、解析された言語でヘッダを形成する必要があります

$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 –

関連する問題