Las funciones de internacionalización de Laravel ofrecen un mecanismo cómodo para obtener cadenas de traducción en varios idiomas.
Se usan para dar soporte a múltiples idiomas dentro de la aplicación.Hay dos formas de gestionar las traducciones:
Método
Características
Archivos PHP
Arrays clave-valor como lang/es/messages.php. Adecuado si quieres organizar por funcionalidad (errores de validación, etc.)
JSON
lang/es.json con las cadenas de traducción como claves. Recomendado para aplicaciones con muchas traducciones
Por defecto una aplicación Laravel no incluye el directorio lang. Para personalizarlo, publícalo con el comando Artisan lang:publish.
Cuando hay muchas traducciones, se recomienda el formato JSON.
Crea archivos con el código del idioma en el directorio lang/.
/lang en.json es.json
Define las traducciones usando como clave la cadena original (por ejemplo, en inglés).
{ "Welcome to our application!": "¡Bienvenido a nuestra aplicación!", "I love programming.": "Me encanta programar.", "Logout": "Cerrar sesión", "Dashboard": "Panel"}
Con JSON, la propia frase en inglés es la clave, así que la visualización por defecto en inglés funciona sola. En idiomas sin archivo, se muestra la clave (la cadena original).
Si quieres organizar por funcionalidad (mensajes de validación, etc.)
Cuando sobreescribes las traducciones integradas de Laravel (validation.php, auth.php, etc.)
Cuando necesitas una jerarquía de claves
// lang/es/validation.phpreturn [ 'required' => 'El campo :attribute es obligatorio.', 'email' => 'El :attribute debe ser una dirección de correo válida.',];
Cuándo conviene el formato JSON
Cuando hay muchos textos de UI y pensar claves resulta engorroso
Cuando prefieres escribir la plantilla en inglés y traducir el resto con archivos
Cuando añades i18n a una aplicación ya existente
{{-- Escribe el inglés directamente en Blade --}}{{ __('Welcome to our application!') }}
Es el método más habitual. En formato PHP se indica como “archivo.clave”.
// Formato PHP: clave 'welcome' de lang/es/messages.phpecho __('messages.welcome');// => ¡Bienvenido a la aplicación!// Formato JSON: la clave es la cadena originalecho __('I love programming.');// => Me encanta programar.
Si no existe la traducción, se devuelve la propia clave.
echo __('messages.not_exists');// => messages.not_exists (se devuelve la clave)
Puedes incluir marcadores de la forma :nombre en las traducciones.
// lang/es/messages.phpreturn [ 'welcome' => '¡Bienvenido, :name!', 'greet' => 'Hola, :Name.', // Primera letra en mayúscula 'shout' => 'HEY :NAME!', // Todo en mayúsculas];
Pasa un array de sustituciones como segundo argumento de __().
echo __('messages.welcome', ['name' => 'Tanaka']);// => ¡Bienvenido, Tanaka!echo __('messages.greet', ['name' => 'taro']);// => Hola, Taro. (Name se pone en mayúscula la inicial)echo __('messages.shout', ['name' => 'taro']);// => HEY TARO! (NAME en mayúsculas)
'apples' => '{0} No hay manzanas|[1,19] Hay algunas manzanas|[20,*] Hay muchas manzanas',
echo trans_choice('messages.apples', 0);// => No hay manzanasecho trans_choice('messages.apples', 10);// => Hay algunas manzanasecho trans_choice('messages.apples', 50);// => Hay muchas manzanas
Si un paquete de terceros trae sus propios archivos de idioma, puedes sobrescribirlos colocando el mismo archivo en lang/vendor/{paquete}/{código_idioma}/.Por ejemplo, para personalizar los mensajes en inglés del paquete skyrim/hearthfire:
// lang/vendor/hearthfire/en/messages.phpreturn [ 'welcome' => 'Mensaje personalizado', // Define solo las claves que sobrescribes; el resto se lee del archivo original];
Ejemplo práctico: middleware de conmutación de idiomas
Ejemplo de un middleware que ajusta el locale automáticamente según la URL, la sesión o las preferencias del usuario.
1
Crear el middleware
php artisan make:middleware SetLocale
2
Implementar el middleware
<?phpnamespace App\Http\Middleware;use Closure;use Illuminate\Http\Request;use Illuminate\Support\Facades\App;use Symfony\Component\HttpFoundation\Response;class SetLocale{ public function handle(Request $request, Closure $next): Response { // Lista de locales soportados $supportedLocales = ['es', 'en']; // Si hay locale en la sesión, se usa $locale = $request->session()->get('locale'); // Si no, se mira Accept-Language del navegador if (! $locale) { $browserLocale = substr($request->getPreferredLanguage($supportedLocales) ?? 'es', 0, 2); $locale = in_array($browserLocale, $supportedLocales) ? $browserLocale : 'es'; } App::setLocale($locale); return $next($request); }}
3
Registrar el middleware
Regístralo en bootstrap/app.php.
use App\Http\Middleware\SetLocale;->withMiddleware(function (Middleware $middleware) { $middleware->append(SetLocale::class);})
4
Añadir la ruta para cambiar de idioma
// routes/web.phpRoute::post('/locale/{locale}', function (string $locale) { if (! in_array($locale, ['es', 'en'])) { abort(400); } session(['locale' => $locale]); return back();})->name('locale.switch');