Internationalisation (i18n) dans les jeux Flash? Existe-t-il un moyen simple?

8

Je veux internationaliser certains textes dans un jeu flash (pas flex) sur lequel je travaille et je ne trouve pas de moyen facile d'y parvenir ... J'ai trouvé des bibliothèques et d'autres solutions, mais je m'attendais à quelque chose de beaucoup plus facile ( c'est vraiment facile avec d'autres technologies).

Avez-vous de l'expérience dans ce domaine? Comment faites-vous?

miguelSantirso
la source
"c'est vraiment facile avec d'autres technologies" - quelles autres avez-vous utilisées?
Kylotan
Par exemple: PHP, .NET, Java ... Mais, ok, si je ne pense qu'au développement de jeux, ce n'est pas si facile.
miguelSantirso

Réponses:

5

J'ai récemment développé un jeu flash que j'ai traduit en allemand et en anglais. Vous pouvez le consulter ici: http://www.bioaschi.ch/?lang=en#/game . Vous pouvez changer la langue à la volée dans le menu des paramètres .

Pour traduire le jeu, j'ai utilisé l'approche suivante: J'ai une classe Config écrite personnalisée qui est fondamentalement juste un registre de paires clé => valeur . La classe config peut lire à partir d'un fichier XML et distribue également des événements lorsqu'une valeur change.

Pour le jeu, j'ai créé 2 fichiers de configuration différents. L'un est la mainconfiguration, puis un fichier contenant les traductions (appelé lang). Leur mainconfiguration contient une clé qui spécifie la langue, par exemple. lang = en . Dans le jeu, j'écoute les événements de changement sur cette touche. Chaque fois que cela se produit, je lis / applique les valeurs de la langue appropriée.

Voici un petit extrait de code qui montre comment la langue est changée dans le jeu:

Quelque part dans le code du panneau "Paramètres":

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

Puis n'importe où ailleurs où le texte doit être localisé:

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

Vous pouvez consulter le fichier en cours de chargement par le jeu ici: http://www.bioaschi.ch/game/language.xml

Pour remplacer des parties du texte par des variables (par exemple, se your score is %dtransforme en your score is 10000), je vous suggère d'utiliser l'excellente bibliothèque des infrastructures polygonales . Il contient une implémentation AS3 de Sprintf .

Au lieu d'avoir toutes les traductions dans un seul fichier, vous pouvez également facilement avoir un seul fichier par langue.

Par souci d'exhaustivité, voici quelques listes de codes:

Wow, ce s'est avéré être un long post, je suis désolé. L'approche que j'ai adoptée est plutôt simpliste et ne couvre pas les sujets les plus compliqués de l'internationalisation, comme les formats de date , le formatage des nombres ou des devises, etc. Pour les traductions simples, cela fonctionne très bien.

bummzack
la source
C'est une bonne réponse, mais je ne peux pas voter parce que je suis un nouvel utilisateur :( J'accepterai votre réponse s'il n'y a rien de mieux bientôt.
miguelSantirso
1

Venant du monde C ++, l'idée générale de changer de langue à la volée est d'avoir tout le texte de la langue en mémoire dans un tableau quelque part, avec chaque chaîne (ou sprite qui contient du texte) assigné un ID numérique. Tous les ID sont les mêmes dans différentes langues, plus un décalage de langue. Par exemple:

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

const STRING_HELLO_WORLD: int = 0;

var StringTable: tableau / * de chaîne * /; StringTable [STRING_HELLO_WORLD + LANG_EN] = "Bonjour tout le monde!" StringTable [STRING_HELLO_WORLD + LANG_DE] = "Bonjour, Veldt!"

Cela prend un temps de configuration considérable, certes, mais cela ne doit être fait qu'une seule fois.

Ensuite, dans votre code, vous référencez simplement la table en utilisant la chaîne et le décalage de langue actuel: myObject.text = StringTable [STRING_HELLO_WORLD + currentLanguage];

Ian Schreiber
la source
J'ai vu quelque chose de similaire sur les jeux livrés, sauf que les données sont généralement lues à partir d'une feuille de calcul Excel, une langue par colonne.
Kylotan
0

Liez vos composants à un objet flash.utils.Dictionary. Un dictionnaire est essentiellement un tableau associatif. Si vous échangez les uns avec les autres et que vos liaisons sont en place, les vues changeront automatiquement. L'utilisation peut placer deux informations de formatage de date, etc. J'ai également introduit un système "d'identification numérotée" impopulaire et hostile. En effet, lorsque vous explorez vraiment l'internationalisation / les applications multilingues, vous constaterez que certains mots anglais se traduisent différemment selon le contexte (en français ou en espagnol, c'est très courant).

kosmoknot
la source