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?
flash
actionscript-3
miguelSantirso
la source
la source
Réponses:
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
main
configuration, puis un fichier contenant les traductions (appelélang
). Leurmain
configuration 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":
Puis n'importe où ailleurs où le texte doit être localisé:
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 %d
transforme enyour 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.
la source
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];
la source
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).
la source