miércoles, 30 de diciembre de 2020

Como se hizo. Carga de idioma por defecto

Por cuestiones de seguridad informática, los navegadores no permiten la lectura directa, es decir, a través de código de programación, de ficheros alojados en el equipo local del usuario.

Los juegos didácticos del Proyecto AJDA cargan el idioma de la interfaz de ficheros de texto (hay un fichero .txt para cada idioma). Cuando el juego se ejecuta desde la web de AJDA (a través de Internet) no hay problema ya que los ficheros de idioma se cargan desde el servidor web y el navegador lo permite sin problema. Sin embargo, cuando los juegos se ejecutan directamente desde el equipo local del usuario, los navegadores no permiten la carga de los ficheros de idiomas por las mencionadas cuestiones de seguridad.

Si no se carga la interfaz, el juego no puede utilizarse directamente desde el ordenador del cliente. Para solucionar este problema, los juegos se han diseñado para que el fichero de idioma por defecto (esp.txt), se cargue de forma automática al principio del juego desde la web del Proyecto ADJA, utilizando las tecnologías AJAX, tal y como comentamos a continuación.

En la cabecera de cada juego, entre las etiquetas <head> y </head>, se introduce el siguiente código javascript que comentamos a continuación:

<script>

var nombreJuego = "Nombre del fichero que contiene el juego";
var idm;

function leerIdioma(urlIDM)
{
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function()
     {
    if ( xmlhttp.readyState == 4 && xmlhttp.status==200 )
           {  
idm = xmlhttp.responseText;
 
      window.addEventListener("load", function(evt) 
                     {
        window.postMessage({
          type: "set",
            name: "IDMDEFECTO",
              value: idm
     }, '*');
        window.postMessage({
            type: "update"
        }, '*');
      });
        }
}
xmlhttp.open("POST", urlIDM, false);
xmlhttp.send(); 
}
var urlIDM = servidor  + rutaJuegosPrefijo + nombreJuego + rutaIdioma;
leerIdioma(urlIDM);

</script>
  • Las variables: urlIDM, servidor, rutaJuegosPrefijo, nombreJuego, rutaIdioma, sirven para indicar la ruta completa en la que se encuentra el fichero de idioma por defecto dentro de la web del Proyecto AJDA.
  • La llamada a la función leerIdioma(urlIDM) se realiza después de ser definida, por lo que se ejecuta automáticamente, pasándole como parámetro la variable que contiene la ruta del fichero de idioma que se encuentra en la web de AJDA (urlIDM).
  • La leerIdioma(urlIDM) es la que se encarga de traer los datos del fichero de idioma por defecto a través de las tecnología AJAX y su funcionamiento es el siguiente:
    • Primero se crea el objeto javascript XMLHttpRequest(), que permite traer información de una URL en segundo plano (puede traer datos de otra web).
    • Después se indica que cada vez que cambie el estado de la propiedad readyState (estado de la llamada a la información pedida) por el objeto XMLHttpRequest(), a través del evento onreadystatechange, se ejecute la siguiente función (ver siguiente punto).
    • La función en primer lugar comprueba que la respuesta es completa (xmlhttp.readyState ==4) y correcta (xmlhttp.status==200). En caso de serlo se introduce en la variable idm los datos recibidos en el objeto xmlhttp en formato texto (.responseText).
    • A continuación se desencadena un evento window.addEventListener, que pasa el valor de la variable idm a la variable IDMDEFECTO y envía el valor de IDMDEFECTO a la escena del juego que está en la misma página, en su parte <body>, a través de la instrucción  window.postMessage (que tiene el formato indicado en el código).
    • Por último se indica la forma de comunicación: método (GET/POST), dirección URL y sincronicidad (true/false, false indica que se haga de forma síncrona) (xmlhttp.open("POST", urlIDM, false))a través de la cual se van a enviar los datos solicitados y se ordena su envío (xmlhttp.send()).
En la parte del juego, al comenzar este se ordena ejecutar automáticamente la función: FICHEROIDIOMA(), que es un algoritmo que realiza lo siguiente:
  • Introduce el valor de IDMDEFECTO en la variable cadena3b (cadena3b=IDMDEFECTO).
  • Crea la variable cadena3 que lo que hace es preparar la variable cadena3b para que pueda ser transformada en un vector (cadena3='<IDM>\n'+cadena3b+'</IDM>').
  • Convierte la variable cadena3 en el vector IDM (_StrToVector_(cadena3,'IDM')).
A partir de este momento, los valores del vector IDM (IDM[0], IDM[1], IDM[2]... ), pueden ser usados en los nombres de los controles y textos de la interfaz del juego.

No hay comentarios :

Publicar un comentario