lunes, 4 de febrero de 2008

La clase Locale de AS3, internacionalización en actionscript 3

Como no me fue fácil decubrir cómo funcionaba la clase Locale en AS3, quería dejarlo para la bitácora por si a alguién le puede ser útil.
Éste es un método para permitir internacionalizar una aplicación flash, ActionScript 3, este método no puede utilizarse con ActionScript 2. Además éste método es para utilizar principalmente con FlashDevelop, supongo que con Flash CS3 IDE puede también hacerse pero no lo he probado.
Primero ActionScript 3 tiene soporte para los archivos XLIFF , este es una especificación para archivos XML, lo básico es que debemos crear un archivo por cada idioma que queramos implementar con el siguiente formato. Al crear este archivo XML debemos vigilar de utilizar una codificación UTF-8, si lo creamos con notepad al guardar se puede definir el tipo de codificación en el desplegable de debajo del nombre del arhivo a guardar.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xliff PUBLIC "-//XLIFF//DTD XLIFF//EN"
"http://www.oasis-open.org/committees/xliff/documents/xliff.dtd" >
<xliff version="1.0" lang="es">
<file datatype="plaintext" original="ICCS.swf" language="ES">
<header></header>
<body>
<trans-unit id="010" resname="VER_TODO">
<source>Ver todo</source>
</trans-unit>
</body>
</file>
</xliff>



Una vez creado nuestro archivo lo guardamos en cualquier carpeta dentro de nuestro proyecto (o en cualquier lugar del sistema), lo único que debermos indicarle a la clase Locale donde se halla cada archivo de localización (nuestro archivos XML). Podemos utilizar una ruta absoluta o relativa, aunque aconsejo que sea relativa y ubicar la carpeta dentro de la misma carpeta donde se encuentra nuestro SWF principal.
Para cargar los archivos de localización y poder utilizarlos dentro de la aplicación, debemos definir en nuestro método principal las siguientes lineas:
package {
...
import flash.Locale.*;
...
Locale.addXMLPath("es", "lang/es.xml");
Locale.initialize();
Locale.setDefaultLang("es");
Locale.setLoadCallback(init);
....
public function init(success:Boolean):void {

trace(Locale.loadString("ID_PRUEBA"));
}

Bien, estas lineas cargarán los archivos de localización y el método loadString nos permite llamar a nuestras traducciones en el idioma definido.
Así por encima los métodos que llamamos hacen lo siguiente:
Locale.addXMLPath(id,path) , añade al listado interno la ruta y el identificador del archivo de localización, luego Locale.initialize() inicializa la instancia con todos los idiomas, Locale.setDefaultLang define el idioma principal a utilizar y Locale.setLoadCallback(funcion) define la funcion que se llamara una vez finalizada la carga de los archivos de localización.
Una vez finalizada la carga podremos llamar al método Locale.loadString(id_traduccion) el cual nos devuelve la traduccion referenciada por el id proporcionado en el idioma definido.

2 comentarios:

Lucía y Óscar dijo...

Hola,

Tengo una duda y quería ver si podías ayudarme.

Una vez cambias el lenguage, es posible cambiar todos los textos de la web de forma automática, o por el contrario he de ir haciendo asignaciones de la forma:
instancia_LabelNombre.text = Locale.loadString("IDS_LABELNOMBREFORMULARIO_TXT");
en la funcion callback para todos los text.

Gracias

Iago dijo...

Hola oscarml, efectivamente tendrás de asignar las propiedades de texto en la función callback, en el ejemplo init().
Podrías utilizar esta función como la función principal de tu aplicación.
Este método callback permite controlar la carga de los recursos para la internacionalización.

Espero esto responda tu duda.

Un saludo