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?
flash
actionscript-3
miguelSantirso
fuente
fuente
Respuestas:
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 (llamadaslang
). Lamain
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":
Luego, en cualquier otro lugar donde el texto necesita ser localizado:
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 ayour 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.
fuente
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];
fuente
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).
fuente