Con PHP, detectar idioma, redireccionar página y guardar preferencia del lenguaje en una cookie

por | marzo 23, 2011

Selector idiomas con PHP

En vista que no encontramos un ejemplo completo, publicamos nuestra propia solución.

Mediante lenguaje PHP, queremos detectar el idioma del navegador y redireccionar automáticamente al visitante a la página en su idioma. En caso que el visitante desee otro idioma y no el «detectado», pues puede seleccionarlo y su preferencia del lenguaje elegido se guarda en una cookie.

Nuestro ejemplo es muy sencillo, básicamente consta de dos archivos.

Por un lado tenemos el código que se inserta en todas las páginas de tu web, (por ejemplo en index.php, index-pt.php, index-fr.php, etc). Este código hace un include de un archivo común a todos llamado «redireccionador.php«, y contiene todo lo necesario para hacer la web multilingüe .

Empezamos creando los dos archivos «index.php», «redireccionador.php» para hacer las pruebas.

En «index.php» y más tarde en los demás archivos de idiomas «index-fr.php», «index-en.php», «index-de.php»… escribimos:

NOTA: quita el espacio que hay entre el «<» y el «?php» del inicio, y el «?» y «>» que hay un poco más abajo. Es que si no le pongo el espacio, esta web peta y sale un error sin que aparezca el código siguiente.

< ?php 

$thisPageLang="es"; // idioma de esta página 
include 'redireccionador.php'; 
? >

<html><body>
<a href="index-ca.php?wlang=ca"><img src="pics/nca.jpg" alt="catala flag" /></a> 
<a href="index-de.php?wlang=de"><img src="pics/nde.gif" alt="german flag" /></a>
<a href="index-en.php?wlang=en"><img src="pics/nen.jpg" alt="english flag" /></a>
<a href="index.php?wlang=es"><img src="pics/nes.jpg" alt="spanish flag" /></a>
<a href="index-eu.php?wlang=eu"><img src="pics/neu.png" alt="Basque flag" /></a>
<a href="index-ga.php?wlang=ga"><img src="pics/nga.png" alt="galician flag" /></a>
<a href="index-fr.php?wlang=fr"><img src="pics/nfr.gif" alt="french flag" /></a>
<a href="index-it.php?wlang=it"><img src="pics/nit.jpg" alt="italian flag" /></a>
<a href="index-pt.php?wlang=pt"><img src="pics/npo.gif" alt="portuguese brazilian flag" /></a>
<br /><br />Web española!
</body></html>

En la variable $thisPageLang escribiremos el idioma con el formato típico, es decir, si la página está en español será «es», si está en catalán será «ca», si es inglesa sera «en», etc. Esto es necesario por si estamos por ejemplo en la página en español, no nos redireccione automáticamente a la página en español, y así infinitamente.

Y ahora la parte final, el código que detecta el idioma del visitante, se guarda la cookie y redirecciona:

Archivo «redireccionador.php»


< ?php

