La Localisation avec Flex 3 (internationalisation)
20 mai 2008
Par Jean Marie Macé - Exemples Flex - Lien permanent
J'ai trouvé de très bons tutoriel sur le net pour la localisation avec Flex mais aucun n'était complet pour mon besoin, à savoir pouvoir modifier à la volée la langue d'une application, et pouvoir le faire aussi bien sur des composants MXML que AS. Je vous propose donc un tutoriel qui permet de le faire.
Tout d'abord, il faut avoir une localisation du framework, pour cela on ouvre une invit' de commande et on se place dans le repertoire "bin" du SDK Flex (par défaut C:\Program Files\Adobe\Flex Builder 3\sdks\3.0.0\bin ):
cd C:\Program Files\Adobe\Flex Builder 3\sdks\3.0.0\bin
Puis, on copie le framework de base pour pouvoir l'utiliser dans une autre langue:
copylocale.exe en_US fr_FR
Si une erreur du type "unable to find JDK" ou "unable to find JVM" apparait, il faut ajouter une variable d'environnement JAVA_HOME(pour pointer vers le JDK):
- Panneau de configuration->Système, onglet Avancés, puis Variables d'environnements
- dans la zone variables système : cliquer sur Nouveau
- Nom de la variable : JAVA_HOME
- Valeur : répertoire vers le jdk (par exemple : C:\java\j2sdk1.4.2_17)
- si besoin redémarrer l'invit' de commande et recommencer l'étape précédente.
Maintenant, nous pouvons commencer un nouveau projet que je nommerais localization. Dans les propriétés de ce projet , sur la partie Flex Compiler, nous rajoutons:
-locale=fr_FR,en_US -source-path=../locale/{locale}
Ainsi, la langue par défaut est le français et à défaut de définition pour un composant du framework en français , il sera en anglais. De plus la seconde partie indique le chemin vers, ce que j'appelle les dictionnaires. Il faut donc à présent créer ces dictionnaires.
Nous créons donc un dossier locale à la racine du projet(au même niveau que src), puis dans ce dossier nouvellement créé on ajoute les dossiers en_US et fr_FR avec, à l'intérieur de chacun, un fichier i18n.properties (i18n étant l'abréviation de internationalisation, mais libre à vous de le nommer comme bon vous semble). Voici, le contenu de mon fichier i18n.properties (version FR) :
#Commentaires bla bla
home_title=Bonjour!
title_window=Titre de la fenêtre
welcome_text=Bievenue sur le composant 1
combo_text=C'est ici que vous pouvez changez la langue
button_text=Cliques sur moi!
Vous l'avez remarqué, rien de compliqué, il suffit de copier-coller ce code dans le fichier anglais et de traduire... Pour les caractères non ASCII(é, è , ...) , il faut sauvegarder le fichier français au format UTF-8, pour cela click droit sur le fichier->properties et choisir Other dans Text field encoding , puis UTF-8.
Maintenant, que les dictionnaires sont disponibles, comment y accéder? C'est très simple, par défaut(référence à la variable de compilation) c'est le français qui est chargé, mais avec une ComboBox, par exemple, on peut passer d'une langue à l'autre pour cela, on utilise le resourceManager et sa propriété localeChain(Array) qui propage l'information à toute l'application . Sur l'évènement CHANGE de la ComboBox on a donc:
[actionscript]
// Ce sont bien des crochets autour de myComboBox.selectedItem, mais la coloration syntaxique du blog n'accepte pas ce caractère...
resourceManager.localeChain = [myComboBox.selectedItem];
Il faut, pour que la modification soit effective que les text et label de l'application récupère les valeurs depuis le resourceManager évidement, voici comment opérer :
[xml]
<!-- Dire au compilateur quelle ressource utiliser -->
<mx:Metadata>
[ResourceBundle("i18n")]
</mx:Metadata>
<!-- Depuis un fichier MXML -->
<mx:Text text="{resourceManager.getString('i18n', 'welcome_text')}"/>
[actionscript]
//Depuis un composant AS (sous classe de UIComponent)
this.mybutton.label = resourceManager.getString('i18n', 'button_text');
//Code AS n'étant pas une sous classe de UIComponent
this.mybutton.label = ResourceManager.getInstance().getString('i18n', 'button_text');
A présent, nous avons sans problème le changement à la volée pour les composants MXML mais pour les composants AS, il y a une petite subtilité. En effet, l'affectation du text ou du label doit se faire dans la méthode resourcesChanged du UIComponent. Voici un exemple de composant AS:
[actionscript]
package
{
import mx.containers.Canvas;
import mx.controls.Button;
public class myCompAS extends Canvas
{
public var mybutton:Button;
public function myCompAS(){
}
protected function init():void{
this.resourcesChanged();
}
override protected function resourcesChanged():void{
if( this.mybutton != null ){
this.mybutton.label = resourceManager.getString('i18n', 'button_text');
}
}
}
}
Enfin, voici la preuve par l'exemple : ici (click droit pour les sources) :
pour rendre dynamique le chargementt des resourceBundle, je vous invite à lire ce billet
Commentaires
Bonjour,
pierreSur le site d'ADOBE, (opensource.adobe.com/wiki...
il apparait differents patches de localisations.
Comment les télécharger?
Est-ce que ceux-ci permettent d'effectuées la commande : copylocale.exe en_US fr_FR
Merci
Il s'agit du sdk de Flex 4(en développement), tu peux télécharger ce sdk en clickant dans le menu de droite sur downloads ;)
Jim_NastiqMerçi ppur ce bon tuto.
ericSi le combo box est remplacé par une suite de drapeaux tous visibles. Quelles sont les modifications à apporter au script.
Merçi
tu peux regarder le composant IconComboBox qui permet d'ajouter un icone a gauche du texte dans une combobox. Tu trouveras les infos sur ce composant à cette url: flexibleexperiments.wordp...
Jim_NastiqMerci pour ce tutoriel. Je n'avais pas pensé au changement du fichier français au format UTF8. C'était une information très utile.
SosoJ'ai un problème avec le TextInput impossible de lui faire prendre les accents
Ivan Chabanaudsi je rempli le champs par une valeur par default il y-a bien les accents, par contre
lors ce que je rempli le champs les accents ne sont pas pris en compte.
J'ai tout essayé
la méthode décrite plus haut pour passer le compilateur en fr_FR, mettre une police de caractères spécifique. Même punition, c'est assez gênant vu que le générateur vocal à
besion des accents. Il semble que ce soit un
bugs.adobe.com/jira/brows... Bug
avez vous des infos ?
OS Linux 2.6.22-15-generic
Flex Builder Linux Version: 3.0.196042
Eclipse Version: 3.3.2
Je ne connais pas très bien le monde Linux mais il y a une histoire d'encodage UTF-8 qui doit se cacher la dessous...
Jim_Nastiqsinon a tout hasard tu n'utilises pas le wmode opaque ou transparent?
<?xml version="1.0" encoding="utf-8"?>
Ivan Chabanaud<!-- Simple example to demonstrate the TextInput control. -->
<mx:Application xmlns:mx="www.adobe.com/2006/mxml&q... creationComplete="init()" >
<!--<mx:Style>
global {
fontFamily: gothicCentury;
}
<mx:Style source="assets/css/style.css" />
</mx:Style>
-->
<mx:Style source="assets/css/style.css" />
<mx:Script>
<![CDATA[
import mx.resources.Locale;
//private var langue:String;
public function init():void{
Locale.getCurrent(Application.application.systemManager).country;
langue.text=
Locale.getCurrent(Application.application.systemManager).language;
pays.text = Locale.getCurrent(Application.application.systemManager).country;
}
[Embed(source="/usr/share/fonts/truetype/newtypes/DISTROBL.ttf", fontName="gothicCentury")]
private var _gothicCentury:Class;
]]>
</mx:Script>
<mx:Panel title="TextInput Control Example" height="75%" width="75%"
paddingTop="10" paddingLeft="10">
<mx:TextInput id="src" text="Héllo World!"/>
<mx:Button label="Copy Text" click="dest.text = src.text"/>
<mx:TextInput id="dest"/>
<mx:TextInput id="langue"/>
<mx:TextInput id="pays"/>
</mx:Panel>
</mx:Application>
exemple simplissime
j'ai aussi essayé d'embeder une police de caractére comme me l'a conseillé
Younés de virtual-industry via css ou le Embed
avez vous ce type de Prb sous Win & OSX
je n'ai pas ce soucis sous Win XP SP2 avec ton exemple! les accents sont bien affichés. Je crois savoir que l'encodage sous linux est différent(UTF-8?) ce qui peut etre la cause du probleme...
Jim_Nastiqle Bug
Ivan Chabanauddog.chabalab.fr/textinput...
l'affichage ne pose pas de prob c'est quand on rempli le champs que le prob apparaît
Ivan ChabanaudSerait-il possible de le remplacer par un formulaire html ou php
je n'ai pas le moindre soucis avec ta démo!
Jim_NastiqOK en effet le problème ne viens pas du swf
Ivan Chabanaudmais du player flash 9,0,124,0
ou de firefox 2.0.0.16
Merci de ton aide et du tutoriel trés complet
Pour Info
Ivan ChabanaudAvec le player flash standalone le problème n'est pas reproduit
seul le plugin est sensible
download.macromedia.com/p...
Merci d'avoir transmis l'information, cela pourra peut être servir ;)
Jim_NastiqAttention : Il existe aussi un bug connu par Adobe sous Firefox avec le mode transparent... Les caractères spéciaux ne sont pas reconnus en saisie clavier
gdoOui en effet! merci gdo mais ici il n'est pas question d'utiliser un wmode particulier, je tiens à le préciser pour les autres lecteurs ;)
Jim_NastiqPlop ! Alors je suis peut-être un boulet (c'est a priori le cas puisque je ne trouve personne ayant le même souci), mais je crois avoir fait pareil que ce que tu exposes dans ton tuto, et pourtant, j'ai un souci :
Pour les textes que j'ai dans mes ResourceBundles, les caractères accentués ne passent pas (j'ai un carré à la place). Pourtant, codés en dur, ils sont affichés...
Je ne comprends pas pourquoi ça plante lorsque le ResourceManager essaie de les récupérer, et je n'ai trouvé aucune solution sur le web.
Aurais-tu par hasard des idées ? Merci par avance !
BlueWolf²En fait, j'ai finalement trouvé l'origine du problème : en raison de ses caractères accentués, le fichiers properties français est encodé par défaut en ISO. Il suffit d'aller dans ses propriétés, de forcer l'encodage en UTF-8, et de redémarrer votre Flex Buidler...
En espérant que ça en aidera d'autres ! (oui, désolé, c'était bien dans tuto, mais comme j'avais une solution quasiment au point, j'ai lu en diagonale...)
BlueWolf²