En este post te mostraré cómo puedes mostrar tus sitios, aplicaciones o sistemas en Laravel en distintos idiomas usando lo que ya ofrece el propio Framework. Es decir, mostrar tu aplicación web de Laravel en inglés y español, por ejemplo.
Te voy a mostrar un ejemplo simple.
Laravel propone una estructura de directorios muy eficiente. Hay que colocar un directorio cuyo nombre sea la clave del idioma dentro de resources/lang
.
Si por ejemplo quisieras agregar el idioma español, crearías un directorio llamado es
.
Ahora, dentro de cada directorio puedes tener varios archivos que a su vez deben tener un arreglo dentro, con las traducciones. En el ejemplo se apreciará de mejor manera.
Vamos a suponer que el idioma por defecto será inglés. Dentro de resources/lang/en
he creado un archivo llamado messages.php
cuyo contenido es:
<?php
return [
"add_category" => "Add category",
"categories" => "Categories",
"name" => "Name",
"description" => "Description",
"category_created" => "Category created",
"save" => "Save",
"go_back" => "Go back",
"edit" => "Edit",
"delete" => "Delete",
"edit_category" => "Edit category",
"confirm_action" => "Please confirm",
"category_updated" => "Category updated",
"category_deleted" => "Category deleted",
"products" => "Products",
"add_product" => "Add product",
"price" => "Price",
"stock" => "Stock",
"category" => "Category",
"product_created" => "Product created",
];
Cuando el idioma sea inglés, estos mensajes serán mostrados. Fíjate en que es un arreglo en donde se coloca la clave (cómo invocamos al mensaje) y el valor, que será el mensaje mostrado al usuario.
Ahora, dentro del directorio resources/lang/es
, agregué el mismo archivo pero traducido. Queda así:
<?php
return [
"add_category" => "Agregar categoría",
"categories" => "Categorías",
"name" => "Nombre",
"description" => "Descripción",
"category_created" => "Categoría creada",
"save" => "Guardar",
"go_back" => "Volver",
"edit" => "Editar",
"delete" => "Eliminar",
"edit_category" => "Editar categoría",
"confirm_action" => "Por favor, confirme",
"category_updated" => "Categoría actualizada",
"category_deleted" => "Categoría eliminada",
];
Fíjate en que las claves del arreglo siguen siendo las mismas, solo cambia el valor que ya es la traducción al español.
Dentro de nuestras vistas o plantillas podemos mostrar el mensaje que automáticamente será traducido dependiendo del idioma seleccionado. Para ello recomiendo usar la función __
(sí, dos guiones bajos) que recibe la clave del mensaje que se quiere mostrar.
Nota: en este caso, mi archivo de traducciones se llama messages.php
(por eso accedo a messages
) y después al nombre de la clave.
<h1>{{__("messages.categories")}}</h1>
Si, por ejemplo, mi archivo se llamara titulos.php
entonces accedería con __("titulos.categories")
Esto también funciona dentro de los controladores. Por ejemplo:
<?php
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/public function store(Request $request)
{
(new Product($request->input()))->saveOrFail();
return redirect()->route("products.index")->with("message", __("messages.product_created"));
}
En este caso voy a redireccionar con un mensaje de las traducciones. No confundir la clave “message” del método with
que tiene que ver con establecer un mensaje dentro de la sesión para mostrarlo después.
Básicamente __
devuelve un string traducido que puedes o enviar o mostrar en blade.
Para cambiar el idioma de la app de Laravel podemos hacer varias cosas. La primera de ella es ir a config/app.php
, buscar la línea que indica locale
y cambiarla al idioma preferido.
<?php
/*
|--------------------------------------------------------------------------
| Application Locale Configuration
|--------------------------------------------------------------------------
|
| The application locale determines the default locale that will be used
| by the translation service provider. You are free to set this value
| to any of the locales which will be supported by the application.
|
*/
'locale' => 'en'
Otra opción es cambiar el idioma de la aplicación en Laravel en tiempo de ejecución. Para ello podemos invocar a App::setLocale()
pasándole la clave del idioma. Por ejemplo, dentro de web.php
(en las rutas) podríamos hacer lo siguiente:
<?php
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/// Cambiar idioma. En este caso "en":
App::setLocale("en");
// Y luego, todas nuestras rutas...
Route::get("/", function () {
return redirect()->route("categories.index");
});
Route::resource("categories", "CategoriesController");
Route::resource("products", "ProductController");
Esto del cambio ya queda a tu criterio. Puedes hacerlo con una acción del usuario, detectarlo automáticamente, tomarlo de la base de datos, etcétera.
Lo que te he mostrado es apenas una sencilla introducción, si quieres profundizar, te recomiendo visitar la documentación de Laravel.
A partir de esto puedes crear tus aplicaciones y mostrar los mensajes traducidos para que, si es necesario agregar otro idioma más tarde, solo agregues las traducciones y no tengas que cambiar toda tu aplicación de Laravel.
En mi blog tengo más contenido sobre Laravel.
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.