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.
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::get('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::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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With