I've my home route
Route::get('/', 'HomeController@index')->name('home');
And a specific route to change language
Route::get('/setLocale/{locale}', 'HomeController@setLocale')->name('setLocale');
In HomeController->setLocale($locale)
I check if $locale
is a valid locale, then simply do
\App::setLocale($locale);
Then redirect to home.
Here, in HomeController->index()
I verify locale using
$locale = \App::getLocale();
The problem is that after user CHANGES the locale, the app set the new locale, redirect, but the locale detected is still the DEFAULT locale, not the new one setup by the user.
How / where / when can I make persistent the change to app locale?
I thinked Laravel was setting a locale cookies or something when using setLocale
and re-reading it when using getLocale
but now I think it's not this the way Laravel works.
I ask, again: how can I set app locale so that is preserved after page change?
I did that by using a middleware. Here's my code:
LanguageMiddleware:
public function handle($request, Closure $next)
{
if(session()->has('locale'))
app()->setLocale(session('locale'));
app()->setLocale(config('app.locale'));
return $next($request);
}
remember to register your middleware :)
The users are able to change the language, with a simple GET-Route:
Route::get('/lang/{key}', function ($key) {
session()->put('locale', $key);
return redirect()->back();
});
Hopefully that helps you :)
setlocale
only works for the current request. If you want the value to be remembered, you will have to set a cookie manualy.
I recommend using a middleware to do this.