Tema 21: Localización (Locale) en Laravel 12
21.1 Introducción a la localización e internacionalización
Cuando desarrollamos aplicaciones web para usuarios que hablan diferentes idiomas, es fundamental adaptar los textos, formatos y contenidos para cada uno. Este proceso se llama localización (o locale), mientras que la capacidad de preparar la aplicación para varios idiomas y regiones se denomina internacionalización (i18n).
Beneficios:
- Aumenta el alcance de la aplicación.
- Mejora la experiencia del usuario.
- Facilita la adaptación a diferentes mercados.
Conceptos clave:
- Locale: configuración que indica el idioma y región usados (ejemplo:
en,es,val). - Traducciones: textos en diferentes idiomas almacenados en archivos específicos.
- Archivos de idioma: archivos PHP que contienen los textos traducidos organizados en claves.
21.2 Estructura y ubicación de archivos de idioma en Laravel 12
En Laravel 12, la carpeta que contiene los archivos de idiomas es lang/ y está directamente en la raíz del proyecto, no dentro de resources/ como en versiones anteriores.
¿Está creada la carpeta lang por defecto?
Al crear un proyecto Laravel 12 nuevo, esta carpeta puede no estar creada inicialmente porque Laravel no incluye los archivos de idioma directamente en el proyecto para reducir peso y facilitar personalización.
Crear manualmente la carpeta y los archivos
Para crear la estructura básica:
- En la raíz del proyecto crea una carpeta llamada
lang. - Dentro crea subcarpetas para cada idioma que quieras soportar, por ejemplo:
- En cada carpeta, crea archivos PHP con las traducciones, por ejemplo
messages.php. Pero es recomendable instalarlos desde el paquete de Laravel o el paquete laravel-lang/lang. Sigue el siguiente apartado.
Uso de paquete para idiomas predefinidos
También puedes instalar un paquete muy popular que contiene traducciones para muchos idiomas:
Y luego publicar los archivos con:
Esto crea la carpeta lang con las traducciones disponibles en inglés (en) automáticamente.
En la carpeta lang/en encontrarás archivos como:
- 'auth.php': Mensajes de autenticación.
- 'pagination.php': Mensajes de paginación.
- 'validation.php': Mensajes de validación.
- 'passwords.php': Mensajes de recuperación de contraseña.
Puedes echar un vistazo a estos archivos para ver cómo están estructurados y qué claves de traducción contienen. Por ejemplo en el fichero password.php puedes encontrar claves como:
| Clave | Mensaje |
|---|---|
reset |
"Your password has been reset!" |
sent |
"We have emailed your password reset link!" |
throttled |
"Please wait before retrying." |
user |
"We can't find a user with that email address." |
token |
"This password reset token is invalid." |
21.3 Configuración inicial del idioma por defecto
Para indicarle a Laravel qué idioma cargar por defecto y cuál usar como respaldo:
Abre el archivo config/app.php y modifica estas líneas:
config/app.php (fragmento)
Cuando Laravel no encuentra una traducción en el idioma activo, busca en el idioma fallback.
21.4 Uso de traducciones en Laravel
Laravel ofrece varias formas de acceder a las traducciones.
Funciones y helpers más usados
__('clave'): función global para obtener la traducción de una clave.trans('clave'): similar a__(), pero puede aceptar más opciones.- En vistas Blade se usa
@lang('clave').
Si por ejemplo tenemos el siguiente archivo de idioma messages.php:
lang/en/messages.php
Podemos acceder a las traducciones de la siguiente manera:
Ejemplo uso en PHP
O en una vista Blade:
Ejemplo uso en Blade
21.5 Creación de archivos de idioma personalizados
Para organizar mejor las traducciones, puedes crear tus propios archivos.
Pasos:
-
Dentro de la carpeta del idioma (ej.
lang/en/) crea un archivo PHP con nombre descriptivo, por ejemplo,landing.php. -
Define claves y textos dentro:
lang/en/landing.php
lang/en/contact.php
- Ahora creamos las vistas que van a utilizar estas traducciones.
Ejemplo resources/views/landing/index.blade.php:
Uso en Blade
Ejemplo resources/views/landing/contact.blade.php:
Uso en Blade
Y añadimos las rutas en routes/web.php:
web.php
Si comprobamos el funcionamiento de la aplicación, veremos que los textos se muestran correctamente en inglés. Ya que son los textos que hemos definido en el archivo lang/en/landing.php y lang/en/contact.php. Cualquier cambio en los textos de estos archivos se reflejará automáticamente en la aplicación.
Pero claro, seguimos teniento un sitio monolingüe. En el próximo apartado vamos a ver cómo añadir más idiomas y poder gestionar el idioma de la aplicación.
21.6 Gestión dinámica del idioma
Lo primero que necesitaremos es definir una ruta que nos permita cambiar el idioma de la aplicación. Esta ruta se encargará de recibir el idioma seleccionado por el usuario y guardarlo en la sesión o en una cookie.
Permitir al usuario seleccionar idioma
Para cambiar el idioma de forma dinámica:
- Crea una ruta o acción que reciba el idioma seleccionado. Por ejemplo, una ruta
lang/{locale}.- En esta ruta, verifica si el idioma es válido (por ejemplo,
en,es,val).
- En esta ruta, verifica si el idioma es válido (por ejemplo,
- Guarda esta selección en la sesión o en una cookie.
Como podemos ver esta ruta se encarga de recibir el idioma seleccionado y guardarlo en la sesión. Luego redirige al usuario a la página anterior. Lo guarda en la sesión para que la selección persista entre diferentes peticiones.
Middleware para aplicar el idioma
Ahora crearemos middleware que se encargue de gestionar el idioma de la aplicación. Este middleware se ejecutará en cada petición y establecerá el idioma según la sesión o cookie. De esta manera nos liberamos de tener que establecer el idioma en cada controlador o vista.
Crea un middleware que se ejecute en cada petición y establezca el idioma según la sesión o cookie.
Ejemplo básico:
Middleware SetLocale.php
Y registramos el middleware en app/bootstrap/app.php:
app/Http/Kernel.php
Middleware StartSession
Asegúrate de que el middleware
StartSessionse ejecute antes que el middlewarelocale. Esto es importante porque el middlewareStartSessiondebe establecer la sesión antes de que el middlewarelocaleintente acceder a ella.
Creación de layout para las vistas
Ahora vamos a crear nuestro layout para añadir un menú que sea visible en todas las páginas. Este menú contendrá el selector de idioma y los enlaces a las diferentes páginas.
Ejemplo resources/views/_layouts/app.blade.php:
app.blade.php
Modificación de las vistas para que utilicen el layout
Modificamos las vistas landing/index.blade.php y landing/contact.blade.php para que utilicen el layout que acabamos de crear.
landing/index.blade.php
Ejemplo resources/views/landing/contact.blade.php:
landing/contact.blade.php
Comprueba que funciona, que los textos se muestran correctamente y que el selector de idioma cambia el idioma de la página. Podrás observar que al cambiar el idioma, la página se recarga pero los texto se mantienen en ingñlés en. Esto es porque no hemos añadido los ficheros de idioma en español y valenciano. Al no encontrar los textos en el idioma seleccionado, Laravel recurre al idioma por defecto que es el inglés (fallback_locale).
5. Verificar que al cambiar de página se mantiene el idioma
- Gracias al middleware que establece el idioma desde la sesión, el idioma no se pierde al cambiar entre
/y/contact. - Los textos de ambas páginas se mostrarán en el idioma seleccionado.
6. Añadir los ficheros de idioma en español y valenciano
- Crea las carpetas
esyvaldentro delang/. - Copia los archivos
landing.phpycontact.phpdeen/aes/yval/. - Traduce los textos al español y valenciano.
- Verifica que al cambiar el idioma, los textos se muestran correctamente.
21.9 Buenas prácticas y consideraciones
- Mantener organizada la carpeta
lang. - Documentar y usar claves claras y consistentes.
- Para textos largos o dinámicos, usar JSON o bases de datos si es necesario.
- Considerar paquetes externos para facilitar traducciones.
- Probar siempre todos los idiomas y páginas.
21.10 Ejercicios propuestos
Ejercicio 1: Crear archivo de idioma personalizado
- Crea una vista
landing.servicesy añade servicios comoventa d entradas,venta de merchandising,venta de entradas VIP. - Crea el archivo
services.phpenlang/en/. Y carga todos los textos que necesites en la vista. - Añade el enlace a la vista en el menú de navegación.
- Crea el archivo
services.phpenlang/es/ylang/val/y traduce los textos. - Verifica que al cambiar el idioma, los textos se muestran correctamente.