Foros del Web » Programando para Internet » PHP »

Web multi-idioma usando "session_start();"

Estas en el tema de Web multi-idioma usando "session_start();" en el foro de PHP en Foros del Web. Buenas. Estoy liado con el tema de cambiar el cuerpo de texto de mi web en varios, antes tenia una pagina por cada idioma, y ...
  #1 (permalink)  
Antiguo 15/10/2012, 06:22
 
Fecha de Ingreso: junio-2012
Mensajes: 80
Antigüedad: 11 años, 10 meses
Puntos: 11
Pregunta Web multi-idioma usando "session_start();"

Buenas.

Estoy liado con el tema de cambiar el cuerpo de texto de mi web en varios, antes tenia una pagina por cada idioma, y claro cada vez que tenia que editar algo tenia que editar en muchos documentos, asi que pense en sustituir el cuerpo de texto por variables y en funcion del idioma que pusiera un contenido u otro. Todo eso fue facil, el problema ha llegado cuando quiero guardar el valor de una variable "$idioma" dentro de una sesion para cuando el usuario valla a otra pagina conserve el valor del idioma elegido.

La pagina adquiere por un lado el idioma por defecto de su navegador usando

Código PHP:
Ver original
  1. $lang = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
  2. $languages = strtolower($lang);
  3. $languages = str_replace( ' ', '', $languages );
  4. $languages = explode( ",", $languages );
  5. $idioma = $languages[0];

Eso me devuelve valores tipo: "es", "es-es", "en-us", "en"... Que luego uso para cambiar el valor de una variable $idioma que introduzco en una funcion con un switch donde tengo almacenados los textos en distintos idiomas.

Y luego tengo un menu que es en realidad un formulario que permite cambiar el valor de la variable a otro idioma (con estilos css para que parezca un menu de botones).

Código HTML:
Ver original
  1. <form method="post">
  2.    <input hidden="true" type="text" value="fr" name="languages" />
  3.    <input class="fr" type="submit" value="Fran&ccedil;aise" />
  4. </form>
  5.  
  6. <form method="post">
  7.   <input hidden="true" type="text" value="es" name="languages" />
  8.   <input class="es" type="submit" value="Español" />
  9. </form>
Hay varios idiomas mas, pero con eso os haceis una idea.

Y recojo al final todo de la siguiente forma:

Código PHP:
Ver original
  1. <?php
  2.     require ('idiomas.php');
  3.     if ($_POST) {
  4.         $idioma = $_POST["languages"];
  5.     }elseif ($_GET){
  6.         $idioma = $_GET["languages"];
  7.     }else{
  8.         $lang = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
  9.         $languages = strtolower($lang);
  10.         $languages = str_replace( ' ', '', $languages );
  11.         $languages = explode( ",", $languages );
  12.         $idioma = $languages[0];
  13.     }        
  14. ?>

Hasta aquí todo funciona perfectamente.

Mi problema empieza aquí, como combino esto con las sesiones para guardar el valor de la variable y que anule todo eso si el valor ya ha sido almacenado en la variable idioma desde la pagina de procedencia.

Pense en algo asi, pero no funciona (del todo):

Código PHP:
Ver original
  1. <?php
  2.         require ('idiomas.php');
  3.         session_start();
  4.        
  5.         if(isset($_SESSION['language'])){
  6.             if ($_POST){
  7.                 $_SESSION['language'] = $_POST["languages"];
  8.                 $idioma = $_SESSION['language'];
  9.             }elseif ($_GET){
  10.                 $_SESSION['language'] = $_GET["languages"];
  11.                 $idioma = $_SESSION['language'];
  12.             }else{
  13.                 $idioma = $_SESSION['language'];
  14.             }
  15.         }else{
  16.             if ($_POST){
  17.                     $idioma = $_POST["languages"];
  18.                     $_SESSION['language'] = $idioma;
  19.             }elseif ($_GET){
  20.                     $idioma = $_GET["languages"];
  21.                     $_SESSION['language'] = $idioma;
  22.             }else{
  23.                     $lang = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
  24.                     $languages = strtolower($lang);
  25.                     $languages = str_replace( ' ', '', $languages );
  26.                     $languages = explode( ",", $languages );
  27.                     $idioma = $languages[0];
  28.                     $_SESSION['language'] = $idioma;
  29.             }
  30.         }
  31.     ?>

