Search code examples
phplaravellocalization

Laravel 5.8 setLocale globally


I have a route:

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

            return back();
    })->name('setlocale');

When I go to: example.com/setlocale/ro I return back to page. But language is not changed. Why? I get always language en. I check language with:

    app()->getLocale();

But I need set language globally for application.


Solution

  • Try this way

    1. 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. 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::get('locale'));
            return $next($request);
        }
    }
    

    3. 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. For 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::get('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::get('locale')); // set this to App locale
    

    Complete Article and Source Code - www.ultimateakash.com