Laravel 5.4存储Locale setLocale()的正确方法

Sag*_*aev 3 locale laravel

我需要知道.为用户存储Locale的正确方法是什么.如果每个用户的请求我改变语言

    App::setLocale($newLocale);
Run Code Online (Sandbox Code Playgroud)

它不会改变我的整个项目和其他请求的语言吗?我的意思是当一个用户更改语言时,它将被用作其他用户的默认语言.

提前致谢

Dee*_*ens 11

App::setLocale()例如,如果您在自己中设置AppServiceProvider.php,则会为所有用户更改.

你可以为此创建一个中间件.就像是:

<?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);
    }
}
Run Code Online (Sandbox Code Playgroud)

(您需要getLocale()在User模型上创建一个方法才能使其工作.)

然后在您Kernel.php创建一个中间件组auth:

'auth' => [
    \Illuminate\Auth\Middleware\Authenticate::class,
    \App\Http\Middleware\SetLocale::class,
],
Run Code Online (Sandbox Code Playgroud)

auth$routeMiddleware数组中删除(在你的Kernel.php).

现在,在使用auth中间件的每条路径上,您将为每个用户设置Laravel应用程序的区域设置.


Lyi*_*mmi 5

我用控制器、中间件和会话解决了这个问题。这对我来说效果很好,希望对你有帮助。

通过控制器处理用户请求:

只需将语言设置为用户会话即可。

     /**
     * 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"));
    }
Run Code Online (Sandbox Code Playgroud)

切换区域设置的路线:

Route::post('translations/switchLocale}', ['as' => 'translations.switch', 'uses' => 'Translation\TranslationController@switchLocale']);
Run Code Online (Sandbox Code Playgroud)

处理所需设置的中间件:

在中间件中检查用户会话的语言设置(如果其 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'));
   }
}
Run Code Online (Sandbox Code Playgroud)

最后是切换形式:

{!! 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>
Run Code Online (Sandbox Code Playgroud)