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

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 las páginas del idioma correspondiente (index.php) y este código entre otras cosas hace un Include de un archivo común llamado “redireccionador.php“, que contiene todo lo necesario.

Empezamos creando los archivos “index.php”, “redireccionador.php”, “index-ca.php”, “index-en.php”, “index-de.php” y el resto de idiomas.

En “index.php” y los demás archivos de idiomas escribimos:

<?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-po.php?wlang=po"><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<>"po") ) {
                // 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 "po":
                Header('Location: http://www.tuweb.com/index-po.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)

Atención: 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. ;)

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

Deja un comentario

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