Internationalisierung (i18n) in Flash-Spielen? Gibt es einen einfachen Weg?

8

Ich möchte einige Texte in einem Flash-Spiel (nicht Flex-Spiel), an dem ich arbeite, internationalisieren, und ich kann keinen einfachen Weg finden, dies zu erreichen ... Ich habe einige Bibliotheken und andere Lösungen gefunden, aber ich habe etwas viel Einfacheres erwartet ( Mit anderen Technologien ist es wirklich einfach.

Hast du Erfahrung damit? Wie machst du das?

miguelSantirso
quelle
"Mit anderen Technologien ist es wirklich einfach" - welche anderen haben Sie verwendet?
Kylotan
Zum Beispiel: PHP, .NET, Java ... Aber ok, wenn ich nur an die Spieleentwicklung denken muss, ist es nicht so einfach.
Miguel Santirso

Antworten:

5

Ich habe kürzlich ein Flash-Spiel entwickelt, das ich ins Deutsche und Englische übersetzt habe. Sie können es hier ansehen: http://www.bioaschi.ch/?lang=en#/game . Sie können die Sprache im Einstellungsmenü im laufenden Betrieb ändern .

Um das Spiel zu übersetzen, habe ich den folgenden Ansatz: Ich habe eine benutzerdefinierte geschrieben Config - Klasse , die im Grunde nur eine Registrierung von Schlüsseln => Wert - Paaren. Die Konfigurationsklasse kann aus einer XML-Datei lesen und Ereignisse auslösen, wenn sich ein Wert ändert.

Für das Spiel habe ich 2 verschiedene Konfigurationsdateien erstellt. Eine ist die mainKonfiguration und dann eine Datei mit den Übersetzungen (aufgerufen lang). Die mainKonfiguration enthält einen Schlüssel, der die Sprache angibt, z. lang = en . Im Spiel höre ich auf Änderungsereignisse auf dieser Taste. Immer wenn das passiert, lese / wende ich die Werte aus der entsprechenden Sprache an.

Hier ist ein kleiner Codeausschnitt, der zeigt, wie die Sprache im Spiel umgeschaltet wird:

Irgendwo im Bedienfeldcode "Einstellungen":

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

Dann überall dort, wo Text lokalisiert werden muss:

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

Sie können sich die Datei ansehen, die vom Spiel geladen wird: http://www.bioaschi.ch/game/language.xml

Um Teile des Textes durch Variablen zu ersetzen (z. B. your score is %dTransformationen in your score is 10000), empfehle ich die Verwendung der hervorragenden Bibliothek für polygonale Datenstrukturen . Es enthält eine AS3-Implementierung von Sprintf .

Anstatt alle Übersetzungen in einer Datei zu haben, können Sie auch problemlos eine einzige Datei pro Sprache verwenden.

Der Vollständigkeit halber hier einige Codeauflistungen:

Wow, das hat sich als langer Beitrag herausgestellt, tut mir leid. Der Ansatz, den ich gewählt habe, ist ziemlich simpel und deckt nicht die komplizierteren Themen der Internationalisierung ab, wie Datumsformate , Zahlen- oder Währungsformatierungen usw. Für einfache Übersetzungen funktioniert es jedoch einwandfrei.

bummzack
quelle
Dies ist eine gute Antwort, aber ich kann nicht upvoten, weil ich ein neuer Benutzer bin :( Ich werde Ihre Antwort akzeptieren, wenn es bald nichts Besseres gibt.
miguelSantirso
1

Aus der C ++ - Welt stammend, besteht die allgemeine Idee für das schnelle Ändern von Sprachen darin, den gesamten Sprachtext irgendwo in einer Tabelle zu speichern, wobei jeder Zeichenfolge (oder jedem Sprite, das Text enthält) eine numerische ID zugewiesen wird. Alle IDs sind in verschiedenen Sprachen gleich, zuzüglich eines Sprachversatzes. Zum Beispiel:

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

const STRING_HELLO_WORLD: int = 0;

var StringTable: Array / * von String * /; StringTable [STRING_HELLO_WORLD + LANG_EN] = "Hallo Welt!" StringTable [STRING_HELLO_WORLD + LANG_DE] = "Hallo, Veldt!"

Dies erfordert zwar eine beträchtliche Einrichtungszeit, muss jedoch nur einmal durchgeführt werden.

Dann verweisen Sie in Ihrem Code einfach mit der Zeichenfolge und dem aktuellen Sprachversatz auf die Tabelle: myObject.text = StringTable [STRING_HELLO_WORLD + currentLanguage];

Ian Schreiber
quelle
Ich habe bei ausgelieferten Spielen etwas Ähnliches gesehen, außer dass die Daten normalerweise aus einer Excel-Tabelle eingelesen werden, eine Sprache pro Spalte.
Kylotan
0

Binden Sie Ihre Komponenten an ein flash.utils.Dictionary-Objekt. Ein Wörterbuch ist im Grunde ein assoziatives Array. Wenn Sie untereinander tauschen und Ihre Bindungen vorhanden sind, ändern sich die Ansichten automatisch. Verwendung kann Datumsformatierung usw. Informationen dort zwei platzieren. Ich habe auch ein unbeliebtes und unfreundliches "nummeriertes ID" -System eingeführt. Dies lag daran, dass Sie bei der Erforschung von Internationalisierung / mehrsprachigen Apps feststellen werden, dass einige englische Wörter je nach Kontext unterschiedlich übersetzt werden (auf Französisch oder Spanisch ist dies sehr häufig).

kosmoknot
quelle