Comunidad de diseño web y desarrollo en internet

Bug en la clase mx.lang.Locale para la función multilingüe

Buenas, el caso es el siguiente. Estaba tratando de usar la funcionalidad multilingüe en flash mediante la clase mx.lang.Locale y me ocurrió lo siguiente:
Mi idea era crear un botón que en cualquier momento me permitiese realizar una traducción automática del sitio web. Con la clase Locale y el panel Cadenas puedes registrar todos los campos de texto de tu web y seleccionar un idioma bien mediante código o bien automáticamente dejando que el flash detecte el lenguaje por defecto del servidor.
Bueno al lío. El caso es que usando la función Locale como comentaba conseguía cambiar de un lenguaje a otro correctamente la primera vez, pero al volver a un idioma cargado anteriormente ya no traducía. Por ejemplo, si la web admite inglés, francés y español y lo cargo en español va bien, después cargo inglés y va bien pero si quieres volver a cargar español ya no funciona.

Bueno revisando el código de la clase Locale encontré el error y lo corregí. Es un cambio muy sencillo, hay que localizar la función loadLanguageXML en el código y hacerle una pequeña modificación:

Código :

// Load the specified language xml file.
   static function loadLanguageXML(xmlLanguageCode:String, customXmlCompleteCallback:Function):Void {
      // if xmlLang is not defined, set to SystemCapabilities.language
      var langCode:String = (xmlLanguageCode == "") ? System.capabilities.language : xmlLanguageCode;
      if(xmlMap[langCode] == undefined) {
         // if the specified language is not defined, set to default language
         langCode = defaultLang;
      }

      if (customXmlCompleteCallback) {
         callback = customXmlCompleteCallback;
      }

      if (stringMapList[xmlLanguageCode] == undefined) {
         // if the xml has not been loaded before, load it
         if (xmlDoc)
            delete xmlDoc;

         xmlDoc = new XML();
         xmlDoc.ignoreWhite = true;
         xmlDoc.onLoad = function(success:Boolean) {
            onXMLLoad(success); // parse the XML
            callback.call(null, success);
         }
         xmlDoc.load(xmlMap[langCode][0]);
      } else {
         // the xml is already loaded, retrieve it from the list
         stringMap = stringMapList[langCode];
         
         /*codigo a añadir  */
                        if (autoReplacment) {
            assignDelayedInstances();
         }
                        /* fin */
         
         // call the callback here because onLoad is not called here
         if (callback)
            callback.call(null, true);      
      }      
      currentLang = langCode;
   }


El código a añadir es:

Código :

if (autoReplacment) {
 assignDelayedInstances();
}

Donde se indica en el bloque de código anterior.

Sencillamente el problema está en que cuando se carga el lenguaje por primera vez la clase lo registra y llama a la función OnXMLLoad, en la cual llama a su vez a assignDelayedInstances() que es la que traduce las cadenas de la página. La segunda vez que se carga un lenguaje la clase ya lo tiene registrado y no carga de nuevo el archivo XML por lo que no se hace la llamada a assignDelayedInstaces(). Esto es lo que solucionamos añadiendo el código anterior.

Para probarlo puedes usar el código siguiente sacado de los ejemplos de flash:
- Arrastra un componente combo al panel y ponle de nombre de instancia "lang_cb".
- En el panel: ventana->Otros paneles->cadenas pulsa en configuración e introduce los idiomas ingles, francés y español

Código :

import mx.lang.Locale;

var defLang:String = "en";

lang_cb.dataProvider = Locale.languageCodeArray.sort();
lang_cb.addEventListener("change", langListener);

this.createTextField("greeting_txt", 10, 40, 40, 200, 20);    
greeting_txt.autoSize = TextFieldAutoSize.LEFT;   
    
Locale.addDelayedInstance(greeting_txt, "IDS_GREETING");    
Locale.setString("IDS_GREETING", "en", "hello");
Locale.setString("IDS_GREETING", "fr", "bonjour");
Locale.setString("IDS_GREETING", "es", "buenas");
Locale.autoReplace = true;

function langListener(eventObj:Object):Void {   
   Locale.loadLanguageXML(eventObj.target.value);
}



Sé que es una tontería porque no es normal que alguien cambie varias veces el idioma de la página, pero puede que a alguien le sirva así que lo pongo aquí por si alguien más ha tenido este problema.

Por cierto la clase mx.lang.Locale antes citada se encuentra en :
C:\Documents and Settings\(nombre de usuario)\Configuración local\Datos de programa\Adobe\Flash CS3\(lenguaje: es, en, fr ...)\Configuration\Classes\mx\lang si usas PC.

Saludos.

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate