gotoAndPlay();: Flash MX et autres bidulles de geek...

Strings panel et multilingue


Un lecteur, Alain Duchesneau, m'a écrit hier avec une question, qui nous a amené lui et moi à des découvertes intéressantes. Peut-être pas les révélations du sciècle, mais je ne savais pas tout cela. La palette "Strings" de Flash MX04 m'avait semblé à première vue trop simple et peu flexible. En fouillant un peu, on a trouvé ce qu'il y avait "derrière" et ce n'est pas aussi mal que je ne le croyais.

Débutons par une explication de la palette. Elle permet de définir une liste de variables et d'assigner pour chacune un équivalent en plusieurs langues. Dans ses options, on retrouve une case cochable permettant de faire la détection de langue automatiquement. C'est bien, mais pas tant que cela. La détection est basée sur la langue de l'OS. Moi mon OS est en anglais, mais je suis francophone. Évidemment c'est techniquement impossible de le détecter, il faudrait pour cela lire les pensées! On sinon on peut définir une langue par défaut. Mais rien dans la documentation ou les options n'indique comment faire un changement de langue par Actionscript, permettant de donner le choix à l'usager. En fait, la documentation sur cette palette est merdique une fois qu'on a découvert les réelles possibilités.

Ce qui m'a mit la puce à l'oreille c'est la case "Insert Actionscript for automatic language detection". Cela ne met pourtant aucun script sur la scène! C'est là que j'ai eu l'idée de décompiler le swf. J'y ai alors découvert la classe mx.lang.Locale. Cette classe peut-être trouvée dans le classpath de Flash MX04, dans le dossier d'installation. Ma première idée rapide fut d'en faire un copie, de la modifier et de l'importer manuellement. Mais ce Alain a trouvé bien mieux ici, une extension de la classe déjà faite, permettant le switch de langue direct.

Truc vraiment étrange, dans cette TechNote, Macromedia recommande carrément de modifier la classe! Cela n'est pas illégal selon l'EULA ??! Et même si ce ne l'était pas, c'est bizarre comme recommandation...

Un autre truc que je n'avais pas vu à mon premier essai, les données entrées dans cette palette ne sont pas statiques dans le flash, mais mit dans des fichiers XML. Donc contenu dynamique multilingue avec fichiers externes. Je détestais l'idée de mettre le texte dans un palette de l'IDE et d'embeder tous les textes de toutes les langues dans le swf. Mais comme plusieurs, je n'avais pas regardé en profondeur.

Flash s'occupe de placer tous les textes automatiquement dans les textFields, en insérant partout le code suivant:

if (mx.lang.Locale.checkXMLStatus() == true){
     monTxt.text = mx.lang.Locale.loadString("IDS_myVar");
}else{
     mx.lang.Locale.addDelayedInstance(monTxt, "IDS_myVar");
}

J'adore l'idée du addDelayedInstance! Mais pourquoi ne pas simplement faire une méthode mx.lang.Locale.setText(field,"IDS_myVar") et faire le "if" dans celle-ci plutôt que d'éparpiller cela partout pour chaque variable ? Et tant qu'à y être, ajouter un listener pour pouvoir updater "live"!

Pas génial pour faire des mises en page dynamique s'adaptant au contenu, ajouter des interactions, faire des listes, etc... Mais tout de même une alternative intéressante pour quelqu'un qui souhaite faire (simplement, sans trop écrire de code), un petit site multilingue sans devoir produire autant de .fla qu'il y a de langues. Mais surtout, ce qui peut-être intéressant c'est les possibilités d'utiliser la classe "à la main", plutôt que de laisser flash le faire automatiquement. En étendant la classe et en faisant les appels et paramètres à la main, ça peut être bien. De toute façon, j'ai en horreur l'idée de voir Flash mettre du code partout sans me le dire!

Personnellement, je préfère tout faire à la main, c'est beaucoup plus flexible. Mais il y a certaines idées de cette classe qui m'intéressent et que je compte bien voler! ;)

Et qui sait, peut-être que pour un projet trop simple, je me risquerai à essayer pour me faciliter la vie. Haaaa Paresse, des fois je t'aime bien...

Merci à Alain de m'avoir fait découvrir tout cela!

Posté par stef |juillet 1, 2004 01:11 AM | TrackBack
Commentaires

hello :)
moi j'aime pas trop cette méthode je préfère faire une classe singleton qui va enregistrer au fur et à mesure si je le désire mes textField et ensuite me changer le texte en fonction d'un paramètre de langue via un XML ou une base de donnée... Là dessus je préfère pour le moment faire confiance à mon code et moins en celui de Macromédia même si je trouve que c'est un joli effort de leur part.

Posté par: | juillet 2, 2004 01:53 AM

Bonjour,
J'ai utilisé cette palette 'Chaines' pour un projet qui devait gérer 2 langues et, même en sachant tout ce dont tu parles ici et en utilisant la classe de philflash, j'ai été confronté à de multiples bugs...
Il m'est arrivé plusieurs fois de devoir retaper toutes mes chaines car en réouvrant mon .fla, tout avait disparu !
De plus l'option 'Importer XML...' fonctionne très mal, la plupart du temps elle m'a même fait planter Flash !
Donc, méfiance, si cette palette peut sembler puissante et donc apporter un gain de temps, il n'en est rien quand il s'agit de tout ré-écrire...

Voilà !
Je pense effectivement que tout faire à la main est la solution la plus sage... C'est ce que j'ai finallement décidé de faire pour ce projet...

Bonne journée !

Posté par: | juillet 2, 2004 03:40 AM
Poster un commentaire

Vous souhaitez suivre les commentaires sur ce site ? Un fil RSS est disponible ici.
bottom