Foros del Web » Programando para Internet » PHP »

Multidioma no funciona al volver a inicio

Estas en el tema de Multidioma no funciona al volver a inicio en el foro de PHP en Foros del Web. Hola a todos. Intento hacer una pagina con php en VARIOS IDIOMAS . El código me funciona perfectamente excepto cuando, utilizando el menú, regreso a ...
  #1 (permalink)  
Antiguo 02/07/2008, 14:45
Avatar de kayaker  
Fecha de Ingreso: diciembre-2007
Ubicación: Estepona
Mensajes: 14
Antigüedad: 16 años, 4 meses
Puntos: 0
Pregunta (RESUELTO) Multidioma no funciona al volver a inicio

Hola a todos.
Intento hacer una pagina con php en VARIOS IDIOMAS.
El código me funciona perfectamente excepto cuando, utilizando el menú, regreso a la página de INICIO (index.php), entonces el idioma seleccionado (lo selecciono con las típicas banderitas) se deselecciona y vuelve al idioma por defecto ('es').
Me gustaría que se pudiera navegar por cualquier página de mi web en el idioma seleccionado, y que éste no se deseleccionara hasta que se lo indique el usuario, clickeando en la banderita correspondiente.
A ver si alguno de vosotros me indica una sugerencia. Yo ya no sé qué intentar. No sé dónde pueda estar el fallo.

Este es el código que utilizo:

Código PHP:
session_start();
$_SESSION['lang'] = $_COOKIE['lang']; 
if(isset(
$_GET['lang'])){  // este es el ? que va con las banderitas y que puede valer "en" o "es"
    
$_SESSION['lang'] = $_GET['lang']; 
    
setcookie("lang"$_SESSION['lang'], time() + (84600 30)); 
    } 
if (empty(
$_SESSION['lang']))  {
    
$_SESSION['lang'] = 'es';  // el valor por defecto
}
@include_once(
$_SESSION['lang']."_idioma".EX); // los idiomas los tengo en 2 archivos php "es_idioma.php" y "en_idioma.php".
// EX es una constante que equivale a la extensión "php". 
Y este es el código que pone las banderitas:

Código PHP:
<a href="index.php?lang=<?php echo 'es'?>"><img border="0" src="spa.gif"></a> <a href="index.php?lang=<?php echo 'en'?>"><img border="0" src="eng.gif"></a>
Saludos a todos

Última edición por kayaker; 08/07/2008 a las 05:54
  #2 (permalink)  
Antiguo 03/07/2008, 08:55
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Multidioma no funciona al volver a inicio

¿por qué usás COOKIE y SESSION? Se me hace bastante raro, creo que deberías elegir 1 de los 2 métodos. Así el código sería más claro y los problemas más fáciles de entender.
Estás haciendo una mezcla entre GET, COOKIE y SESSION que se hace complicada de entender.


Saludos.
  #3 (permalink)  
Antiguo 03/07/2008, 18:26
Avatar de kayaker  
Fecha de Ingreso: diciembre-2007
Ubicación: Estepona
Mensajes: 14
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Multidioma no funciona al volver a inicio

Gracias Alvlin
Tienes razón, he copiado el código del foro y eso de mezclar COOKIES con GETS y SESSIONS es bastante complicado para mi.
De modo que he copiado este otro:
Código PHP:
session_start();
$lang $_SESSION['lang'];
if( !
$lang $lang "es";
$_SESSION['lang'] = $lang;
include( 
'lang/' $lang EX ); // los archivos include (es.php) y (en.php) estan en la carpeta lang
if( !empty( $_POST['lang'] ) ) {
$_SESSION['lang'] = $_POST['lang'];

En las banderitas he cambiado index.php por S_SERVER['PHP_SELF'], porque me devolvia a inicio cada vez que hacía click en la banderita:

Código PHP:
<a href="<?$_SERVER['PHP_SELF']?>?lang=<?php echo 'es'?>"><img border="0" src="spa.gif"></a> <a href="<?$_SERVER['PHP_SELF']?>?lang=<?php echo 'en'?>"><img border="0" src="eng.gif"></a>
Sin embargo el funcionamiento es similar: navego perfectamente por mi web en el idioma seleccionado hasta que en el menu clickeo inicio. Entonces la página vuelve al castellano por defecto. No mantiene la opción en la que me movía. De alguna manera la opcion no se mantiene llegado a ese punto, pero no tengo ni idea de porqué. ?????? ¿Alguna sugerencia?

Gracias
  #4 (permalink)  
Antiguo 03/07/2008, 19:55
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Multidioma no funciona al volver a inicio

Ahora se entiende más cómo debe funcionar.

Código PHP:
session_start();
// la segunda y tercera línea del código que pegaste hace lo mismo que las 4 líneas
// a continuación, pero esto es más claro 
if (isset($_SESSION['lang'])) {
    
$lang $_SESSION['lang']; 
} else {
    
$lang 'es';
}

include( 
'lang/' $lang EX ); // los archivos include (es.php) y (en.php) estan en la carpeta lang 

if( !empty( $_GET['lang'] ) ) { 
    
$_SESSION['lang'] = $_GET['lang']; 

Por otro lado, tal y como lo estás usando la última comprobación debe ser con GET, no POST. Fíjate que también lo cambié con respecto a tu código original.

Si ahora no te funciona, lo único que se me ocurre es que no estés llamando a session_start en la página de inicio...

Sería bueno que agregaras estas líneas

Código PHP:
session_start();
var_dump($_SESSION);
exit; 
en la página donde no te funciona, para así ver con más claridad qué es lo que sucede.


Saludos.

Última edición por AlvaroG; 04/07/2008 a las 09:57
  #5 (permalink)  
Antiguo 04/07/2008, 08:44
Avatar de kayaker  
Fecha de Ingreso: diciembre-2007
Ubicación: Estepona
Mensajes: 14
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Multidioma no funciona al volver a inicio

Gracias Alvlin,

He supuesto que el segundo $_POST era también un $_GET.
He introducido los cambios que me dices y el comportamiento que te describía ha desaparecido. La opción se mantiene!!!

Pero.... Ahora el click de las banderitas no actua con el primer click... sino con un segundo click. Hasta que no doy un segundo click, no cambia de idioma (y no me refiero a un doble-click, sino a hacer click 2 veces) !!!!

No comprendo el proceso. ¿Alguien sabe a qué puede deberse? ¿Alguna idea?

Gracias de nuevo
  #6 (permalink)  
Antiguo 04/07/2008, 10:08
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Multidioma no funciona al volver a inicio

Sí, en realidad mencioné que lo había cambiado pero olvidé hacerlo. Volvé a fijarte en el código que pegué antes y ahora sí lo dejé como debería ser.

No me había fijado antes, pero hay un problema de orden en el código. Es lógico el comportamiento que describís:
La primera vez que hacés clic, aún no existe $_SESSION['lang'] (o está como "es")

el caso es que primero se incluye el archivo y DESPUÉS se asigna el nuevo valor pasado por GET a la variable de sesión.

A ver si ahora sí queda

Código PHP:
session_start(); 

if (isset(
$_GET['lang'])) {
    
// el valor que tiene prioridad es el de GET, por eso se asigna de entrada
    
$_SESSION['lang'] = $_GET['lang'];
} elseif ( !isset(
$_SESSION['lang']) ) {
    
// si no tengo la variable GET ni la de sesión, creo la variable de sesión 
    // con el valor por defecto.
    
$_SESSION['lang'] = "es";
}

// para terminar, sin importar el caso, defino $lang con el valor de la variable de sesión
// en este punto podrías quitar la variable $lang y usar siempre $_SESSION['lang']
$lang $_SESSION['lang'];

include( 
'lang/' $lang EX ); 
Ya que estamos en esto yo le agregaría algo de seguridad: cambiar el primer IF por:

Código PHP:
$idiomas = array('es''en');
if ( isset(
$_GET['lang']) AND in_array($_GET['lang'], $idiomas) ) {
...

Esto aseguraría que solamente se acepta el "nuevo" idioma si la variable contiene es, o en.
Y te lo haría más fácil si en el futuro por algún motivo quisieras agregar otro idioma.


Saludos.
  #7 (permalink)  
Antiguo 08/07/2008, 05:51
Avatar de kayaker  
Fecha de Ingreso: diciembre-2007
Ubicación: Estepona
Mensajes: 14
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: (RESUELTO) Multidioma no funciona al volver a inicio

Como la seda... Problema resuelto.
Gracias alvlin, así da gusto meterse en el mundillo este del PHP.

Creo que del tema podría salir un buen artículo para el foro para todo el que quiera hacer una web multiidiomas con include.
Tan solo le faltaría al artículo añadir cómo se referencia el texto que se quiere introducir, que yo lo hago así:

Código PHP:
<?=texto("departamento",1)?>
Y el contenido de los archivos de idioma, que es este el que yo pongo en es.php:

Código PHP:
function texto($palabras "hubounerror"$tipo "1"){
    global 
$frase;
    if( !isset(
$frase[$palabras]) || $frase[$palabras] == ""){
        if(
$tipo "1"){
            return 
$palabras;
        }
        else{
            echo 
$palabras;
        }
    }
    else{
        if(
$tipo "1"){
            return 
$frase[$palabras];
        }
        else{
            echo 
$frase[$palabras];
        }
    }
}
$frase['actualizar'] = "Actualizar";
$frase['accesobloqueado'] = "¡Su Acceso va a ser Bloqueado!";
$frase['admin'] = "Admin.";
$frase['administracion'] = "Administration"// y así hasta el final... 
Yo he complicado un poco la funcion texto(), pero seguro que se puede hacer de manera más simple.

Con en.php se haría igual pero con los términos en inglés.

Saludos y gracias de nuevo.
  #8 (permalink)  
Antiguo 27/07/2008, 18:57
Avatar de nicolyto77  
Fecha de Ingreso: marzo-2007
Ubicación: Buenos Aires
Mensajes: 782
Antigüedad: 17 años, 1 mes
Puntos: 12
Pregunta Respuesta: Multidioma no funciona al volver a inicio

Holas

Perdon por la antiguedad del mensaje, pero no he podido realizar lo de este articulo.
Resulta que necesito mi web en varios idiomas, entonces, estoy siguiendo esos pasos, aunke no hay caso.

Estoy haciendo una prueba sencilla, para luego adaptarlo a mi Web, y tengo 4 archivos de tests:

/test_index.php
/test_downloads.php
lang/es.php
lang/en.php

En el INDEX tengo esto:

Código PHP:
<?php session_start(); 

if (isset(
$_GET['lang'])) {
    
// el valor que tiene prioridad es el de GET, por eso se asigna de entrada
    
$_SESSION['lang'] = $_GET['lang'];
} elseif ( !isset(
$_SESSION['lang']) ) {
    
// si no tengo la variable GET ni la de sesión, creo la variable de sesión 
    // con el valor por defecto.
    
$_SESSION['lang'] = "es";
}

// para terminar, sin importar el caso, defino $lang con el valor de la variable de sesión
// en este punto podrías quitar la variable $lang y usar siempre $_SESSION['lang']
$lang $_SESSION['lang'];

include( 
'lang/' $lang EX ); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Index</title>
<style type="text/css">
<!--
.Estilo1 {
    color: #FF0000;
    font-weight: bold;
}
-->
</style>
</head>

<body>
<p><a href="<? $_SERVER['PHP_SELF']?>?lang=<?php echo 'es'?>">Español</a> <a href="<?$_SERVER['PHP_SELF']?>?lang=<?php echo 'en'?>">Ingles</a></p>
<p class="Estilo1">Inicio</p>
<p><?=texto("BLOQUEADO",1)?></p>
<p>Entra a tu Panel Gil!</p>
<p>&nbsp;</p>
</body>
</html>
En el Descargas tambien, lo mismo. Solo cambie el BLOQUEADO

Y en uno de los dos idiomas, para no abundar, tengo esto:

Código PHP:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ES</title>
</head>

<body>
<?php
function texto($palabras "hubounerror"$tipo "1"){
    global 
$frase;
    if( !isset(
$frase[$palabras]) || $frase[$palabras] == ""){
        if(
$tipo "1"){
            return 
$palabras;
        }
        else{
            echo 
$palabras;
        }
    }
    else{
        if(
$tipo "1"){
            return 
$frase[$palabras];
        }
        else{
            echo 
$frase[$palabras];
        }
    }
}
$frase['BIENVENIDO'] = "Hola, Bienvenido al sitio";
$frase['BLOQUEADO'] = "¡Su Acceso va a ser Bloqueado!";
$frase['ADMIN'] = "Admin.";
$frase['ADMINISTRACION'] = "Administracion General";
?>
</body>
</html>
La verdad que no me sale, me tira muchos errores, desde el enlace que me dice que no tengo acceso a '/' como tambien antes de pulsarlo, me da estos errores:

Cita:
Notice: Use of undefined constant EX - assumed 'EX' in E:\Archivos de programa\EasyPHP 2.0b1\www\test_index.php on line 16

Warning: include(lang/enEX) [function.include]: failed to open stream: No such file or directory in E:\Archivos de programa\EasyPHP 2.0b1\www\test_index.php on line 16

Warning: include() [function.include]: Failed opening 'lang/enEX' for inclusion (include_path='.;E:/Archivos de programa/EasyPHP 2.0b1\php5\pear\') in E:\Archivos de programa\EasyPHP 2.0b1\www\test_index.php on line 16

Español Ingles

Inicio

Fatal error: Call to undefined function texto() in E:\Archivos de programa\EasyPHP 2.0b1\www\test_index.php on line 35
Espero que me puedan ayudar un poco, para poder lograr con exito esto, ahi estan los 4 archivos que uso, y toda su estrucutura, nada mas que eso

Saludos y Gracias
__________________
CabaSoft Networks
  #9 (permalink)  
Antiguo 28/07/2008, 15:35
Avatar de nicolyto77  
Fecha de Ingreso: marzo-2007
Ubicación: Buenos Aires
Mensajes: 782
Antigüedad: 17 años, 1 mes
Puntos: 12
Respuesta: Multidioma no funciona al volver a inicio

No tienen ni una pista para tirarme por favor?? Estoy ahogado jeje

Busque otros metodos mientras, pero tampoco me salen, y este esta bien explicado (Esta bien que yo no lo entienda es otra cosa )

Confio en ustedes

Cualquier cosita que me puedan aportar, sera bienvenida y muy valorada, ya que no voy ni para atras ni para adelante...

Saludos
__________________
CabaSoft Networks
  #10 (permalink)  
Antiguo 28/07/2008, 18:51
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Multidioma no funciona al volver a inicio

El error es bastante claro: te falta definir la constante EX, que en el problema original tenía el contenido ".php"

define('EX', '.php');


Saludos.
  #11 (permalink)  
Antiguo 29/07/2008, 00:32
Avatar de nicolyto77  
Fecha de Ingreso: marzo-2007
Ubicación: Buenos Aires
Mensajes: 782
Antigüedad: 17 años, 1 mes
Puntos: 12
De acuerdo Respuesta: Multidioma no funciona al volver a inicio

Holas Alvlin

Muchisimas Gracias!!

LISTO, lo edito y te agradezco muchisimo! Ya funciona de lujo!!!!

No puedo creerlo, pero era un error muy tonto... tanto como no poner el 'ECHO' entre las etiquetas; pensando que era de la otra manera la correcta, pero probando se aprende tambien

Cita:
<?php echo $_SERVER['PHP_SELF'] ?>
Saludos
__________________
CabaSoft Networks

Última edición por nicolyto77; 29/07/2008 a las 00:38 Razón: SOLUCIONADO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 19:02.