I have a route:
Route::get(\'/setlocale/{locale}\', function($locale) {
App::setLocale($locale);
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:
Try this way
Route::get('setlocale/{locale}',function($lang){
\Session::put('locale',$lang);
return redirect()->back();
});
<?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);
}
}
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,
Route::group(['middleware'=>'language'],function ()
{
//your translation routes
});
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
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