Internazionalizzazione (i18n) nei giochi Flash? C'è un modo semplice?


8

Voglio internazionalizzare alcuni testi in un gioco flash (non flessibile) su cui sto lavorando e non riesco a trovare un modo semplice per farlo ... Ho trovato alcune librerie e altre soluzioni, ma mi aspettavo qualcosa di molto più semplice ( è davvero facile con altre tecnologie).

Hai esperienza in questo? Come si fa?


"è davvero facile con altre tecnologie" - quali altre hai usato?
Kylotan,

Ad esempio: PHP, .NET, Java ... Ma, ok, se devo pensare solo allo sviluppo del gioco, non è così facile.
miguelSantirso,

Risposte:


5

Di recente ho sviluppato un gioco Flash che ho tradotto in tedesco e inglese. Puoi dare un'occhiata qui: http://www.bioaschi.ch/?lang=en#/game . Puoi cambiare la lingua al volo nel menu delle impostazioni .

Per tradurre il gioco, ho usato il seguente approccio: ho una classe Config scritta personalizzata che è fondamentalmente solo un registro di coppie chiave => valore . La classe config può leggere da un file XML e invia anche eventi quando cambia un valore.

Per il gioco ho creato 2 diversi file di configurazione. Uno è la mainconfigurazione, quindi un file contenente le traduzioni (chiamate lang). La loro mainconfigurazione contiene una chiave che specifica la lingua, ad es. lang = en . Nel gioco ascolto gli eventi di cambiamento su quel tasto. Ogni volta che succede, leggo / applico i valori dalla lingua appropriata.

Ecco un piccolo frammento di codice che mostra come viene cambiata la lingua nel gioco:

Da qualche parte nel codice del pannello "Impostazioni":

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

Quindi in qualsiasi altro luogo in cui il testo deve essere localizzato:

        // 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 + ".");
        }
    }

Puoi dare un'occhiata al file che viene caricato dal gioco qui: http://www.bioaschi.ch/game/language.xml

Per sostituire parti del testo con variabili (ad es. your score is %dTrasformazioni in your score is 10000), ti suggerisco di utilizzare l'eccellente Libreria di datastrutture poligonali . Contiene un'implementazione AS3 di Sprintf .

Invece di avere tutte le traduzioni in un unico file, potresti anche avere facilmente un singolo file per lingua.

Per completezza, ecco alcuni elenchi di codici:

Wow, questo tipo si è rivelato essere un lungo post, mi dispiace. L'approccio che ho adottato è piuttosto semplicistico e non copre gli argomenti più complicati dell'internazionalizzazione, come i formati di data , la formattazione dei numeri o delle valute, ecc. Per le traduzioni semplici funziona bene comunque.


Questa è una buona risposta, ma non posso votare perché sono un nuovo utente :( Accetterò la tua risposta se non ci sarà qualcosa di meglio presto.
miguelSantirso

1

Proveniente dal mondo C ++, l'idea generale di cambiare le lingue al volo è quella di avere tutto il testo della lingua in memoria in una tabella da qualche parte, a ciascuna stringa (o sprite che contiene testo) assegnato un ID numerico. Tutti gli ID sono uguali in diverse lingue, più un offset di lingua. Per esempio:

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] = "Ciao, mondo!" StringTable [STRING_HELLO_WORLD + LANG_DE] = "Ciao, Veldt!"

Ciò richiede un tempo di installazione considerevole, garantito, ma deve essere eseguito una sola volta.

Quindi, nel tuo codice, fai semplicemente riferimento alla tabella usando la stringa e l'offset della lingua corrente: myObject.text = StringTable [STRING_HELLO_WORLD + currentLanguage];


Ho visto qualcosa di simile sui giochi spediti, tranne per il fatto che i dati vengono solitamente letti da un foglio di calcolo Excel, una lingua per colonna.
Kylotan,

0

Associa i tuoi componenti a un oggetto flash.utils.Dictionary. Un dizionario è fondamentalmente un array associativo. Se si scambiano uno con l'altro e i collegamenti sono a posto, le viste cambieranno automaticamente. L'uso può inserire informazioni sulla formattazione della data ecc. Ho anche introdotto un sistema di "ID numerato" impopolare e ostile. Questo perché quando esplori veramente app di internazionalizzazione / multilingua, scoprirai che alcune parole inglesi traducono in modo diverso a seconda del contesto (in francese o spagnolo è molto comune).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.