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 menú de configuración .
Para traducir el juego, utilicé el siguiente enfoque: tengo una clase de configuración escrita personalizada que es básicamente un registro de pares clave => valor . La clase config puede leer desde un archivo XML y también distribuye eventos cuando cambia un valor.
Para el juego, creé 2 archivos de configuración diferentes. Uno es la main
configuración, y luego un archivo que contiene las traducciones (llamadas lang
). La main
configuración contiene una clave que especifica el idioma, por ejemplo. lang = en . En el juego escucho los eventos de cambio en esa tecla. Cada vez que eso sucede, leo / aplico los valores del lenguaje apropiado.
Aquí hay un pequeño fragmento 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 texto 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 + "credits.TITLE", "<title>");
this.text.htmlText = langCfg.getValue(langns + "credits.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 archivo que está cargando el juego aquí: http://www.bioaschi.ch/game/language.xml
Para sustituir partes del texto con variables (por ejemplo, your score is %d
transformadas a your score is 10000
), le sugiero que use la excelente Biblioteca de estructuras de datos poligonales . Contiene una implementación AS3 de Sprintf .
En lugar de tener todas las traducciones en un archivo, también podría tener fácilmente un solo archivo por idioma.
En aras de la exhaustividad, aquí hay algunos listados de códigos:
Wow, esto resultó ser una publicación larga, lo siento. El enfoque que tomé es bastante simplista y no cubre los temas más complicados de la internacionalización, como los formatos de fecha , formato de número o moneda, etc. Sin embargo, para traducciones simples funciona bien.