Página en varios idiomas. Fallan las variables

Tengo una web programada para mostrar en 3 idiomas.
El caso es que funciona de maravilla cuando son los 3 idiomas que hay en la web: español, francés e ingles. Pero si el sistema operartivo es en italiano, polaco, cualquier idioma distinto al de los 3 idiomas de la web las variables no funcionan aunque sí funciona bien el archivo idiomas.php es decir todo se va al idioma default menos las variables.
Me explico mejor mostrando el código:
Tengo el include idiomas.php que es el siguiente:
<!--p <br-->if( GET['lg']){
$HTTP_SESSION_VARS['idioma_s']= GET['lg'];
}
$lg=$HTTP_SESSION_VARS['idioma_s'];
if(empty($lg)){ //primero preguntamos si la variable que va a contener el lenguage del visitante esta vacia
$lg=substr($HTTP_ACCEPT_LANGUAGE,0,2); // si esta vacia sacamos el lenguage del visitante y lo ponemos en la variable $lg
}
switch($lg){ //ahora cargamos el archivo que contiene el idioma segun la varible que sacamos antes
case "es" : //es = español
include("lang_esp.php"); //ahora cargamos el archivo que contiene las variables y sus palabras
break;
case "en" : //en = ingles
include("lang_en.php");
break;
case "fr" : //fr = frances
include("lang_fr.php"); //ahora cargamos el archivo que contiene las variables y sus palabras
break;
default :
include("lang_en.php"); //cargamos un idioma por defecto si no se encontro algun idioma
break;
}
?>
Como digo esto muestra bien el contenido en la web del archivo lang_en.php que es el default si el sistema operativo no es ninguno de los 3 idiomas del "case" y muestra las variables del archivo
Pero con las variables procedentes de la base de datos que las muestro así no aparecen y destroza la web
este es un ejemplo de como muestro las variables:
<!--p <br-->if($lg=="es"){
echo utf8_encode ($row['distancia_es']);
}
if($lg=="en"){
echo utf8_encode($row['distancia_en']);
}
if($lg=="fr"){
echo utf8_encode ($row['distancia_fr']);
}
?>
En el header de cada página tengo este código
<?php
session_start();
session_register('idioma_s');
include("includes/idiomas.php");
?>
¿Qué estoy haciendo mal?

1 respuesta

