In laravel 11 / livewire 3.5 app I want to localize 3 pages and I created my own middleware app/Http/Middleware/SetLocaleMiddleware.php:
<?php
namespace AppHttpMiddleware;
use Closure;
use IlluminateHttpRequest;
use IlluminateSupportFacadesApp;
use LivewireAttributesOn;
use SymfonyComponentHttpFoundationResponse;
/* Class set locale middleware by 'locale' session var */
class SetLocaleMiddleware
{
/**
* Handle an incoming request.
*
* @param Closure(IlluminateHttpRequest): (SymfonyComponentHttpFoundationResponse) $next
*/
public function handle(Request $request, Closure $next): Response
{
// I see these lines in log - so this middleware works ok
Log::info(varDump(session()->get('locale'), ' -1 OUT SetLocaleMiddleware session()->get(locale)::'));
if (session()->has('locale')) {
Log::info(varDump(session()->get('locale'), ' -1 INSIDE SetLocaleMiddleware session()->get(locale)::'));
App::setLocale(session()->get('locale'));
}
return $next($request);
}
}
I added it to bootstrap/app.php :
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
api: __DIR__.'/../routes/api.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
$middleware->appendToGroup('web', SetLocaleMiddleware::class);
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
I switch locale in livewire component method as :
#[On('localeChanged')]
public function localeChanged(string $locale) {
$this->locale = $locale;
session()->put('locale', $this->locale);
App::setLocale($this->locale);
$this->dispatch('$refresh');
}
But locale is not changed.
Reading manual https://livewire.laravel.com/docs/upgrading#localization I modified routes/web.php:
Route::group(['prefix' => LaravelLocalization::setLocale()], function ()
{
Route::get('/services/partnership-order/{locale?}', PartnershipOrderDialog::class)->name('services.partnership_order.index');
Route::get('/services/pricing/{locale?}', Pricing::class)->name('services.pricing.index');
Route::get('/{locale?}', QuizChooser::Class)->name('home');
});
But I did not catch what is class LaravelLocalization here ? I does not look like SetLocaleMiddleware (it has no setLocale method).
PS. Loooking at some localization examples I see that localizationis made with calling separate controller method and returning back.
As I make SPA app I would prefer to implement localization without separate controller, but do not know can I do it ?