I. Introducción
Hace poco he recibido una pregunta en la sección de «Sesiones en PHP«. La pregunta me ha parecido tan interesante que he decidido crear un pequeño artículo explicando su duda e intentando resolverla.
Alguno de vosotros, cuando habéis tenido que crear una página web os habéis encontrado con la necesidad de crearla en diferentes idiomas. Una primera solución, y desde luego no la más eficiente, consiste en crearnos una página por cada uno de los idiomas. Por ejemplo, si tenemos una página «index.php», si tuvieramos tres idiomas, deberíamos crearnos «index_esp.php», «index_eng.php» e «index_ale.php» y cada una escrita en un idioma diferente.
Esta solución, como vosotros podéis ver, es del todo ineficiente. ¡Hagamos un sistema mucho más compacto! Pero… ¿Cómo? Pues la base consiste en el uso de sesiones. Veamos como se hace.
Antes de profundizar en como se desarrollará la aplicación, hay que tener en cuenta todos los elementos que van a formar parte de nuestro sistema:
-
Una variable de sesión que almacene el idioma.
-
Tantas páginas web como idiomas haya con la relación de todas las traducciones necesarias. (Esto se puede suplir usando bases de datos).
-
Un enlace o acceso para que el visitante pueda modificar el idioma.
-
Funciones que gestionen la petición del usuario a la hora de modificar el idioma.
II. ¿Sesiones? ¿Para qué?
Me imagino que muchos de vosotros pensareis: «¿Para qué narices quiero yo usar sesiones? ¿Qué utilidad tienen aquí?». Antes de continuar, para el que no sepa muy bien de que van las sesiones le aconsejo que lea mi artículo o al menos revise las referencias que hago en el.
Pues bien, se usarán las sesiones para almacenar en una variable de sesión el idioma que el visitante ha seleccionado. En el caso de no seleccionar ningún idioma, que se le asigne por defecto el que nosotros prefiramos.
Por ello, en todas las páginas de la web deberemos incluir las variables de sesión…
<?
session_start();session_register(‘idioma_s’);
?>
Esas declaraciones deben encontrarse en todas las páginas donde queramos que se pueda elegir entre varios idiomas. De esta forma tendremos almacenado en todo momento el idioma seleccionado por el visitante y en caso de querer cambiarlo, tener el correspondiente código para hacerlo.
Me explico, el usuario debe ser capaz de poder modificar el idioma en cualquier página web. Cuando lo haga, debe existir un pequeño código que gestione su petición y modifique la variable de sesión a la que el desee.
III. Ficheros de idiomas
¿En qué consiste esto de los ficheros de idiomas? En realidad no es una solución única. Se podría implementar también con bases de datos pero ya que así fue como lo implementé en su momento, se realizará de esta forma.
Consiste en tener tantos ficheros «php» como idiomas haya y en cada uno de estos ficheros incluir una tabla donde se traduzcan todas las frases y palabras de la página web. Un posible esquema podría ser:
$ag = array(
// Título de la pagina:
«titulo_pagina» => «Sessions in PHP»,
// Indice general:
«Indice General» => «Index»,
«Pagina Principal» => «Principal Index»,
…
)
De esta forma, hemos creado una tabla $ag donde, cuando pongamos $ag[«titulo_pagina»] hará referencia a lo que está indicado con la flecha. Si lo que está indicado con la flecha está en un determinado idioma, será lo que muestre por pantalla.
Pues bien, habrá tantos ficheros de este tipo como idiomas queramos implementar. Esta sería la parte más laboriosa pues habría que traducir cada una de las palabras de la página web.
Esto añade una pregunta añadida. ¿Cómo escribo yo ahora en las secciones de mi web? Evidentemente ya no se pueden escribir las palabras tal cual sino haciendo referencia a la tabla $ag. Se ve mucho más claro con un ejemplo:
<p><a href=»index.php» class=»linkmenu»><?echo $ag[«Pagina Principal»];?></a></p>
<p><a href=»buscador.php» class=»linkmenu»><?echo $ag[«Buscador»];?></a></p><br><br>
En vez de colocar la palabra «Página principal» hago referencia a la tabla $ag[«Pagina Principal»] donde ya se hará la correspondiente traducción. (Recordad, lo que era referenciado por la flecha). Esto habrá que hacerlo para cada una de las palabras que quieran ser traducidas en la página web.
Lo único que habría que hacer ahora para modificar el idioma sería incluir una determinada página u otra en función del idioma que haya seleccionado el visitante. Si se ha seleccionado el español, se hará referencia a la página «es.inc.php», si se ha seleccionado inglés, se hará referencia a «en.inc.php» y así sucesivamente. Pero… ¿Cómo modifico esas referencias? Es lo que se explica a continuación.
IV. Modificación del idioma
El usuario debe ser capaz de modificar el idioma en cualquier momento de la visita. Por ello, a modo de ejemplo, se podrían colocar tres banderitas (si fuesen tres idiomas) y cada una de ellas que hiciera que se recargara la página enviando una variable GET que fuese la que luego se tratar.
El código podría ser el siguiente:
Idioma:
<a href=»index.php?lg=es»><img border=»0″ src=»esp.gif»></a>
<a href=»index.php?lg=en»><img border=»0″ src=»usa.gif»></a>
De esta forma el usuario cada vez que quiera cambiar de idioma lo que se hará será recargar la página donde nos encontremos (tened en cuenta que donde pone «index.php» deberá aparecer la página en cuestión donde estemos). Y se enviará la variable $_GET[«lg»] que será la que procesemos. ¿Cómo? A través de un sencillo código:
if($_GET[‘lg’]){
$HTTP_SESSION_VARS[‘idioma_s’]=$_GET[‘lg’];
}
$lg=$HTTP_SESSION_VARS[‘idioma_s’];
if($lg==»es» ||$lg==»en»){
include($lg.».inc.php»);
}
else{
$lg=»es»;include($lg.».inc.php»);
}
Como se puede observar, en un primer lugar, si se ha solicitado cambio de idioma, es decir, si la variable $_GET[«lg»] existe, se modificará la variable de sesión a lo que se haya indicado.
A continuación se le asigna esa variable de sesión a una variable ($lg) y se procesa qué es lo que vale. En función de lo que valga se incluirá una determinada página web u otra. En caso de que no exista $lg, se tomará el idioma por defecto el español tal y como se aprecia en el código.
V. Conclusiones
Siempre que se busque una determinada solución a un problema, en todo momento existirá la solución fácil, la que primero se nos ocurren pero que sin duda, no tiene por qué ser la más compacta. Hay que buscar alternativas más eficientes y escalables de forma que las posteriores modificaciones sean «minucias» comparado con lo que podría haber sido si se hubiera implementado el sistema con fuerza bruta.
Tal y como se puede haber visto, para añadir nuevos idiomas lo único que hay que añadir son tantos ficheros «idioma.enc.php» como hagan falta y modificar la función que procese el cambio de idioma para hacer referencia a un fichero o a otro.
De esta forma, no necesitamos una página para cada idioma sino que con una única página se puede implementar tantos idiomas como deseemos.
Cualquier duda o cualquier aspecto que no se haya entendido correctamente, no dudéis en preguntarlo.
Me parece muy interesante este artículo, me servirá de mucho para un trabajo que he iniciado y me estaba costando llevarlo adelante.
Muchas gracias,
Cualquier duda que te surja no dudes en comentarla.
Saludos.
soy novato en la materia no si pùedes implementar un pequeño ejemplo para saber como funciona…
Buenas, ¡yo q era de MSDOS metido en dieño WEB!
Creo haber entendido el funcionamiento mediante archivos php, mi duda es: tengo todas mis páginas en html, ¿debería raprogramar TODO a *.php para poder hacer uso de la herramienta de cambio de idioma q nos muestras?
Es q esto es un coñazo. Yo tengo insertados textos externos mediante:
En la cabecera.
En el cuerpo. document.writeln(variable)
Entonces: hay alguna manera de hacerlo mediante JS, o en su defecto, ¿cúal es la más fácil para cambiarlo TODO?
Si he dicho alguna salvajada no os tireis al cuello, ¡estoy muy pez!
estoy viendo un codigo para cambiar el idioma ..
lo que no se que funcion pongo para hacer el cambio correspondiente si estoy trabajando con carpetas
ejemplo:
lang=carpeta donde estan los archivos del idioma
dentro de lang esta es.php como en.php
mi pregunta es cuento tengo el codigo
para cambiar la bariable
<a href=»index.php?lang=»> <a href=»index.php?lang=»>
<a href=»index.php?sitelang=»>esp | <a href=»index.php?sitelang=»>eng
<a href=»index.php?sitelang=»>esp | <a href=»index.php?sitelang=»>eng no carga en nuevo idioma por ke cren que es
esta es lo qu e pongo
if(empty($sitelang)){ //primero preguntamos si la variable que va a contener el lenguage del visitante esta vacia
$sitelang = getenv(«HTTP_ACCEPT_LANGUAGE»); // si esta vacia sacamos el lenguage del visitante y lo ponemos en la variable $sitelang
}
switch($sitelang){ //ahora cargamos el archivo que contiene el idioma segun la varible que sacamos antes
case «es» : //es = español
include(«lang/es.php»); //ahora cargamos el archivo que contiene las variables y sus palabras
break;
case «en» : //en = ingles
include(«lang/en.php»);
break;
default :
include(«lang/es.php»); //cargamos un idioma por defecto si no se encontro algun idioma
break;
}
Holay en ke archivos tengo ke introducir el codigo
if($_GET[‘lg’]){
$HTTP_SESSION_VARS[‘idioma_s’]=$_GET[‘lg’];
}
$lg=$HTTP_SESSION_VARS[‘idioma_s’];
if($lg==”es” ||$lg==”en”){
include($lg.”.inc.php”);
}
else{
$lg=”es”;include($lg.”es.inc.php”);
}
Si funciona muy bien pero veo un problema.¿Cómo solucionamos el tema de las variables en los idiomas?
Porque si entra un italiano las variables no apareceran.
En el link de arriba «Web con cambio de idiomas» al cambiar de idioma desaparecen las variables.¿cómo se soluciona esto?
Yo lo he intentado de la siguiente forma
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’]);
}
pero si el visitante tiene el navegador que no sea ni en fr ni en ni es y es por ejemplo it o pl no aparecen las variables
Alguna solución
Gracias
Gabi
Lo sé: voy más perdida que un burro en un garaje! No me aclaro ni con gaseosa. El artículo está superbién pero por más que leo, no sé como aplicarlo a una web que tiene que ir en inglés.
Le he puesto la banderita con el vínculo a una index2.php y sí va para los menús pero los textos se han cargado como la principal aunque la he llamado principal2 y sale en castellano! CLARO no es asi! pero mi pregunta es ¿qué código tengo que poner y donde para que cuando cliquen en la banderita de inglés, la principal salga en ingles?
:(:(:(
Si me podéis ayudar…por favor…
La principal es en castellano. Yo quisiera que al darle a la banderita, el mismo texto salga todo en ingles. La he estado traduciendo al inglés y yo estaba tan contenta porque la index2 carga pero la principal2, se queda como la principal monda y lironda. O sea que no me carga en inglés…
Buenas,
La idea es que no tengas que tener una segunda página para cada página que tengas en un idioma. Según comentas, tienes una página «index» para la página en español, luego otra «index2» para la página en inglés… Esto implica que necesitarías tener tantas páginas duplicadas como secciones tenga tu sitio web.
Según se comenta en el artículo, gracias al uso de las variables de sesión y al uso de «includes» en las páginas se puede hacer que se use una única sección para cualquier idioma que se quiera implementar.
Todo esto queda muchísimo más claro con un ejemplo, así que he montado un miniejemplo con tres secciones (una página principal y dos secciones más).
En la página principal se puede cambiar el idioma. Con el idioma cambiado se podrá navegar por todas las secciones de la página en el idioma seleccionado.
El enlace para descargar el ejemplo es: http://www.box.net/shared/47gg7i7iyu
Espero que te sirva.
Saludos
Hola,
soy novato en php, asique hay cosas que nos las entiendo bien.
segui los pasos que describes para hacer una web muli idiomas y logre hacer que me cambie de idioma dentro de una seccion pero cuando cambio de seccion no me toma el idioma que habia seleccionado (a la seccion a la que quiero acceder le agregue ) pero no he tenido suerte y no se que estoy haciendo mal. si alguien me puede ayudar.
Gracias de antemano.
Saludos
Hernàn
El problema es que no te lo guarda por sesion, y tendrias que llamarle todo el rato por GET (vamos que lo tendrias que llamar todo el rato loquesea.php?lg=es o areglar que te lo guarde en sesion).
A lo que iva… este metodo no sobrecarga mucho el servidor? ya que cada frase/palabra tiene que consultarla tiene que recorrer el array para subsituir la palabra y como ya saben el php se ejecuta a nivel de servidor.. :S
SALUDOS
hola kolom que tal, oye como hago para guardar los datos en la sesion? mi problema es que al cambiar de pagina, la pagina nueva no tiene el idioma que seleccione en la pagina de origen, es decir, si en «index» selecciono ingles, al llevarme a «contacto» contacto me aparece en el idioma default, agradeceria muchisimo tu ayuda
El envío por GET se realiza la primera vez… Una vez realizado el primer GET se almacenan en las variables de sesión para las posteriores usos.
Respecto al rendimiento, sinceramente no lo he calculado… Para aplicaciones sencillas con poco número de usuarios no hay ningún problema. No se si para aplicaciones con un número elevado de usuarios pueda dar problemas de rendimiento…
Para ver si afecta realmente yo recomendaría el uso de algún monitorizador de apache que mida rendimiento, etc. para ver si eso afecta a la aplicación lanzada.
Saludos.
Hernán,
Recuerda que en cada página deben estar inicializadas las variables de sesión así como la sesión en sí para que se guarden las variables de una página a otra.
Saludos.
Hola,
estoy intentando reutilizar el codigo, no tengo mucha experiencia en este lenguaje de programacion me podrian enviar un arhivo con un ejempl pequeno ya realizado pleaseeeeeeeeeeee =(
Naty,
Puedes descargarte el ejemplo en el apartado de referencias:
VI. Referencias
Web con cambio de idiomas
Sesiones en PHP
POST y GET
Ejemplo de uso
Donde pone «Ejemplo de uso» es un ejemplo sencillo de uso. Si tuvieras algún problema, coméntanoslo.
Saludos.
Buenos dias.
He leido todos los articulos referentes a este tema y si se lee muy bien y creo que esta fasil, pero intento descargar el ejemplo y me manda a un archivo de modalbox que no tiene nada que ver con el tema.. sera que pudieras volver a subir el ejemplo gracias.!!
Mario,
Efectivamente, el enlace estaba mal. Ya está actualizado. Aun así, pongo la url de acceso: http://www.box.net/shared/m8fivctbs1
Saludos.
Please si pueden enviemen el codigo a natyjaz84@hotmail.com, agregeme a su msn.
Segun el ejemplo estan igual implementando dos index, no hay forma de no repetir las paginas simplemente hacer algo automatico.
Si utilizo este codigo estaria repitiendo la misma pagina por cada idioma que tenga en mi web.
Si hay una solucion please me escriben.
Naty,
Perdona, el ejemplo no era el del os idiomas. Prueba descargarlo nuevamente. Aun así pongo la URL:
http://www.box.net/shared/m8fivctbs1
Ahí hay un solo INDEX y dos secciones. Ya me cuentas.
Saludos.
Muchas gracias ya voy a probar. =)
Hi, gracias por el ejemlo ya lo baje =) Ahora tengo una consulta hay alguna forma de que los list/menu salgan del mismo tamaño? Yo estoy trabajando con la base de datos y al llenarse los combos cada uno coge el tamaño de lo que recibe de la base, y necesito tenerlos de un solo tamaño. Ademas necesito que al abrir el combo se vea el scroll, tiene alguna propiedad para que aparezca el scroll.
Si pueden ayudarme se lo agradeceria.
Como le dije antes si puede añadame a su msn please.
gachas =)
Gracias por el ejemplo de idiomas fue de mucha ayuda =)
Hola, he implementado el código en una pequeña página de prueba.
Esta es la URL:
http://www.proyecto.webyhosting.cl/cdsol/idiomas2/
El problema que tengo es que si la carga de las diferentes páginas la hago en forma dinámica con switch() no me funciona correctamente, me explico, mientras esté en la portada todo anda bien, al cambiar de página se mantiene el idioma seleccionado, hasta aquí estamos bien, el asunto es que cuando quiero cambiar el idioma en la página que he cargado, me lo cambia sin problema pero me envía a la portada nuevamente, es decir, no mantiene la página actual, sino que cambia el idioma pero me envía como dije a la portada del sitio.
Si me pueden ayudar estaría muy agradecido porque parece que algo estoy haciendo mal y no logro encontrar la solución.
De antemano agradezco a quién me pueda ayudar.
También intenté poner en el enlace del menú lo siguiente:
<a href="?lg=es»>
Pero igual me cambia a la portada.
Hola, tengo yo un sitio web en el que de momento trabajo con define, uso 2 idiomas, quería saber que me aconsejan que sería mejor usar un sistema de arrays para los idiomas, o seguir usando define, cual de los 2 sistemas debería de usar, y por que?
Gracias de antemano.
He adaptado el script a mi web he conseguido traducir unas 3/4 partes de la web.
Pero tengo un problema que espero me pueda ayudar, tengo qeu traducir algun texto que va dentro de algunas funciones es texto muy importante y que no quiero que quede sin traducir.
Las funciones las llano desde paginas como la del siguiente ejemplo:
perfilusuario.php
la pagina de las funciones son.
fperfilusuario.php
como hago para traducirla?
hola Milthon, como estás haciendo tus traducciones, todas en un solo archivo, luego lo incluyes o qué método usaste’
Buenas,
la idea, es buena.
Pero no recomiendo sessiones.
Porq??
Porq tienen un tiempo de expiracion. Claro esta q se puede ampliar.
Mas sencillo, seria con variables. y de acuerdo a eso.
Se llama al archivo, del idioma elegido.
saludos
hola Owen que tal, podrias explicar como hacer esto? lo intente primero con variables pero no pude, no supe como mejor dicho :S agradeceria tu ayuda
Hola recien estoy diseñando mi página web, pero está diseñada toda en flash. Y estoy necesitando de igualmanera que solo tenga 2 idiomas. Español e ingles… Me estoy volviendo casi loco al tratar de hacer de que mi pagina esté en dos idiomas… Y cada vez que creo que lo logré… encuentro otros problemas… Yo se que si puede hacer con PHP. El problema es que no se como integrar el codigo PHP con Flash y que desde el mismo flash se genere mi PHP… Les agradezco enormemente si me pueden colaborar con el conocimiento que ya ustedes tienen al respecto. Conozco de una pagina que trabaja muy parecida a la pagina que yo quiero, la dirección es http://www.dottomodels.net
hola
tengo el mismo problema que hernán, asi que gregué la sesión y sus variables y me pone la página en español aunque le de en inglés
Hola, amigo, excelente tu script. De hecho lo estoy usando en el sitio Web de uno de mis clientes. En mi server (localhost), el Appserv, funciona de maravillas, pero en el famoso Xampp, que monta un php más moderno o actualizado, me arroja en pantalla este error:
Deprecated: Function session_register() is deprecated in C:\xampp\htdocs\cliente\index.php on line 3
Notice: Undefined index: lg in C:\xampp\htdocs\cliente\index.php on line 4
Notice: Undefined variable: HTTP_SESSION_VARS in C:\xampp\htdocs\cliente\index.php on line 7
He buscado infructuosamente alguna solución, pero ninguna me ha resultado. ¿Qué cambios hay que hacer?
Saludos y felicitaciones por tu blog!
Estimado Zoltrix, espero que no te moleste, pero hice pequeños cambios en tu código y resolví el problema que señalaba, salvo que sigue arrojando este error:
Notice: Undefined index: lg in C:\xampp\htdocs\cliente\index.php on line 4
El código modificado es éste:
Ahí se acaba el problema, salvo lo del Undefined index:lg descrito mas arriba.
Ojalá puedas ayudarme con esto.
Saludos!
Vaya, no salió el código modificado; bueno, debe ser el factor seguridad del blog a fin de evitar la inyección de código en la base de datos. A ver si ahora si:
…..
session_start();
$_SESSION[‘idioma_s’];
if($_GET[‘lg’]){
// $HTTP_SESSION_VARS[‘idioma_s’]=$_GET[‘lg’];
$_SESSION[‘idioma_s’]=$_GET[‘lg’];
}
$lg=$_SESSION[‘idioma_s’];
if($lg==»es» ||$lg==»en»){
include($lg.».inc.php»);
}
else{
$lg=»es»;
include($lg.».inc.php»);
}
……..
muy buen articulo, me viene como anillo al dedo
no entendí nada nadita
Muchas gracias por este artículo, y por dejar el material en zip. Estoy empezando a estudiar PHP y me ha servido mucho.
🙂
Estaforma es correcta? por que de que funciona lo hace, es una de las indicadas, par aun buen sitio?
Hola muchas gracias, muy importante tu aporte, en tu articulo al principio en uno de los elementos mencionas Tantas páginas web como idiomas haya con la relación de todas las traducciones necesarias. (Esto se puede suplir usando bases de datos).
A eso me refiero, agradeceria una idea a acerca de utilizar tu metodo pero empleando bases de datos, me imagino que creando campos de textos segun el idioma, y campos segun las paginas. Pero…..si tengo una pagina dinámica en la que mi cliente tiene que subir sus datos para actualizar su web en la que ofrece productos, como se trataria este metodo con los formularios por ejemplos y los vinculos a otras pagina cuando cambie el idioma que estos tambien aparezcan en el otro idioma, tendria el usuario que subir los nuevos registros de sus productos dos, tres, etc… segun para cada idioma.
Agradeceria cualquier dato
Soy novato en php, pero estoy aprendiendo rtapido, gracias por el post, me ha servido de mucho.
Camilo