Search code examples
laravelcontrollermiddleware

Laravael - Language switcher not working


I am trying to dynamically display the texts in two languages - English or German. But I am failing the task because nothing happens.

I have done the following:

Middleware:

 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);
 }

 }

Controller:

use App\Http\Requests;
use App\Http\Controllers\Controller;
use Session;
use App;
use Illuminate\Http\Request;
class LanguageController extends Controller {

protected $langs = ['en', 'de'];

public function changeLanguage($lang) {
    if (in_array($lang, $this->langs)) {
        App::setLocale($lang);
        Session::put('locale', $lang);
    }
    return redirect()->back();
}
}

Kernel:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    \App\Http\Middleware\TrustProxies::class,
    \App\Http\Middleware\LanguageMiddleware::class,
];

View:

  <div class="dropdown">
        <button class="dropbtn">{{trans('translations.lang')}}</button>
        <div class="dropdown-content">
        @if(Session::get('locale')=='en')
            <a href="lang/de">Deutsch</a>
        @else
             <a href="lang/en">English</a>
        @endif
        </div>
</div>

Route:

Route::get('lang/{id}', 'LanguageController@changeLanguage');

Using Laravel 5.4

Thanks in advance :)


Solution

  • you can define and middleware like this :

    namespace App\Http\Middleware;
    
    use Closure;
    
    /**
     * Class LocaleMiddleware.
     */
    class LocaleMiddleware
    {
        /**
         * Handle an incoming request.
         *
         * @param \Illuminate\Http\Request $request
         * @param \Closure                 $next
         *
         * @return mixed
         */
    protected $languages = ['en','de'];
    
    public function handle($request, Closure $next)
    {
        if(!session()->has('locale'))
        {
            session()->put('locale', $request->getPreferredLanguage($this->languages));
        }
    
        app()->setLocale(session('locale'));
    
        return $next($request);
        }
    }
    

    on your controller create method for change

    public function changeLanguage($languague)
    {
        if(Session::has(locale)){
            session()->set('locale', $language);}
        else{
            session()->set('locale', 'en');
        }
    
        return redirect()->back();
        }
    

    Route look like

    Route::get('lang/{languague}', 'LanguageController@changeLanguage');