// Si el idioma esta en la URL, grabarlo en una cookie 
$webLang=trim($_GET["wlang"]);
if ($webLang<>"") {
        $expire=time()+60*60*24*30*6; // 6 meses
        setcookie("clang", $webLang, $expire);
} else {

    // Hay una cookie de idioma definida
    if (isset($_COOKIE["clang"])) {    
        // leer idioma en la cookie
        $webLang=$_COOKIE["clang"];

    // No hay ninguna cookie de idioma definida    
    } else {      
        // detectar idioma del navegador
        $webLang = substr ($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2);
        if (($webLang<>"ca") AND ($webLang<>"de") AND ($webLang<>"en") AND ($webLang<>"es") AND ($webLang<>"eu")
            AND ($webLang<>"fr") AND ($webLang<>"ga") AND ($webLang<>"it") AND ($webLang<>"pt") ) {
                // Idioma por defecto, en caso de detectar un idioma raro que no tengamos
                $webLang="es";
        }
        $expire=time()+60*60*24*30*6; // 6 meses
        setcookie("clang", $webLang, $expire);
    }  

    // Anti bucles infinitos (evita que si estamos en la página española, nos redirija a la página española y así una y otra vez sin parar.
    if ($thisPageLang<>$webLang) {
        // redireccionar al idioma correspondiente            
        switch ($webLang) {
            case "ca":
                Header('Location: http://www.tuweb.com/index-ca.php');
                break;
            case "de":
                Header('Location: http://www.tuweb.com/index-de.php');
                break;
            case "en":
                Header('Location: http://www.tuweb.com/index-en.php');
                break;
            case "es":
                Header('Location: http://www.tuweb.com/index.php');
                break;
            case "eu":
                Header('Location: http://www.tuweb.com/index-eu.php');
                break;
            case "fr":
                Header('Location: http://www.tuweb.com/index-fr.php');
                break;
            case "ga":
                Header('Location: http://www.tuweb.com/index-ga.php');
                break;
            case "it":
                Header('Location: http://www.tuweb.com/index-it.php');
                break;
            case "pt":
                Header('Location: http://www.tuweb.com/index-pt.php');
                break;
            default: 
                Header('Location: http://www.tuweb.com/index.php');
        }        
    }

}
? >

Y ya para acabar, si eres tan vago como nosotros y no quieres copiar/pegar, te dejamos un archivo comprimido en ZIP con ejemplos de todos los archivos de este artículo (para 8 idiomas), y hasta te incluimos las banderitas para que te ahorres buscar con Google.

DESCARGAR:
Ejemplo completo de detector de idioma, redireccionador y cookie (formato ZIP, 20 KB)

Importante 1: En los archivos ZIP, no está corregido el problema con el portugués. Todo lo que tenga que ver con el idioma portugués, hay que poner «pt» y no «po». Por ejemplo el archivo portugués sería index-pt.php (y no index-po.txt), o en el archivo «redireccionador.php», donde dice «case «po»:» hay que poner «pt» y no «po». El «pt» es el idioma hablado sobretodo en Brasil y Portugal, pero el «po» es el idioma que se habla en Polonia. :P

Importante 2: En caso que «no funcione bien», seguramente es por el tema de la caché. En nuestro caso tenemos activada la caché con el archivo «.htaccess» y por eso el tema de la cookie tarda unos días en hacer efecto (la gente no va cambiando de idioma cada minuto). Si al hacer las pruebas os aparece este problema de la caché, se puede evitar si se pulsa el botón «mayúsculas» (tecla shift del teclado) y sin soltarla, se clica con el botón izquierdo del ratón encima del icono de recargar del navegador (el dibujo que aparece una «flecha circular»). Esto fuerza a que el navegador no utilice la cache y cargue los datos desde la web.

Si te gusta este artículo, por favor comenta más abajo. Y si no te gusta, pues también pero sin pasarse. ;)

8 pensamientos en “Con PHP, detectar idioma, redireccionar página y guardar preferencia del lenguaje en una cookie

  1. Corrupto

    Lo que andaba buscando desde hace rato para redireccionar y que guardara una cookie, muchas gracias por compartir.

  2. pancho_lira

    Buenísimo, en el caso que sea para una landing page y esta te lleve a un inicio en español y otra en inglés y así consecutivamente…..

    1. Sócrates Autor

      Si claro, funciona con cookies, eligiendo el idioma en un menú, o si es la primera vez, lo hace automático. Borrar la cache no sirve de nada. :)

  3. Sócrates Autor

    Me acabo de dar cuenta de un error, para el idioma portugués se debe poner «pt» (de portugués) y no «po» (de polonés). Lo acabo de corregir, pero si alguien tiene el código antiguo, sería bueno que revise esto si utiliza el idioma portugués en su web.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

¿Eres humano? Si lo eres, resuelve esta operación: *