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.
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.
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],
],
];
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');
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,
],
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: