En este artículo vamos a tratar el multilenguaje en Laravel, es decir, vamos a aprender a darle la opción a nuestro usuario de leer nuestra página en el idioma que ellos elijan.

Configuración del multilenguaje en Laravel

Vamos a crear en nuestra aplicación un mensaje, que será el que utilizaremos de ejemplo en este artículo para enseñaros el funcionamiento del multilenguaje en Laravel.

Creación de traducciones

Crearemos una carpeta llamado lang, y dentro de esta añadiremos los diferentes lenguajes que queremos que soporte nuestra aplicación, en este caso, utilizaremos el español (es), inglés (en) y el frances (fr) en formato .json.

Los archivos serán muy parecidos, ya que la clave será igual, lo único que tenemos que cambiar es su valor, dependiendo del archivo del lenguaje en el que estemos:

lang/es.json

{
    "welcome": "Bienvenido a Nigmacode.com",
    "otherMessage": "Otro mensaje"
}

lang/en.json

{
    "welcome": "Welcome to Nigmacode.com",
    "otherMessage": "Another message"
}

lang/fr.json

{
    "welcome": "Bienvenue sur Nigmacode.com",
    "otherMessage": "Un autre message"
}

## Creación del controlador multilenguaje

```bash
php artisan make:controller LanguageController 

Y lo editaremos con este código:

<?php

namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;
class LanguageController extends Controller
{
    public function change(Request $request)
    {
        $lang = $request->input('lang');
        if (!in_array($lang, ['en', 'it', 'fr'])) {
            abort(400);
        }
        Session::put('locale', $lang);

        return redirect()->back();
    }
}

Creamos la ruta para cambiar el lenguaje

Route::get('/lang',[LanguageController::class , 'change'])->name('user.lang');

Creación y registro del middleware:

  public function handle(Request $request, Closure $next): Response
{
    if ($request->session()->has('locale')) {
        App::setLocale($request->session()->get('locale', 'en'));
    }
    return $next($request);
}

Y lo registramos en bootstrap/app.php:

<?php

use App\Http\Middleware\SetLocale;
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__ . '/../routes/web.php',
        commands: __DIR__ . '/../routes/console.php',
        health: '/up'
    )
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->web(append: [
            SetLocale::class,
        ]);
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

Añadiendo multilenguaje a la vista de laravel

En esta vista crearemos un select, para elegir el idioma que queremos mostrar y añadiremos el mensaje welcome:

<!doctype html>
<html lang="es">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Elegant Laravel | Website</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body class="d-flex h-100 text-center">
    <div class="cover-container d-flex w-100 h-100 p-3 mx-auto flex-column">
        <header class="mb-auto container">
            <div>
                <h3 class="float-md-start mb-0"><img src="" alt="" srcset=""></h3>
                <nav class="nav nav-masthead justify-content-center float-md-end">
                    <form id="langform" action="{{ route('user.lang') }}" method="get" class="d-flex align-items-center">
                        <select class="form-select" name="lang" id="lang" onchange="this.form.submit()">
                            <option disabled>Language</option>
                            <option value="es" @if (Session::get('locale', 'es') == 'es') selected @endif> Español</option>
                            <option value="fr" @if (session('locale') == 'fr') selected @endif> Frances</option>
                            <option value="it" @if (session('locale') == 'it') selected @endif> Italiano</option>
                        </select>
                    </form>
                </nav>
            </div>
        </header>
        <main class="px-3">
            <h1>{{ __('welcome') }}</h1>
        </main>
    </div>
</body>
</html>

De esta forma, nuestra vista mostraría el mensaje según el idioma que seleccionemos y además nos dará opción a cambiar al otro idioma: