Como hacer una web multilenguaje
Publicado en December 31, 2009 by Damian
Para detectar el idioma del navegador y hacer una web multilenguaje existen diversos métodos. Yo particularmente suelo usar el siguiente:
Primero creo el archivo lang-functions.php
<?php
/*
=============================================================================
Funcion: detectar_idioma_navegador()
-----------------------------------------------------------------------------
Proposito: Esta funcion detecta el idioma por defecto seleccionado en el navegador del visitante.
Si no se detecta un lenguaje valido, se asigna el selecionado por defecto.
=============================================================================
*/
function detectar_idioma_navegador() {
global $conf;
$languages = preg_replace('/(;q=\d+.\d+)/i', '', getenv('HTTP_ACCEPT_LANGUAGE'));
$bol_language_detected = false;
// Comprobamos si el navegador usa alguno de los idiomas que hemos predefinido.
foreach ($conf['lang_enabled'] as $tmp_arr_language) {
if (preg_match('/' . $tmp_arr_language . '/i', $languages)) {
$tmp_str_language_detected = $tmp_arr_language;
$bol_language_detected = true;
break;
}
}
// Si el navegador usa uno de los idiomas seleccionados, se devuelve el path del fichero de idioma
// En caso contrario, se devuelve el path del idioma original
if ($bol_language_detected) {
return $tmp_str_language_detected;
} else {
return $conf['lang_default'];
}
}
/*
=============================================================================
Funcion: detectar_idioma_navegador()
-----------------------------------------------------------------------------
Proposito: Esta funcion detecta el idioma por defecto seleccionado en el navegador del visitante.
Si no se detecta un lenguaje valido, se asigna el selecionado por defecto.
=============================================================================
*/
function detectar_idioma_navegador() {
global $conf;
$languages = preg_replace('/(;q=\d+.\d+)/i', '', getenv('HTTP_ACCEPT_LANGUAGE'));
$bol_language_detected = false;
// Comprobamos si el navegador usa alguno de los idiomas que hemos predefinido.
foreach ($conf['lang_enabled'] as $tmp_arr_language) {
if (preg_match('/' . $tmp_arr_language . '/i', $languages)) {
$tmp_str_language_detected = $tmp_arr_language;
$bol_language_detected = true;
break;
}
}
// Si el navegador usa uno de los idiomas seleccionados, se devuelve el path del fichero de idioma
// En caso contrario, se devuelve el path del idioma original
if ($bol_language_detected) {
return $tmp_str_language_detected;
} else {
return $conf['lang_default'];
}
}
Una vez creado el archivo lo incluyo de la siguiente manera:
include("languages/lang-functions.php");
$conf['lang_default'] = 'es'; // idioma por defecto
$conf['lang_enabled'] = array('es','en');
$conf['lang'] = detectar_idioma_navegador();
if(isset($_GET['lang'])) $conf['lang']=$_GET['lang'];// Podemos crear un link como por ej una bandera para permitir cambiar el idioma al usario
require_once("languages/".$conf['lang'].".php");
$conf['lang_default'] = 'es'; // idioma por defecto
$conf['lang_enabled'] = array('es','en');
$conf['lang'] = detectar_idioma_navegador();
if(isset($_GET['lang'])) $conf['lang']=$_GET['lang'];// Podemos crear un link como por ej una bandera para permitir cambiar el idioma al usario
require_once("languages/".$conf['lang'].".php");
Por último nos queda crear los archivos de idiomas de la siguiente forma:
es.php
<? // Spanish language file
setlocale(LC_ALL,'es_ES');
define("_MENSAJE", "HOLA SOY UN MENSAJE EN ESPAÑOL");
?>
setlocale(LC_ALL,'es_ES');
define("_MENSAJE", "HOLA SOY UN MENSAJE EN ESPAÑOL");
?>
en.php
<? // English language file
setlocale(LC_ALL,'es_ES');
define("_MENSAJE", "Hi im a English message");
?>
setlocale(LC_ALL,'es_ES');
define("_MENSAJE", "Hi im a English message");
?>
En la web escribiriamos echo (_MENSAJE); y según el idioma del navegador aparecerá de una forma u otra.
Espero que haya servido de ayuda
Links Sponsors
Tags: multilenguaje
Categoría: Tutoriales


Con tu lector preferido.
Via Email.
Por Twitter.
Gracias!! y si o si hay que tener el contenido separado en distintos idiomas? no se puede tener en uno y que con una funcion cambie ese contenido?.
si podrias tener todo en un solo archivo y cargar una mitad y la otra con un simple if ($conf['lang'] == 'es'){ cargo en español }else{ cargo en ingles }
Al separarlo estas dividiendo el peso del archivo y tu página es más liviana