jueves, 17 de septiembre de 2009

Detectar idioma del navegador del usuario con PHP

En sitios que manejan múltiples idiomas muchas veces es necesario redireccionar a los usuarios a la ubicación correspondiente de acuerdo al idioma con que naveguen.

Para esto, usando algo similar al script para detectar el navegador usando PHP podemos generar una sencilla función en que redirija al usuario a la ubicación deseada de acuerdo a su idioma. El script puede ser algo como lo siguiente:

1  
<?php 
2  
//Creamos una función que detecte el idioma del navegador del cliente.
3  
function getUserLanguage() { 
4       
$idioma =substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2);
5       return 
$idioma
6  }
7  
8  
//Almacenamos dicho idioma en una variable
9  
$user_language=getUserLanguage();
10  
11  
//De acuerdo al idioma hacemos una o varias redirecciones.
12  
if($user_language=='en'){
13       
header'Location: http://www.ejemplo.travel/en' );
14  }
15  elseif(
$user_language=='de'){
16       
header'Location: http://www.ejemplo.com/de' );
17  }
18  
?>



Sencillo y bastante ùtil. ¿Conoces otra formas de hacerlo?

15 comentarios:

  1. Hola realizado ese código de la siguiente manera y no me funciona, me puedes ayudar?


    ResponderEliminar
    Respuestas
    1. A mi me paso igual, pero no me di cuenta de un fallo que habia. Cuando copias y pegas, fijate bien que se quedan los numeros 1, 2, 3, 4, ...

      Debes borrarlos y ya esta. Te debe funcionar

      Eliminar
  2. Muy bueno, pero que hago en caso de que el idioma no este en la lista???????? gracias de antemano

    ResponderEliminar
    Respuestas
    1. Lo redireccionas a otro idioma que creas que sea universal como por ejemplo el Etrusco. Saludos.

      Eliminar
  3. Gracias, es un gran aporte, para quien preguntó que pasa cuando el idioma no está en la lista, pues yo cambiaría el if por :

    switch ($user_language){
    case 'es': header( 'Location: http://tudominio.com/es' );
    break;
    case 'en': header( 'Location: http://tudominio.com/en' );
    break;
    default: header( 'Location: http://tudominio.com/donde_quieras' );
    }

    ResponderEliminar
  4. También puedes dejar el if así:

    if($user_language=='en'){
    header( 'Location: http://www.ejemplo.travel/en' );
    }
    elseif($user_language=='de'){
    header( 'Location: http://www.ejemplo.com/de' );
    }
    else{
    header('Location: http://www.ejemplo.com/sinidioma')
    }

    ResponderEliminar
  5. muy buenos aportes , te tengo una pregunta referente al if

    tengo una tabla la cual debo consultar si el usuario existe solo hace un update a un campo , si no debe llenar determinados campos mi codigo es este


    mysql_select_db($database_conexion, $conexionredsocial);
    $query_usuario = sprintf("SELECT * FROM users WHERE users.idContador=%s", GetSQLValueString($chat_usuario, "int"));
    $usuario = mysql_query($query_usuario, $conexion) or die(mysql_error());
    $row_usuario = mysql_fetch_assoc($usuario);
    $totalRows_usuario = mysql_num_rows($usuario);

    mysql_free_result($usuario);
    if ($usuario !=" ")
    { $updateSQL = sprintf("update users
    inner join tblusuario on users.idContador = tblusuario.idContador
    set pass = strPassword WHERE tblusuario.idContador=%s", GetSQLValueString($usuario, "int"));
    mysql_select_db($database_conexion, $conexionredsocial);
    $Result1 = mysql_query($updateSQL, $conexion) or die(mysql_error());
    }
    else //if ($varchat_chat =="")
    {$insertSQL = sprintf ("INSERT INTO users (idContador, iduser, name, pass) select idContador, strEmail, strNombre, strPassword from tblusuario WHERE tblusuario.idContador=%s", GetSQLValueString($varchat_chat, "int"));
    mysql_select_db($database_conexion, $conexion);
    $Result1 = mysql_query($insertSQL, $conexion) or die(mysql_error());

    }

    ?>

    ResponderEliminar
  6. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  7. Jejeje, aqui un poco mejorado asi solo tienes que poner igual a en los nuevos if y ya está sin escribir tanto:

    $autoidioma = substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,5);
    if($autoidioma == 'es-ES'){
    header("Location:".$autoidioma);
    }elseif($autoidioma == 'en-US'){
    header("Location:".$autoidioma);
    }else{
    header("Location:en-US");
    }

    ResponderEliminar
  8. grácias, hyper sencillo y funcionando a la primera!

    ResponderEliminar
  9. Lo mismo digo facil y funciona.
    ¡¡¡Enhorabuena!!!

    ResponderEliminar
  10. Los navegadores de hoy en dia permiten configurar varios idiomes por orden de preferencia, si el usuario tiene configurado el idioma holandés como preferente, i el alemán como secundario y tu web no tiene idioma holandés, será redirigido al web en inglés. esto seria un error en tu código pues en realidad debes coprobar todos los idiomas del usuario y no solo el principal.

    Si usas por ejemplo la función getUserLanguages() de la libreraia Bootils (http://oriolet.github.io/Bootils/features/#getUserLanguages) te devolverá todos los idiomas del usuario por orden de preferencia y podras recorrer ese array para comprobas si tu web dispone de alguno antes de enviarlo a la version por defecto.

    ResponderEliminar
  11. tengo problemas, la funcion en php me funciona muy bien mientras tengo la web corrieno en wamp pero al subirla a un hosting no funciona que sera?

    ResponderEliminar
  12. sera que en la condición no esta el "es" de español y no ves nada por eso?

    ResponderEliminar