Lo máximo que he sacado así es que si me voy a otra pagina vuelva a salir por defecto el idioma y no guarde el valor de la variable, peeeero si en la pagina de destino cambio el idioma y vuelvo al index.php si que me guarda el idioma que tenia... Osease me funciona desde la otra web al index pero no del index a otra web y siempre y cuando una vez en la web de destino modifique el idioma denuevo para volver a la anterior.

No paro de probar y probar pero no sale nada... A ver si me podeis hechar un cable.

PD: una forma de sacar esto fue poner una url dinamica en el menu en funcion del idioma, eso si funciono, pero me generaba URLs muy feas... Así que me gustaria hacerlo de esta forma.

PDD: no puedo o no consigo que mi proveedor active o haga funcionar el mod_rewrite para enmascar las URLs de forma amigable asi que solo me queda esto creo .
  #2 (permalink)  
Antiguo 15/10/2012, 07:20
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: Web multi-idioma usando "session_start();"

lo que no entiendo es que si ya teniendo una variable se sesión establecida con el lenguaje, vuelves a preguntar si hay GET o POST, recuerda que en todo tu sistema pasarás parámetros sea por GET o POST y tendrás un lío si lo tienes de ésa forma, lo que debes hacer es preguntar si explícitamente el usuario ha pedido cambio de idioma, es decir:

Código PHP:
Ver original
  1. if ( isset($_GET['language']) ){ //especificamente contra $_GET['language'] NO todos los get
  2.     //cambiar idioma
  3. }
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 15/10/2012, 08:24
 
Fecha de Ingreso: junio-2012
Mensajes: 80
Antigüedad: 11 años, 10 meses
Puntos: 11
Respuesta: Web multi-idioma usando "session_start();"

Vale ya vi lo que me decias, ahora funciona bien. THX

Era hacer esto ¿no?

Código PHP:
Ver original
  1. <?php
  2.         require ('idiomas.php');
  3.         session_start();
  4.        
  5.         if (isset($_GET['languages'])){
  6.             $idioma = $_GET['languages'];
  7.             $_SESSION['languages'] = $idioma;
  8.         }elseif (isset($_POST['languages'])){
  9.             $idioma = $_POST['languages'];
  10.             $_SESSION['languages'] = $idioma;
  11.         }elseif (isset($_SESSION['languages'])){
  12.             $idioma= $_SESSION['languages'];
  13.             $_SESSION['languages'] = $idioma;
  14.         }else{
  15.             $lang = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
  16.             $languages = strtolower($lang);
  17.             $languages = str_replace( ' ', '', $languages );
  18.             $languages = explode( ",", $languages );
  19.             $idioma = $languages[0];
  20.         }
  21.     ?>

Última edición por noruas; 15/10/2012 a las 08:32
  #4 (permalink)  
Antiguo 15/10/2012, 08:38
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: Web multi-idioma usando "session_start();"

exacto, porque sólo revisas si se pide el cambio de idioma, no todo lo demás, +karma por aplicar correctamente las indicaciones, saludos

aunque el
isset($_SESSION['languages']) está demás, no hace falta porque si la variable de sesión fue establecida, es innecesario re-establecerla, simplemente verifica si no está establecida y aplicas lo del bloque else:

Código PHP:
Ver original
  1. <?php
  2.         require ('idiomas.php');
  3.         session_start();
  4.        
  5.         if (isset($_GET['languages'])){
  6.             $idioma = $_GET['languages'];
  7.             $_SESSION['languages'] = $idioma;
  8.         }elseif (isset($_POST['languages'])){
  9.             $idioma = $_POST['languages'];
  10.             $_SESSION['languages'] = $idioma;
  11.         }elseif (! isset($_SESSION['languages'])){ //fíjate en el NOT (!)
  12.             $lang = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
  13.             $languages = strtolower($lang);
  14.             $languages = str_replace( ' ', '', $languages );
  15.             $languages = explode( ",", $languages );
  16.             $idioma = $languages[0];
  17.             $_SESSION['languages'] = $idioma; //aquí aplicamos
  18.         }
  19. ?>

