2017-08-01 16 views
1

私は知る必要があります。 Localeをユーザーに格納する適切な方法は何ですか。各ユーザーの要求に応じて言語を変更する場合は、Laravel 5.4ロケールを保存する正しい方法setLocale()

私のプロジェクト全体やその他のリクエストの言語は変更されませんか?つまり、あるユーザーが言語を変更すると、他のユーザーのデフォルトとして使用されます。誰かがあなたのウェブサイトをロードすると、事前

答えて

1

おかげで、それは、configファイルで設定されたデフォルトを使用しています。

アプリケーションのデフォルト言語は、config/app.php設定ファイルに保存されています。

App::setLocale()メソッドを使用すると、セッションで設定されている特定のユーザーだけが変更されますが、設定ファイルの値は変更されません。

また、あなたは彼らが使用してしまうように2つの異なるブラウザ(にあなたのウェブサイトを開くことによって、アクションの中で自分自身をこれを見ることができるアプリケーションファサード

にあるsetLocaleメソッドを使用して、実行時にアクティブな言語を変更することがあり2つの異なるセッション)、一方でロケールを変更し、他方のロケールでデフォルトの負荷を確認します。

1

あなたAppServiceProvider.phpに例えばにApp::setLocale()を設定した場合、それはすべてのユーザーのために変化するであろう。

このためにミドルウェアを作成することができます。ような何か:

<?php 

namespace App\Http\Middleware; 

use Closure; 

class SetLocale 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     app()->setLocale($request->user()->getLocale()); 

     return $next($request); 
    } 
} 

(。あなたは、これが機能するためにはUserモデルにgetLocale()メソッドを作成する必要があります)

そして、あなたのKernel.phpauthのためのミドルウェア・グループを作成します。

'auth' => [ 
    \Illuminate\Auth\Middleware\Authenticate::class, 
    \App\Http\Middleware\SetLocale::class, 
], 

$routeMiddleware配列(Kernel.php)からauthを削除します。

authミドルウェアを使用するすべてのルートで、各ユーザーに対してLaravelアプリケーションのロケールを設定します。

1

コントローラ、ミドルウェア、およびセッションでこの問題を解決しました。 これは私にとってはうまくいきました。

は、コントローラを介してユーザの要求を処理します:

は、単にユーザーのセッションに言語を設定します。

 /** 
    * Locale switcher 
    * 
    * @param Request $request 
    * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector 
    */ 
    public function switchLocale(Request $request) 
    { 
     if (!empty($request->userLocale)) { 
      Session::put('locale', $request->userLocale); 
     } 
     return redirect($request->header("referer")); 
    } 

ルートロケールを切り替えるには:

Route::post('translations/switchLocale}', ['as' => 'translations.switch', 'uses' => 'Translation\[email protected]']); 

必要な設定を処理するためのミドルウェア:ミドルウェアで

そのperesetセットならば、言語設定のためのユーザーのセッションをチェックそれ。

/** 
* @param $request 
* @param Closure $next 
* @param null $guard 
* @return mixed 
*/ 
public function handle(Request $request, Closure $next, $guard = null) 
{ 
    if (Session::has('locale')) { 
     App::setLocale(Session::get('locale')); 
    } 
} 

最後にスイッチング形:

{!! Form::open(["route" => "translations.switch", "id" => "sideBarLocaleSelectorForm"]) !!} 
{!! Form::select("userLocale", $languages, Session::get("locale")) !!} 
{!! Form::close() !!} 

<script> 
    $(document).on("change", "select", function (e) { 
     e.preventDefault(); 
     $(this).closest("form").submit(); 
    }) 
</script> 
関連する問題