Laravel 5.8 setLocale globally

前端 未结 3 675
失恋的感觉
失恋的感觉 2021-01-03 09:31

I have a route:

    Route::get(\'/setlocale/{locale}\', function($locale) {
            App::setLocale($locale);

            


        
相关标签:
3条回答
  • 2021-01-03 10:13

    It'll only be set for that current request. You're calling the back() method, which will start a new request/response, and will reset the locale.

    You should persist the value to the users session, or cookie, then use a service provider, or middleware to set the locale from the session/cookie.

    Route::get('/setlocale/{locale}', function (\Illuminate\Http\Request $request, $locale) {
        $request->session()->put('locale', $locale);
        // or
        session(['locale' => $locale]);
    
        return back();
    });
    
    
    // Middleware:
    
    public function handle($request, $next) {
        App::setLocale($request->session->get('locale', 'some default locale');
    
        // or
    
        App::setLocale(session('locale'));
    
        return $next($request);
    }
    

    Hope that helps.

    Helpful links:

    • https://laravel.com/docs/5.8/session#storing-data
    • https://laravel.com/docs/5.8/middleware
    0 讨论(0)
  • 2021-01-03 10:15

    Try this way

    1. firstly when user choose a language we put our selected locale(language) in session [example en, fr, hi ]

    
    Route::get('setlocale/{locale}',function($lang){
           \Session::put('locale',$lang);
           return redirect()->back();   
    });
    

    2. Second We use a middleware for translating pages according to our session locale (user selected)

    <?php
    
    namespace App\Http\Middleware;
    
    use Closure;
    use Session;
    use App;
    use Config;
    class LanguageSwitcher
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            if (!Session::has('locale'))
             {
               Session::put('locale',Config::get('app.locale'));
            }
            App::setLocale(session('locale'));
            return $next($request);
        }
    }
    

    3. Third we put this middleware in kernel.php routeMiddleware (app/Http/kernel.php)

    protected $routeMiddleware = [
            'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
            'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
            'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
            'can' => \Illuminate\Auth\Middleware\Authorize::class,
            'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
            'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
            'language' => \App\Http\Middleware\LanguageSwitcher::class,        
        ];
    
    'language' => \App\Http\Middleware\LanguageSwitcher::class,
    

    4. Fourth, serving this middleware we need route group. so each request goes through this middleware

    Route::group(['middleware'=>'language'],function ()
    {
        //your translation routes
    });
    

    Logic in middleware

    In middleware for every request we check if locale set in current session or not. if Session not having locale then for current request we set locale to config locale means in your app configuration locale

    'locale' => 'en',  // config/app.php
     Session::put('locale',Config::get('app.locale')); // in middleware code we use Config method to get app configuration locale
    App::setLocale(session('locale')); // finally set this to App locale
    

    else if we have locale in current session then we set that to App locale

    App::setLocale(session('locale')); // set this to App locale
    
    0 讨论(0)
  • 2021-01-03 10:20

    I was facing the same problem, the locale was changing in session but not in config. So have checked the session's locale in every blade and controller and set the default the language instant from there, here is the code on my blade file

    @php
    
    if(\Session::get('locale') == 'en') 
        \App::setLocale('en');
    else                                
        \App::setLocale('bn');
    
    @endphp
    

    Hope it will help you

    0 讨论(0)
提交回复
热议问题