y si optimizamos el código que se repite:

Código PHP:
Ver original
  1. <?php
  2.         require ('idiomas.php');
  3.         session_start();
  4.         $idioma;
  5.        
  6.         if (isset($_GET['languages'])){
  7.             $idioma = $_GET['languages'];
  8.         }elseif (isset($_POST['languages'])){
  9.             $idioma = $_POST['languages'];
  10.         }elseif (! isset($_SESSION['languages'])){ //fíjate en el NOT (!)
  11.             $lang = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
  12.             $languages = strtolower($lang);
  13.             $languages = str_replace( ' ', '', $languages );
  14.             $languages = explode( ",", $languages );
  15.             $idioma = $languages[0];
  16.         }
  17.         //aquí aplicamos:
  18.         $_SESSION['languages'] = $idioma;
  19. ?>
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...

Última edición por maycolalvarez; 15/10/2012 a las 08:48
  #5 (permalink)  
Antiguo 15/10/2012, 09:01
 
Fecha de Ingreso: junio-2012
Mensajes: 80
Antigüedad: 11 años, 10 meses
Puntos: 11
Respuesta: Web multi-idioma usando "session_start();"

Magnifico, ahora si esta perfecto del todo ^^.
  #6 (permalink)  
Antiguo 15/10/2012, 23:07
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: Web multi-idioma usando "session_start();"

Lamento meter mi "cuchara" ajaja, pero, no se supone @maycolalvarez que en caso de no cumplir ninguna (vamos ya esta definido $_SESSION['languages']) se sobre escribirá $_SESSION['languages'] como "vacía" ya que la variable $idioma esta vacía (no entro en ninguna condicional, por lo tanto no se define su valor)?

Yo lo haría mas bien de esta forma...

Código PHP:
Ver original
  1. require ('idiomas.php');
  2.  
  3. if (!isset($_SESSION['languages'])) {
  4.      $idioma = '';
  5.      if (isset($_GET['languages']) || isset($_POST['languages'])) {
  6.           $idioma = isset($_GET['languages']) ? $_GET['languages'] : $_POST['languages'];
  7.      }
  8.  
  9.      if (empty($idioma)) {
  10.             $lang = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
  11.             $languages = strtolower($lang);
  12.             $languages = str_replace( ' ', '', $languages );
  13.             $languages = explode( ",", $languages );
  14.             $idioma = $languages[0];
  15.      }
  16.  
  17.      $_SESSION['languages'] = $idioma;
  18. }
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #7 (permalink)  
Antiguo 16/10/2012, 05:09
 
Fecha de Ingreso: junio-2012
Mensajes: 80
Antigüedad: 11 años, 10 meses
Puntos: 11
Respuesta: Web multi-idioma usando "session_start();"

Si bueno, ese error lo vi en cuanto puse el codigo, simple error de sintaxis.
  #8 (permalink)  
Antiguo 16/10/2012, 09:43
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: Web multi-idioma usando "session_start();"

@Nemutagk en efecto, hay muchas formas , simplemente edité el código al 'vuelo' sin probarlo, usualmente y por experiencia no hace falta probarlo (y francamente probar todos los códigos de cada usuario consume tiempo) por el cual se espera que el usuario lo pruebe (es a el usuario quien le interesa ¿no?) y te indique que no le funcionó, o que no lo hace como espera, ese es el feedback que le pone sazón al foro

ciertamente puedes "meter tu cuchara" o tener vela en todos los entierros, el foro es libre y no está demás una opinión extra, otro cerebro más, quien quita que te nominen a colaborador

saludos y esperamos tus colaboraciones en el foro, es dar y recibir, sea de quien sea
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...

Etiquetas: formulario, multi-idioma, usando, variables, usuarios
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 19:03.