Multilenguaje en Laravel

En este articulo vamos a tratar el multilenguaje en laravel, es decir, vamos a aprender a darle la opción a nuestro usuarios de leer nuestra página en el idioma que ellos elijan.

Configuración del multilenguaje en laravel

Mensajes para traducir

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.

Para ello, lo que haremos será dirigirnos a resources/lang aquí, tendremos una carpeta en y vamos a crear otra que llamaremos es. En ambas carpetas crearemos un nuevo archivo llamado messages.php

En messages.php de la carpeta en añadiremos lo siguiente:

<?php

//resources/lang/en/messages.php

return [
    'welcome' => 'Welcome to Nigmacode.com'
];

De la misma forma, en la carpeta es, añadiremos esto en messages.php:

<?php

//resources/lang/es/messages.php

return [
    'welcome' => 'Bienvenido a Nigmacode.com'
];

De esta forma, lo que hemos hecho es crear un mismo mensaje en dos idiomas con la clave ‘welcome’,  que será la clave que utilizaremos más adelante en la vista para mostrar este mensaje.

Creando el archivo locale.php

Ahora, vamos a crear un archivo locale.php en la carpeta config , que utilizaremos para añadir los lenguajes que queremos que tenga nuestra aplicación, en nuestro caso el español y el ingles:

<?php

return [

    /*
     * Si esta a true, mostrará los lenguajes disponibles
     *
     * @var bool
     */
    'status' => true,

    /*
     * Lenguajes disponibles
    */
    'languages' => [


        'en'    => ['en', 'en_US', false],
        'es'    => ['es', 'es_ES', false],
    ],
];

 Controlador y ruta para el cambio de lenguaje

Ahora vamos a crear un nuevo controlador, donde crearemos una funcion que llamarémos swap para que actualice el lenguaje que tendremos guardado en session:

<?php

namespace App\Http\Controllers;

class LanguageController extends Controller

{
    /**
 * @param $lang
 *
 * @return \Illuminate\Http\RedirectResponse
 */
    public function swap($lang)
    {
        // Almacenar el lenguaje en la session
        session()->put('locale', $lang);
        return redirect()->back();
    }
}

Una ruta, que será la encargada de llamar a esta función y le pasará el lenguaje que queremos utilizar:

Route::get('lang/{lang}', 'LanguageController@swap')->name('lang.swap');

Middelware para el cambio de lenguaje

Por último, crearemos LocaleMiddleware, un middelware que será el encargado de cambiar la variable locale que se encuentra en app.php por el valor que tiene almacenado en session el dato locale, todo esto en tiempo de ejecución:

<?php

namespace App\Http\Middleware;

use Closure;
use Carbon\Carbon;

/**
 * Class LocaleMiddleware.
 */
class LocaleMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request
     * @param \Closure                 $next
     *
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        /*
         * If esta a true el valor de la variable status que tenemos en locale.php
         */
        if (config('locale.status')) {
            if (session()->has('locale') &&
                in_array(session()->get('locale'), array_keys(config('locale.languages')))) {

                /*
                 * Establece el locale de Laravel
                 */
                app()->setLocale(session()->get('locale'));

                setlocale(LC_TIME, config('locale.languages')[session()->get('locale')][1]);

                Carbon::setLocale(config('locale.languages')[session()->get('locale')][0]);


                if (config('locale.languages')[session()->get('locale')][2]) {
                    session(['lang-rtl' => true]);
                } else {
                    session()->forget('lang-rtl');
                }
            }
        }

        return $next($request);
    }
}

y los añadimos en el grupo del middelwares del apartado web, en el archivo kernel.php

'web' => [
            ...
            ...
            \App\Http\Middleware\LocaleMiddleware::class,
        ],

Traducción en la vista

Finalmente, vamos a mostrar en la vista que queramos, una lista con los lenguajes disponibles excepto el que esté ya activado:

<!--Comprobamos si el status esta a true y existe más de un lenguaje-->
@if (config('locale.status') && count(config('locale.languages')) > 1)
                <div class="top-right links">
                    @foreach (array_keys(config('locale.languages')) as $lang)
                        @if ($lang != App::getLocale())
                            <a href="{!! route('lang.swap', $lang) !!}">
                                    {!! $lang !!} <small>{!! $lang !!}</small>
                            </a>
                        @endif
                    @endforeach
                </div>
            @endif

Y mediante el helper trans accederemos al mensaje que creamos anteriormente, con la clave welcome:

<!--Con el helper trans, le indicamos que queremos mostrar 
el valor de welcome que se encuentra en messages.php-->
<h4> {!! trans('messages.welcome') !!} </h4>

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: