Foros del Web » Programando para Internet » PHP »

Problema priorizando variables

Estas en el tema de Problema priorizando variables en el foro de PHP en Foros del Web. Tengo una web multilingue que usa cookies para almacenar la variable de idioma. Quiero poder cambiar de idioma a traves de links y de formularios, ...
  #1 (permalink)  
Antiguo 07/01/2003, 03:25
Avatar de Cain  
Fecha de Ingreso: enero-2002
Ubicación: Catalunya
Mensajes: 6.459
Antigüedad: 22 años, 10 meses
Puntos: 17
Problema priorizando variables

Tengo una web multilingue que usa cookies para almacenar la variable de idioma.

Quiero poder cambiar de idioma a traves de links y de formularios, mediante una variable llamada $idioma que reescriba la cookie.

Para poder lograr esto, necesito crear una estructura if/elseif/else donde busque la variable idioma en la URL, en FORM y en Cookie.

El problema es que no sé como hacerlo

De momento, el código que tengo desarrollado es el siguiente:

Código PHP:
<?
# URL
if (isset($_URL["idioma"])){$idioma $idioma;setcookie ("idioma"$idiomatime()+(3600*24-30));}
# Form
elseif (isset($_POST["idioma"])){$idioma $idioma;setcookie ("idioma"$idiomatime()+(3600*24-30));}
# Cookie
elseif (isset($_COOKIE["idioma"])){$idioma $idioma;setcookie ("idioma"$idiomatime()+(3600*24-30));}
# Default
else {$idioma "es";setcookie ("idioma"$idiomatime()+(3600*24-30));}
?>
No da errores, pero tampoco funciona
__________________
M a l d i t o F r i k i
  #2 (permalink)  
Antiguo 07/01/2003, 05:10
 
Fecha de Ingreso: septiembre-2001
Ubicación: Monterrey
Mensajes: 663
Antigüedad: 23 años, 1 mes
Puntos: 6
Hmmm.. bueno no se, es tu script pero creo que seria mejor si guadaras ese valor en una sesion y de esta manera seria mas facil de controlar lo que quieres hacer, una forma de optener el "idioma" es recuperando las variables de ambiente 'HTTP_ACCEPT_LANGUAGE' y 'HTTP_USER_AGENT'
La cuales envian salidas tipicas como las siguientes.
Código PHP:
echo $_SERVER['HTTP_USER_AGENT']; //devuelve, Mozilla/4.5 [en] (X11; U; Linux 2.2.9
echo $_SERVER['HTTP_ACCEPT_LANGUAGE']// devuelve, en 
Solamente basta con que analises ambas o una y determines a partir de esa informacion que valor le daras a $idioma paar almacenarla en una session o si prefieres en una cookie.
  #3 (permalink)  
Antiguo 07/01/2003, 05:26
Avatar de Cain  
Fecha de Ingreso: enero-2002
Ubicación: Catalunya
Mensajes: 6.459
Antigüedad: 22 años, 10 meses
Puntos: 17
Eso me sirve para almacenar la cookie la primera vez, pero no me sirve para los cambios de idioma

De momento lo que hago es llamar a un script que reescribe la cookie y me redirecciona, pero pienso que la rutina que indico en el post inicial (si funcionara ) sería más funcional.

El problema es que estoy "traduciendo" una serie de códigos de Cold Fusion a PHP, y con Cold Fusion lo hacía de ese modo.

Si en PHP no se puede hacer como lo hacía antes, pues nada, a buscarse otro sistema
__________________
M a l d i t o F r i k i
  #4 (permalink)  
Antiguo 07/01/2003, 07:06
 
Fecha de Ingreso: septiembre-2001
Ubicación: Monterrey
Mensajes: 663
Antigüedad: 23 años, 1 mes
Puntos: 6
Ya caigo en cuenta!!!!

Perdon cain, la primera vez creo que no preste suficiente atencion a tu mensaje he hay la disculpa.

Bien para comenzar en tu codigo tienes un pequeño problema y es qu easignas el valor de las variables asi mismas mas exactamente en esta seccion:
Código PHP:
if (isset($_POST["idioma"])){[B]$idioma $idioma[/B];setcookie ("idioma"$idiomatime()+(3600*24-30));} 
Primero verificas que la variable $_* este definida y despues haces una asignacion a que puede tener dos resultados a simple vista que si ya esta definida se asigna asi misma y si no deviera lanzar un Notice diciendote que la asiganacion no esta definida. lo que puedes hacer es algo como esto.
Código PHP:
if (isset($_POST["idioma"])){[B]$idioma $_POST['idioma'][/B];setcookie ("idioma"$idiomatime()+(3600*24-30));} 
De esta forma asignas a hora si el valor que venia en el metodo POST, otra forma puede ser como te comente usando sesiones o cookies si prefieres.
ejemplo:
1.- Asignas valor a la sesion en tu archivo de inicio.
Código PHP:
session_start();
if( !isset( 
$_SESSION['idioma'] ) )
{
    
$_SESSION['idioma'] = $_SERVER['HTTP_ACCEPT_LANGUAGE'];

2.- en cada una de tus paginas agrgas la siguinte funcion:
Código PHP:
function setear_idioma( &$actual )
{
    if( isset( 
$_GET[idioma] ) )
    {
        
$actual $_GET[idioma];
    }
    elseif ( isset( 
$_POST[idioma] ) )
    {
        
$actual $_POST[idioma];
    }
    else
    {
        
$actual 'es';
    }

3.- y por ultimo solo la mandas a llamar en cada pagina en la qu ela necesites.
Código PHP:
session_start();
setear_idioma$_SESSION['idioma'] ); 
si necesitas usar la variable solo la mandas a llamar despues de la funcion donde la necesites:
Código PHP:
echo $_SESSION['idioma']; 
con eso haces el cambio en forma dinamica. hmmm a un que viendolo bien si te das cuenta hace lo mismo que tus if-else, hmmmm bueno pues queda de ejemplo de como podemos hacer lo mismo de varias formas....
  #5 (permalink)  
Antiguo 07/01/2003, 09:02
Avatar de Cain  
Fecha de Ingreso: enero-2002
Ubicación: Catalunya
Mensajes: 6.459
Antigüedad: 22 años, 10 meses
Puntos: 17
De acuerdo perfecto!!!

Tienes toda la razón, ahora mismo implanto ese código. No me había dado cuenta que estaba asignando todo el rato $idioma = $idioma


Muchas gracias
__________________
M a l d i t o F r i k i
  #6 (permalink)  
Antiguo 07/01/2003, 17:31
Avatar de BVis  
Fecha de Ingreso: noviembre-2002
Ubicación: Barcelona
Mensajes: 104
Antigüedad: 22 años
Puntos: 0
Bueno, eso mismo hice yo hace un tiempo, y ésta fue mi técnica:

En cualquier página del sitio miro lo siguiente:

Código PHP:
// Si no está establecida la cookie del idioma...
if (!isset($_COOKIE['idioma_por_defecto']))
   
$id_idioma=substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);
else 
// Si está...
   
$id_idioma=$_COOKIE['idioma_por_defecto'];

// Establecemos un IDIOMA POR DEFECTO, si el idioma del
// browser, no coincide con ninguno de los 'soportados'
if ($id_idioma!="es" && $id_idioma!="en" && $id_idioma!="fr")
   
$id_idioma="en"
Y en en un lugar de la página de cuyo nombre no quiero
acordarme:
Código PHP:
        <a href="principal.php?idioma_cookie=es"><img src="imagenes/spain.gif" border=0 target="principal"></a>
        <
a href="principal.php?idioma_cookie=en"><img src="imagenes/greatbritain.gif" border=0 target="principal"></a>
        <
a href="principal.php?idioma_cookie=fr"><img src="imagenes/france.gif" border=0 target="principal"></a
Ese es el lugar donde muestro las banderitas con diferentes idiomas. Al ser pulsadas esas banderitas, en el 'principal.php' hago:

Código PHP:
if (isset($_GET['idioma_cookie'])) {
   
// Cookie con caducidad a las 1000 horas, que son unas cuantas...
   
setcookie("idioma_por_defecto",$_GET['idioma_cookie'],time()+3600000);
   
header("Location: index.html");
   exit(
0);

En este caso, el sitio está hecho para tres idiomas, el inglés, el francés y el castellano, es facilmente generalizable para otros. Tan solo habría que modificar la parte donde se escoge el idioma por defecto entre los 'soportados'.

1 Saludo.
__________________
"Yo opino lo mismo que BVis, el de 'forosdelweb' " - Bill Gates
  #7 (permalink)  
Antiguo 07/01/2003, 17:35
Avatar de BVis  
Fecha de Ingreso: noviembre-2002
Ubicación: Barcelona
Mensajes: 104
Antigüedad: 22 años
Puntos: 0
Un apunte:

En lugar de esto:
Código PHP:
function setear_idioma( &$actual )
{
    if( isset( 
$_GET[idioma] ) )
    {
        
$actual $_GET[idioma];
    }
    elseif ( isset( 
$_POST[idioma] ) )
    {
        
$actual $_POST[idioma];
    }
    else
    {
        
$actual 'es';
    }

no es mejor usar:
Código PHP:
function setear_idioma( &$actual )
{
    if( isset(
$_REQUEST['idioma'] ) )
        
$actual $_REQUEST['idioma'];
    else
        
$actual 'es';

Por otro lado, otra recomendación:

usar $_REQUEST[idioma] en lugar de $_REQUEST['idioma'] provoca un "notice" de PHP, que es más o menos equivalente a un Warning de C.

1 Saludo.
__________________
"Yo opino lo mismo que BVis, el de 'forosdelweb' " - Bill Gates
  #8 (permalink)  
Antiguo 08/01/2003, 16:21
 
Fecha de Ingreso: septiembre-2001
Ubicación: Monterrey
Mensajes: 663
Antigüedad: 23 años, 1 mes
Puntos: 6
Código PHP:
function setear_idioma( &$actual )
{
    if( isset(
$_REQUEST['idioma'] ) )
        
$actual $_REQUEST['idioma'];
    else
        
$actual 'es';

Es mejor por comodidad y estitca y por que puede llegar a ser mas claro por decirlo de alguna manera, pero de hay ah de decir que es mejor como implementacion habria que analizarlo, ya que el REQUEST pone a disposicion del escript todas las variables porporcionadas por cualquier mecanismo de entrada del usuario, como lo son el POST,GET,COOKIE,SESSION por lo que limita el control de esos datos, los cuales se pueden convertir en no confiables, tal vez para el caso que estamos comentando en este mensaje sirva. Pero tendrias que controlar lo que te llega y alguna forma para reducir posibles problemas de seguridad.
Como quiera el caso real era proporcionar una idea de como hacer algo no de como implementarlo al 100%.

Por cierto gracias por recalcarme que puse indices de arreglos asociativos sin comillas.
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




La zona horaria es GMT -6. Ahora son las 21:27.