Gestión de idiomas mediante filtros en Laravel 4

Supongamos que tienes una aplicación desarrollada en laravel 4 en la que estás haciendo uso de la clase de localización e internacionalización y cada usuario (autenticado o no) puede ver tu aplicación en el idioma que quiera.

En base a esto, he desarrollado para algún proyecto personal, un filtro del tipo “before” para el objeto App (es decir, se ejecutará cada vez que se haga una llamada al servidor, y siempre antes de interpretar el fichero de rutas).

La prioridad para elegir el idioma (dentro de una lista de idiomas permitidos en nuestra aplicación) es la siguiente:

  1. Si el usuario está autenticado, leemos el campo “lang” de la base de datos.
  2. Si no está autenticado distinguimos varios casos:
    – Si el idioma estaba en una cookie (podríamos hacerlo también basándonos en la sesión) y es un idioma válido, leemos dicho valor.
    – Si la cookie no existía, leemos el idioma del navegador con el que nos visita el usuario y si el idioma del navegador está entre los soportados, leemos ese valor (que guardaremos posteriormente en una cookie).
    – Si el navegador tampoco nos servía, solo nos queda dar un idioma por defecto, por ejemplo en inglés.

Aquí el código en cuestión:


App::before(function($request)
{
 //Lang filter
 if ( Auth::check() ) {
 $user_language = Auth::user()->lang;
 }
 else
 {
 $langs = array('en', 'es', 'fr', 'de', 'it');

//Check cookie
 if( Cookie::has('language') && in_array(Cookie::get('language'), $langs) )
 {
 $user_language = Cookie::get('language');
 }
 else
 {
 //Check browser lang
 $browser_lang = substr($request->server->get('HTTP_ACCEPT_LANGUAGE'), 0, 2);

if(!isset($browser_lang) && in_array($browser_lang, $langs))
 {
 $user_language = $browser_lang;
 }
 else
 {
 //Default lang for users
 $user_language = 'en';
 }
 Cookie::forever('language', $user_language);
 }
 }
 App::setLocale($user_language);
 //End lang filter
});

Es un código sencillo pero puede, por lo menos a mi, resolvernos este tema de multi idioma.

 

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s