# Introducción

Las características de localización de Laravel proporcionan una forma conveniente de recuperar cadenas en varios idiomas, permitiéndole apoyar fácilmente varios idiomas dentro de su aplicación. Las cadenas de idiomas se almacenan en archivos dentro del directorio resources/lang. Dentro de este directorio debería haber un subdirectorio para cada idioma soportado por la aplicación:

/resources
    /lang
        /en
            messages.php
        /es
            messages.php

Todos los archivos de idiomas devuelven una serie de cadenas de teclas. Por ejemplo:

<?php

return [
    'welcome' => 'Welcome to our application',
];

Para los idiomas que difieren por territorio, se deben nombrar los directorios de idiomas según la ISO 15897. Por ejemplo, "en_GB" debería utilizarse para el inglés británico en lugar de "en-gb".

Configuring The Locale

El idioma por defecto de su aplicación se almacena en el archivo de configuración config/app.php. Puede modificar este valor para adaptarlo a las necesidades de su aplicación. También puede cambiar el idioma activo en tiempo de ejecución utilizando el método setLocale en la App facade:

Route::get('welcome/{locale}', function ($locale) {
    if (! in_array($locale, ['en', 'es', 'fr'])) {
        abort(400);
    }

    App::setLocale($locale);

    //
});

Puede configurar un "lenguaje de reserva", que se utilizará cuando el lenguaje activo no contenga una determinada cadena de traducción. Al igual que el idioma predeterminado, el idioma alternativo también se configura en el archivo de configuración config/app.php:

'fallback_locale' => 'en',

Determinación de la ubicación actual

Puede utilizar los métodos getLocaleisLocale en la App facade para determinar el lugar actual o comprobar si el lugar es un valor determinado:

$locale = App::getLocale();

if (App::isLocale('en')) {
    //
}

# Definiendo las cadenas de traducción

Usando teclas cortas

Típicamente, las cadenas de traducción se almacenan en archivos dentro del directorio resources/lang. Dentro de este directorio debería haber un subdirectorio para cada idioma soportado por la aplicación:

/resources
    /lang
        /en
            messages.php
        /es
            messages.php

Todos los archivos de idiomas devuelven una serie de cadenas de teclas. Por ejemplo:

<?php

// resources/lang/en/messages.php

return [
    'welcome' => 'Welcome to our application',
];

Usar cadena de traducción como clave

Para aplicaciones con grandes requisitos de traducción, definir cada cadena con una "tecla corta" puede resultar rápidamente confuso al referirse a ellas en sus vistas. Por esta razón, Laravel también proporciona soporte para definir cadenas de traducción usando la traducción "por defecto" de la cadena como clave.

Los archivos de traducción que utilizan cadenas de traducción como claves se almacenan como archivos JSON en el directorio resources/lang. Por ejemplo, si tu aplicación tiene una traducción al español, deberías crear un archivo resources/lang/es.json:

{
    "I love programming.": "Me encanta programar."
}

Recuperación de cadenas de traducción

Puede recuperar líneas de los archivos de idiomas utilizando la función __ helper. El __ method acepta el archivo y la clave de la cadena de traducción como su primer argument. Por ejemplo, recuperemos la cadena de traducción de bienvenida del archivo de idioma resources/lang/messages.php:

echo __('messages.welcome');

echo __('I love programming.');

Si esta usando el Motor de plantilla de Blade, puede usar la sintaxis {{ }} para hacer eco de la cadena de traducción o usar la directiva @lang:

{{ __('messages.welcome') }}

@lang('messages.welcome')

Si la cadena de traducción especificada no existe, la función __ devolverá la clave de la cadena de traducción. Así, usando el ejemplo anterior, la función __ devolvería messages.welcome si la cadena de traducción no existe.

La directiva @lang no escapa a ninguna salida. Usted es totalmente responsable de escapar de su propia salida cuando usa esta directiva.

Reemplazar los parámetros en las cadenas de traducción

Si lo desea, puede definir marcadores de posición en sus cadenas de traducción. Todos los marcadores de posición se prefijan con un :. Por ejemplo, puede definir un mensaje de bienvenida con un nombre de marcador de posición:

'welcome' => 'Welcome, :name',

Para reemplazar los marcadores de posición al recuperar una cadena de traducción, pase una matriz de reemplazos como segundo argumento a la función __:

echo __('messages.welcome', ['name' => 'dayle']);

Si su marcador de posición contiene todas las letras mayúsculas, o sólo tiene la primera letra en mayúscula, el valor traducido se escribirá en mayúsculas en consecuencia:

'welcome' => 'Welcome, :NAME', // Welcome, DAYLE
'goodbye' => 'Goodbye, :Name', // Goodbye, Dayle

Pluralización

La pluralización es un problema complejo, ya que los diferentes idiomas tienen una variedad de reglas complejas para la pluralización. Utilizando un carácter "pipa", se pueden distinguir formas singulares y plurales de una cadena:

'apples' => 'There is one apple|There are many apples',

Incluso puede crear reglas de pluralización más complejas que especifiquen cadenas de traducción para múltiples rangos de números:

'apples' => '{0} There are none|[1,19] There are some|[20,*] There are many',

Después de definir una cadena de traducción que tiene opciones de pluralización, se puede utilizar la función  trans_choice para recuperar la línea para un "count" dado. En este ejemplo, como el conteo es mayor que uno, se devuelve la forma plural de la cadena de traducción:

echo trans_choice('messages.apples', 10);

También puede definir atributos de marcador de posición en cadenas de pluralización. Estos marcadores de posición se pueden sustituir pasando una matriz como tercer argumento a la función trans_choice:

'minutes_ago' => '{1} :value minute ago|[2,*] :value minutes ago',

echo trans_choice('time.minutes_ago', 5, ['value' => 5]);

Si desea mostrar el valor entero que se pasó a la función trans_choice, puede utilizar el marcador de posición :count:

'apples' => '{0} There are none|{1} There is one|[2,*] There are :count',

# Anulación de los archivos de idioma de los paquétes

Algunos paquetes pueden ser enviados con sus propios archivos de idioma. En lugar de cambiar los archivos centrales del paquete para ajustar estas líneas, puede anularlos colocando los archivos en el directorio resources/lang/vendor/{package}/{locale}.

Así que, por ejemplo, si necesitas anular las cadenas de traducción al inglés en messages.php para un paquete llamado skyrim/hearthfire, debes colocar un archivo de idioma en: resources/lang/vendor/hearthfire/en/messages.php. Dentro de este archivo, sólo debe definir las cadenas de traducción que desea anular. Cualquier cadena de traducción que no anule se cargará desde los archivos de idioma original del paquete.