En nuestro artículo anterior hemos visto cómo utilizar Laravel Translator. En particular, hemos visto cómo crear utilizar el enrutador para “multiplicar” las rutas a varios idiomas y cómo traducir texto con facilidad. Si no has leído aún nuestro artículo, te recomiendo hacerlo antes de continuar. En esta entrega vamos a ver cómo acceder a esas rutas y dejaremos para la próxma cómo traducir modelos enteros. Manos a la obra.

En Laravel existe el famoso facade URL que nos permite acceder con facilidad a los métodos de URLGenerator. Para acceder a la URL asociada al nombre de una ruta podemos utilizar indistintamente el método (o el helper) de la siguiente forma:

URL::route('some_path');

//o más brevemente:
route('some_path');

Con Laravel Translator seguiremos haciéndolo de la misma manera. Se ha extendido la clase URLGenerator y desviado el facade URL para que apunte hacia nuestra nueva clase. No deberás mover ni un dedo para que esto funcione pues todo esto ya ha sido automatizado desde la instalación del paquete. Cuando uses URL::route estarás llamando a una función que se le parece mucho a la original de Laravel, pero con ciertas mejoras. El resultado de URL::route será la URL solicitada para el locale actual. Veámoslo detenidamente.

Supóngase que nuestro archivo de rutas luce así:

Route::get('products', [
    'locales' => ['es', 'en'],
    'as' =>  'product_path',
    'uses' => 'productsController@show' 
]);

Esto quiere decir que habrá dos rutas a las que acceder: /es/products y /en/products. Ya sea en el controlador o en la vista, cuando llamemos al método o al helper route('product_path') obtendremos un resultado diferente en función del locale al que el usuario haya accedido. Esto resulta muy útil cuando tenemos que generar links en nuestras vistas. Por ejemplo, nuestro menú podría lucir de la siguiente forma:

<nav>
    <a href="{!! route('product_path') !!}">
        {!! tt('nav.products') !!}
    </a>
    <!-- etc -->
</nav>

Esto nos facilita enormemente la tarea de trabajar con la generación de links en sitios multilenguajes. Pero, ¿qué sucede si quisiéramos acceder a la URL de otro locale? Bueno, muy sencillamente, especificando el locale a partir del cual la ruta debe ser generada:

route('product_path'); 
// www.misitio.com/es/products

route('product_path', [], false); 
// es/products

route('product_path',  [], true, 'en'); 
// www.misitio.com/en/products

route('product_path',  [], false, 'br', true); 
// www.misitio.com/es/products 
// Devuelve la URL del locale por defecto ('es' )
// en caso de que la ruta no haya sido definida
// para el locale 'br'

También podemos optar por utilizar el nuevo método Route::routes, el que nos devolverá un Objeto con las URL de una determinada ruta.

routes('product_path');
/*
(
    es => www.misitio.com/es/products,
    en => www.misitio.com/en/products,
    fr => 
)
*/

Por último, podemos obtener la URL actual del locale actual (o de cualquier otro locale):

URL::current();
// www.misitio.com/es/products,

URL::current('en');
// www.misitio.com/en/products,

Aquí encontrarás el listado completo de métodos del nuevo facade URL

En el próximo artículo veremos cómo traducir un modelo.