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

8

Quiero internacionalizar algunos textos 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?

miguelSantirso
fuente
"Es realmente fácil con otras tecnologías", ¿qué otras has usado?
Kylotan
Por ejemplo: PHP, .NET, Java ... Pero, bueno, si tengo que pensar solo en el desarrollo de juegos, no es tan fácil.
miguelSantirso

Respuestas:

5

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 mainconfiguración, y luego un archivo que contiene las traducciones (llamadas lang). La mainconfiguració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 %dtransformadas 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.

bummzack
fuente
Esta es una buena respuesta, pero no puedo votar porque soy un usuario nuevo :( Aceptaré su respuesta si no hay nada mejor pronto.
miguelSantirso
1

Viniendo del mundo de C ++, la idea general para cambiar los idiomas sobre la marcha es tener todo el texto del idioma en la memoria en una tabla en algún lugar, con cada cadena (o sprite que contenga texto) asignada una identificación numérica. 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 / * de string * /; StringTable [STRING_HELLO_WORLD + LANG_EN] = "¡Hola, mundo!" StringTable [STRING_HELLO_WORLD + LANG_DE] = "¡Hola, Veldt!"

Esto requiere un tiempo considerable de configuración, pero solo debe hacerse una vez.

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

Ian Schreiber
fuente
He visto algo similar en los juegos enviados, excepto que los datos generalmente se leen desde una hoja de cálculo de Excel, un idioma por columna.
Kylotan
0

Vincula tus componentes a un objeto flash.utils.Dictionary. Un diccionario 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 formato de fecha, etc., allí dos. También introduje un sistema de "identificación numerada" impopular y poco amigable. Esto se debió a que cuando realmente explora aplicaciones de internacionalización / multilingües, encontrará que algunas palabras en inglés se traducen de manera diferente según el contexto (en francés o español es muy común).

kosmoknot
fuente