La localizzazione (o internationalization o i18n) di Laravel è già gestita da un apposito middleware. Seguiamo questi pochi passi necessari ad atttivare la funzionalità multilingua per un’applicazione Laravel.
Sommario
Attivazione e configurazione del middleware i18n
$ php artisan make:middleware Localization
Questo comando crea un nuovo file in app/Http/Middleware/Localization.php
che va personalizzato se vogliamo gestire la lingua con le variabili di sessione. L’alternativa sarebbe specificare sempre in ogni rotta la lingua che si vuole usare. Un incubo!
Modifichiamo così il file:
public function handle(Request $request, Closure $next) { if (Session::has('locale')) { App::setLocale(Session::get('locale')); } return $next($request); }
Con il comando setLocale si valorizza la lingua usata in quel momento dall’applicazione con il valore contenuto dalla variabile di sessione.
Configurazione della rotta per lo switch della lingua
Ora occorre un metodo per fare lo switch e lo facciamo in una rotta che scriviamo in routes/web.php
:
Route::get('language/{locale}', function ($locale) { app()->setLocale($locale); session()->put('locale', $locale); return redirect()->back(); });
Possiamo anche scegliere di portare il codice che si trova nella funzione anonima dentro al controller HomeController.
Creazione dei file di localizzazione
Poi creiamo due file di lingua dentro a resources/lang/
e li chiamiamo en.json e it.json. Possiamo fare quanti file vogliamo, attenzione che ad ogni rotta deve corrispondere un file!
Per esempio un estratto del file italiano può essere il seguente:
{ "Dashboard": "Cruscotto", "logout": "Esci", "Companies": "Aziende", "Users": "Utenti", "Name": "Ragione Sociale", "Website": "Sito web", "Email": "Email", "Main Phone #": "Telefono principale", "latitude": "Latitudine", "longitude": "Longitudine", "company_type": "Tipo Azienda", "Commands": "Comandi", "Create new": "Nuovo record" }
Comandi HTML per lo switch
Ora inseriamo i comandi per cambiare lingua nell’header dell’applicazione: lo facciamo in un modo grezzo che può essere migliorato, ma è questione di Blade e Vue:
<div class="collapse navbar-collapse" id="navbarSupportedContent"> <!-- Left Side Of Navbar --> <ul class="navbar-nav me-auto"> <li class="nav-item"> <a class="nav-link" href="dashboard/">{{ __('Dashboard') }}</a> </li> <li class="nav-item"> <a class="nav-link" href="{{ route('companies.index') }}">{{ __('Companies') }}</a> </li> <li class="nav-item"> <a class="nav-link" href="{{ route('users.index') }}">{{ __('Users') }}</a> </li> <li class="nav-item"> <a class="nav-link" href="/language/it">it</a> </li> <li class="nav-item"> <a class="nav-link" href="/language/en">en</a> </li> </ul>
Sostituire tutte le stringhe cablate con i segnaposto
Qui si può vedere anche come vengono utilizzati i segnaposto definiti in resources/lang
: occorre sostituire ad esempio la stringa “Companies” cablata nell’HTML/Blade con il segnaposto {{__('Companies')}}
.
Commenti recenti