2519233522_a9506d45c6_o

Cuando queremos hacer una web con varios idiomas, debemos tener en cuenta que deberiamos ofrecerle al usuario de forma predeterminada la web en el idioma que el tiene configurado el navegador. Muchas veces se confunde el pais de procedencia del usuario con su idioma, y debemos distinguirlo, puesto que puede que nuestro usuario nos visite desde francia pero su idioma sea el castellano.

Para ello detectaremos el idioma del usuario a partir del navegador. Por defecto el navegador nos envia los idiomas que acepta el usuario en una lista ordenada por prioridad. Este dato lo podemos encontrar en la super variable $_SERVER['HTTP_ACCEPT_LANGUAGE']. Esta variable tiene la siguiente forma:

Accept-Language: ca,es-es;q=0.8,es;q=0.6,en-us;q=0.4,en;q=0.2

Por cada idioma que acepta el usuario aparece separado por “,” y en cada idioma aparece una q de prioridad.

Para ofrecer al usuario la web en su idioma vamos a programar primero de todo, una funcion que nos procese este string y nos devuelva un array ordenado por prioridad de idioma.

function getAcceptedLanguages(){
  preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse);
  if (count($lang_parse[1])) {
    $langs = array_combine($lang_parse[1], $lang_parse[4]);
    foreach ($langs as $lang => $val) {
      if ($val === '')
        $rlangs[substr($lang, 0, 2)] = 1;
      else if ($rlangs[substr($lang, 0, 2)] < $val)
        $rlangs[substr($lang, 0, 2)] = $val;
    }
    arsort($rlangs, SORT_NUMERIC);
  }
  else $rlangs = array("es" => 1);
  return $rlangs;
}

Esta función, segun el string mostrado antes de HTTP_ACCEPT_LANGUAGE, nos devolveria un array como el siguiente:

Array (
  [ca] => 1
  [es] => 0.8
  [en] => 0.4
);

Cada posicion del array, contiene como clave el idioma, y como valor la prioridad del usuario. Ahora que ya tenemos este array, simplemente debemos compararlo con los idiomas en los que ofrecemos nuestra página y por defecto mostrarla en el idioma de mayor prioridad para el usuario:

function autoDetectLanguage(){
  $langs = $this->getAcceptedLanguages();
  foreach ($langs as $lang => $val) {
    foreach($this->_pagelangs as $key => $l){
      if (strpos($lang, $key) === 0) {
        return $key;
      }
    }
  }
  return DEFAULT_LANGUAGE;
}

El valor de $this->_pagelangs es un array con los idiomas en los que está de la página dónde cada clave del array es el código del idioma. El valor de cada item del array puede ser cualquier cosa:

 $this->_pagelangs = array( "es" => "Español", "en" => "Inglés" );

La constante DEFAULT_LANGUAGE define el idioma por defecto de la página si no se encuentra concordancia con los idiomas del vistante.

La función autoDetectLanguage nos devolverá el idioma al que mostrar la página, y a partir de ahí podemos hacer una redirección a la url que se desee para configurar el idioma. Esta función solo debemos llamarla la primera vez que el usuario entra en la página y que aun no sepamos su idioma. Una vez lo sepamos ya no es necesario.

Cualquier duda o comentario es bien recibido.

  2 Responses to “Detectar idioma del navegador con PHP”

  1. este código es sencillo y muy útil, justo lo que estaba buscando gracias

  2. Hola David,
    Es posible detectar el idioma del buscador Google?
    Creo que esta es una función que realiza por si solo el propio Google, de tal manera que si accedes a través de Google a una web en distintos idiomas, el propio Google te selecciona el idioma que coincide con el que estas utilizando en Google.
    Si es así, mi pregunta es la siguiente: Que prioridad da Google en sus respuestas, el idioma del navegador (en el caso de que esté así programada la web a la que se quiere acceder) del usuario o bién el idioma del Google del usuario?. Es compatible una cosa y la otra, de tal manera que Google establece sus prioridades en la muestra de resultados?
    En principio entiendo que lo lógico sería que fuera prioritario el idioma del buscador Google sobre el idioma del navegador.Es así?
    Gracias por tu ayuda

 Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

 
© 2016 David Rojo González | Tecnología, programación web, SEO Suffusion theme by Sayontan Sinha