Respuesta
1
Supongo que el problema está en que pones:
if ($lg=="es")
cuando deberías poner:
if ($_SESSION["idioma_s"] == "es")
Por cierto, que te recomiendo que uses mejor $_SESSION en lugar de $HTTP_SESSION_VARS que es un método de acceso obsoleto.
Gracias por contestar David. Tienes razón en cuanto a los métodos obsoletos.aunque el problema estriba en que si el visitante no es ni es ni en ni fr sino que es it, pl, nl..., no ve las variables procedentes de la base de datos, por lo que creo que el problema está en el archivo idiomas.php
¿Sabes cómo arreglarlo?
Gracias
Gabi
No entiendo bien el problema. Tendrías que averiguar qué valor tiene tu variable $lg en el caso de un visitante italiano. Debería ser "en" por lo que entiendo, pero no debe ser así.
Antes de 'sacar' tus variables, imprime el valor de $lg que seguramente estará vacío, porque como ya te he dicho, seguramente no lo asignas y el valor que deberías usar es $_SESSION["idioma_s"]
Prueba a escribir antes de las variables:
<?php
echo "LG: $lg, SESSION: " . $_SESSION["idioma_s"];
?>
A ver si me explico bien:
Lo que veo es que si el visitante es distinto de en,fr o es no recoge las variables de la base de datos.Por ejemplo si es italiano recoge $lg=it y no saca variables ya que  devuelve $_SESSION["idioma_s"]==it
Ya te digo en el caso del visitante que no es en,es o fr los includes se van directos al ingles que es la orden del archivo idiomas.php, pero la variable $lg se transforma en
it,nl,ca etc y debería transformarse en "en" como hace el archivo idiomas.php que ordena para cargar los includes debería convertir it,nl,ca etc en $lg=en
por eso creo que habría que poner algun código no sé si al principio de cada página o en el archivo idiomas.php
He escrito lo que me dijiste para imprimir el valor de $lg y me imprime las variables de idioma y sesión del idioma que le asigno .Y si en la barra del navegador cambio el idioma a it http://www....../preguntas_frecuentes.php?lg=it me imprime
LG: it, SESSION: it
Y me desaparecen los contenidos de las variables ya que no es ni en ni es ni fr
En el principio de cada página tengo
session_start();
session_register('idioma_s');
include("includes/idiomas.php");
Espero que me haya explicado mejor
Gracias
gabi
De acuerdo, entonces el valor de la variable $lg es el correcto y lo que falla es tu 'sistema' para mostrar las variables, que no es completo.
La completitud es una interesante propiedad. Donde pones ahora:
if($lg=="es"){
echo utf8_encode ($row['distancia_es']);
}
if($lg=="en"){
echo utf8_encode($row['distancia_en']);
}
if($lg=="fr"){
echo utf8_encode ($row['distancia_fr']);
}
deberías poner:
if($lg=="es"){
echo utf8_encode ($row['distancia_es']);
}
elseif($lg=="fr"){
echo utf8_encode ($row['distancia_fr']);
}
else {
echo utf8_encode($row['distancia_en']);
}
Este código es, primero más eficiente, puesto que en término medio se realizan menos comparaciones y segundo, totalmente completo: no quedan casos por resolver. Si es español se muestra una variable, si es francés, otra, y en TODOS los demás casos se muestra en inglés.
Perfecto David, es correcto como dices en este caso, pero aparte de esto tengo estas variables entre otras
[url=http://www.todoexpertos.com/mitodoexpertos/finish/pisos_detall.php?id=<?php echo $row['id']
[/url]
<script type="text/javascript" src="js/calendar_<?php echo $lg ?>.js" </script>
<!--p<br-->
if($lg=="es" & $row['cocina']=="S"){
echo "Si";
}else if($lg=="es" & $row['cocina']=="N"){
echo "No";
}
if($lg=="en" & $row['cocina']=="S"){
echo "Yes";
}else if($lg=="en" & $row['cocina']=="N"){
echo "No";
}
if($lg=="fr" & $row['cocina']=="S"){
echo "Oui";
}else if($lg=="fr" & $row['cocina']=="N"){
echo "Non";
}
?>
<a href="pisos_detall.php?id=<?php echo $row['id']; ?>&lg=<?php echo $lg;?>
¿Cómo podría solucionar estas variables?
Gracias de nuevo
Gabi

En el caso de tener otras condiciones aparte del idioma las puedes anidar. En lugar de:
if($lg=="es" & $row['cocina']=="S"){
echo "Si";
}else if($lg=="es" & $row['cocina']=="N"){
echo "No";
}
if($lg=="en" & $row['cocina']=="S"){
echo "Yes";
}else if($lg=="en" & $row['cocina']=="N"){
echo "No";
}
if($lg=="fr" & $row['cocina']=="S"){
echo "Oui";
}else if($lg=="fr" & $row['cocina']=="N"){
echo "Non";
}
deberías poner:
if($lg=="es") {
if ($row['cocina']=="S"){
echo "Si";
}elseif ($row['cocina']=="N"){
echo "No";
}
}
elseif($lg=="fr") {
if ($row['cocina']=="S"){
echo "Oui";
}else if($row['cocina']=="N"){
echo "Non";
}
}
else {
if ($row['cocina']=="S"){
echo "Yes";
}else if($row['cocina']=="N"){
echo "No";
}
}
Muchas gracias David.Me estas ayudando mucho
El kid de la cuestión es el pase de variables por GET con
<a href="pisos_detall.php?id=<?php echo $row['id']; ?>&lg=<?php echo $lg;?>">
Pues la página pisos_detall recoge la variable del idioma
Como puedo hacer para que $lg si el visitante no es ni en ni es ni fr sea igual a en para que pisos_detall recoja esta variable
Gracias de nuevo
Gabi
Si pones los condicionales de la manera que hemos establecido, no importa que la variable lg valga it o pl, puesto que si no vale es o fr siempre tiene salida correcta en inglés.
De todas formas, si te interesa que adopte ese valor, pues asígnaselo al principio de la página:
<?php
if ($_GET["lg"] == "es" || $_GET["lg"] == "fr")
 $lg = $_GET["lg"];
else
 $lg = "en";
?>
Muchas gracias por tu estimable ayuda David.
Al final lo solucioné simplemente colocando en el archivo idiomas.php:
$lg="en"; dentro del default
De esta manera todo idioma que no fuera ninguno de los 3 salia en inglés cosa que sin esta variable salia en inglés sólo las variables contenidas en el include del idioma (lang_en.php) pero extrañamente las variables procedentes de la base de datos que era mi problema, no.
Un saludo y gracias de nuevo
Gabi

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas