Internacionalización (i18n) en juegos Flash? hay una manera fácil?

Quiero internacionalizar algunos texts en un juego flash (no flexible) en el que estoy trabajando y no puedo encontrar una manera fácil de lograrlo … He encontrado algunas bibliotecas y otras soluciones, pero esperaba algo mucho más fácil ( es realmente fácil con otras tecnologías).

¿Tienes experiencia en esto? ¿Cómo lo haces?

Recientemente desarrollé un juego Flash que traduje al alemán y al inglés. Puedes echarle un vistazo aquí: http://www.bioaschi.ch/?lang=en#/game . Puede cambiar el idioma sobre la marcha en el menu de configuration .

Para traducir el juego, utilicé el siguiente enfoque: Tengo una class de configuration escrita personalizada que básicamente es solo un logging de pares key => valor . La class config puede leer desde un file XML y también distribuye events cuando cambia un valor.

Para el juego creé 2 files de configuration diferentes. Uno es la configuration main , y luego un file que contiene las traducciones (llamado lang ). Su configuration main contiene una key que especifica el idioma, por ej. lang = en En el juego, escucho los events de cambio en esa tecla. Cuando eso sucede, leo / aplico los valores del lenguaje apropiado.

Aquí hay un pequeño fragment de código que muestra cómo se cambia el idioma en el juego:

En algún lugar del código del panel "Configuración":

 Config.getConfig('main').setValue('lang', 'de'); // or 'en' 

Luego, en cualquier otro lugar donde el text necesita ser localizado:

  // this is in the construtor or some init method ... var cfg:Config = Config.getConfig('main'); cfg.addEventListener(ConfigEvent.CONFIG_CHANGE, onConfigChange); updateText(cfg.getValue('lang', 'en') + '.'); } private function updateText(langns:String) : void { var langCfg:Config = Config.getConfig('lang'); this.title.htmlText = langCfg.getValue(langns + "cnetworkingits.TITLE", "<title>"); this.text.htmlText = langCfg.getValue(langns + "cnetworkingits.TEXT", "<text>"); _btnClose.label = langCfg.getValue(langns + 'highscore.CLOSE', 'X'); } private function onConfigChange(evt:ConfigEvent) : void { if(evt.key == 'lang'){ updateText(evt.value + "."); } } 

Puedes echar un vistazo al file que está siendo cargado por el juego aquí: http://www.bioaschi.ch/game/language.xml

Para sustituir partes del text por variables (por ejemplo, your score is %d transforma a your score is 10000 ), le sugiero que utilice la excelente Biblioteca de estructuras de datos poligonales . Contiene una implementación AS3 de Sprintf .

En lugar de tener todas las traducciones en un solo file, también podría tener fácilmente un solo file por idioma.

En aras de la exhaustividad, aquí hay algunos listdos de códigos:

  • Clase de configuration
  • Clase ConfigEvent

Wow, esto resultó ser una publicación larga, lo siento. El enfoque que tomé es bastante simplist y no cubre los temas más complicados de la internationalization, como los formattings de date , el formatting de numbers o monedas, etc. Sin embargo, para traducciones simples funciona bien.

Viniendo del mundo C ++, la idea general para cambiar idiomas sobre la marcha es tener todo el text del lenguaje en la memory en una tabla en alguna parte, con cada cadena (o elemento que contiene text) asignado un ID numérico. Todos los ID son iguales en diferentes idiomas, más un desplazamiento de idioma. Por ejemplo:

const LANG_EN: int = 0; const LANG_DE: int = 1000;

const STRING_HELLO_WORLD: int = 0;

var StringTable: array / * of string * /; StringTable [STRING_HELLO_WORLD + LANG_EN] = "¡Hola, mundo!" StringTable [STRING_HELLO_WORLD + LANG_DE] = "¡Hola, Veldt!"

Esto requiere un time de configuration considerable, pero solo debe hacerse una vez.

Luego, en su código, solo hace reference a la tabla utilizando la cadena y el desplazamiento del idioma actual: myObject.text = StringTable [STRING_HELLO_WORLD + currentLanguage];

Une tus componentes a un object flash.utils.Dictionary. Un dictionary es básicamente una matriz asociativa. Si intercambia uno con otro y sus enlaces están en su lugar, las vistas cambiarán automáticamente. El uso puede colocar información de formatting de date, etc. dos. También introduje un sistema de "identificación numérica" ​​impopular y antipático. Esto se debe a que cuando realmente explora la internationalization / aplicaciones multilingües, encontrará que algunas palabras en inglés se traducen de manera diferente dependiendo del context (en francés o español es muy común).