Apache Adobe Flex TutorialTutoriaux Adobe Flex & AIR en Français

8avr/097

Flex Localization – Utilisation des Resource Bundles avec @Resource

Après avoir crée des fichiers ressources (fichiers .properties), vous pouvez les utiliser dans votre application Flex en tant que Resource Bundle (le compilateur convertit les fichiers .properties en sous-classe de la classe ResourceBundle quand vous compiler votre appli). Vous pouvez soit faire un "bind" (liaison) depuis une ressource vers une expression, ou vous pouvez utiliser les méthode de la classe ResourceBundle pour accéder à ces valeurs.

Il y a deux méthodes pour accéder aux valeurs d'un Resource Bundle :

  • L'instruction @Resource
  • Les méthodes de la classe ResourceManager

L'utilisation de la directive @Resource reste la méthode la plus simple pour inclure des Resource Bundles dans votre application. Dans cette instruction, vous spécifiez le nom du fichier .properties et la clé que vous voulez utiliser (rappelez-vous, les fichiers .properties sont sous la forme clé=valeur).  Cette méthode est simple, mais aussi restrictive par son utilisation. Par exemple, vous ne pouvez utiliser la directive @Resource qu'en MXML, et vous ne pourrez pas changer la langue à l'exécution. De plus, cette méthode ne retourne que des String.

L'autre méthode est d'accéder aux Resource Bundles par la classe ResourceManager. Vous pouvez utiliser les méthodes de la classe ResourceManager en ActionScript alors que vous ne pouvez utiliser la directive @Resource qu'en MXML. Ces méthodes peuvent renvoyer d'autres types de données que des String, comme par exemple des int, Boolean ou Number. Vous pouvez aussi utiliser cette classe pour changer de langue at runtime.

Utilisation de la directive @Resource

Dans du MXML, vous pouvez utiliser la directive @Resource pour accéder aux RB. Il faut passer à cette directive le nom Bundle (le nom du fichier .properties sans l'extension) ainsi que le nom de la clé à retrouver dans le fichier properties. Cette directive renvoie une String correspondant à la valeur de la clé du RB.

L'exemple suivante crée un formulaire. Les valeurs de labels du formulaire sont extraites du fichier ressource RegistrationForm.properties:

<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Form>
        <mx:FormItem label="@Resource(key='personname', bundle='RegistrationForm')">
            <mx:TextInput/>
        </mx:FormItem>
        <mx:FormItem label="@Resource(key='street_address', bundle='RegistrationForm')">
            <mx:TextInput/>
        </mx:FormItem>
        <mx:FormItem label="@Resource(key='city', bundle='RegistrationForm')">
            <mx:TextInput/>
        </mx:FormItem>
        <mx:FormItem label="@Resource(key='state', bundle='RegistrationForm')">
            <mx:TextInput/>
        </mx:FormItem>
        <mx:FormItem label="@Resource(key='zip', bundle='RegistrationForm')">
            <mx:TextInput/>
        </mx:FormItem>
    </mx:Form>
</mx:Application>

Flex Source Code Download: Télécharger le code source complet de l'application

This movie requires Flash Player 11

Pour rappel, le fichier RegistrationForm.properties est le suivant:

registration_title=Registration
submit_button=Submit Form
personname=Name
street_address=Street Address
city=City
state=State
zip=ZIP Code
thanks=Thank you for registering!

Et les options du compilateur sont les suivantes:

-locale=en_US -allow-source-path-overlap=true -source-path=locale/{locale}

Pour en savoir plus sur comment compiler cet exemple Flex:

Flex Localization - Compilation de ressources dans une application Flex 

Si vous voulez récupérer une classe en non une String, vous devez utiliser la directive ClassReference() dans votre fichier properties. L'exemple suivante embarque la classe MyCheckBoxIcon_en_US dans le fichier properties:

CHECKBOXSKIN=ClassReference("MyCheckBoxIcon_en_US")

Vous pouvez ensuite référencer cette classe dans une propriété de type style comme ceci:

<mx:CheckBox selected="true"
    selectedUpIcon="@Resource(key='bundle1', 'CHECKBOXSKIN')"
    selectedDownIcon="@Resource(key='bundle1', 'CHECKBOXSKIN')"
    selectedOverIcon="@Resource(key='bundle1', 'CHECKBOXSKIN')"
/>

Pour utiliser des éléments binaires comme des images, vous devez embarquer l'image dans le fichier properties. Vous pourrez ensuite utiliser cet élément comme n'importe quelle image. Pour embarquer une image dans un fichier properties, utilisez la directive Embed() comme dans cet exemple:

flag=Embed("images/unitedstates.gif")

L'emplacement de l'image est relatif à celui du fichier properties. Dans le cas de l'exemple ci-dessus, le répertoire de l'image est dans locale/en_US/.
Dans votre application, utilisez la directive @Resource n'importe où l'on attend une String indiquant le chemin de l'image. Par exemple dans un <mx:Image>:

<mx:Image source="@Resource(key='flag', bundle='RegistrationForm')"/>

Articles similaires

Commentaires (7) Trackbacks (1)
  1. Bonjour,
    J'ai téléchargé le code source de l'application form ci-dessus.
    Dans mon compilateur(de Flex Builder 3.0.2), j'ai les arguments additionnels suivants:
    -locale en_US -allow-source-path-overlap=true -source-path=locale/{locale}
    et quand je compile j'ai une erreur:
    "Unable to resolve bundle "containers" for locale "en_US"

    Merci d'avance pour votre aide,
    Sl!m.

  2. Salut, c'est étrange, containers est un Resource Bundle de Flex. As tu fait un projet Flex ou un projet ActionScript ?
    Sinon, j'ai trouvé cela:
    http://bugs.adobe.com/jira/browse/FB-11795

    fabien

  3. Bonjour,
    Merci pour ces explications très détaillées, j'ai actuellement une application sur flex 4, j'ai utilisé le resourceManager pour le multi-langue alors j'aurais une ou deux questions ...
    pour tout ce qui est petit texte c'est très pratique tel que label des button ect...
    seulement comment gérer des bloc textes plus complexe, avec saut de ligne et caractères spéciaux ?
    pour les saut de ligne j'ai vu que le "\n" etait pris en compte.
    mais je ne vois pas bien comment mettre en place dans le fichier .properties ?
    faut il tout mettre sur une seul ligne avec des \n ? pas terrible :x !
    sinon j'ai un problème avec les caractères accentués. pourtant dans les propriété de mon projet les ressources sont bien sur UTF8 comme tu le préconise dans une de tes explications.
    Pour finir avec mes questions, y a t'il un réel avantage à utiliser le resourceManager plutôt qu'un fichier xml pour du multi langue ?
    car j'ai vraiment l'impression que c'est plus limité qu'un fichier xml ...?
    merci pour tes futures réponses.
    Bonne prog

    AlionG

  4. Salut AlionG,
    Alors les Resource Bundles, c'est pas mon fort mais je vais tenter de répondre à ta dernière question.
    Le resourceManager a plusieurs avantages sur un fichier XML dans la plupart des cas. La première (et principale que je vois) est l'utilisation des ressources dans plusieurs projets, notamment de type librairie. Si tu as un XML contenant tous les textes, il faudra que depuis ton composant (qui peut être dans un autre projet), tu fasses référence à ton XML, sûrement par une variable globale/magique. C'est pas propre et cela va gâcher ton code. Le resource Manager peut-être utilisé, lui, de manière plus souple.
    2e point, la séparation de ton contenu. Si tu as une grosse application (peut etre pas le cas today mais il faut penser à demain), tu vas vouloir découper ton application en modules ou bien charger les textes en background. Les ressource Bundles te premettent de faire cela facilement avec du chargement à la volée.

    Bonne chance pour la suite ;)

    Fabien

  5. ok merci pour ta réponse rapide et précise ! :) j'ai en effet quelques gros projets, la plupart actuellement j'utilisais du xml, mais je vais changer tout ça dorénavant grâce a toi ! :D
    Alors pour dire que c'est pas ton point fort, je trouve que tu maîtrise déjà très bien le sujet ! :)
    dernière petite question concernant justement les chargement à la volé dans les modules c'est exactement mon cas, seulement comment stocker dans le fichier .properties un bloc texte dans une variable ? existe t'il l'équivalent d'une balise ?

    Merci encore

    Adelin

  6. oups je voulais dire l'équivalent d'une balise xml CDATA mais le code n'est pas passé :) ...

  7. Re, donc après quelques test j'ai fini par trouver. je post la réponse à ma question si ça peut servir à quelqu'un d'autre.
    donc comme je l'ai dis auparavant le \n fonctionne pour le saut de ligne et si l'on souhaite un bloc texte sur plusieurs ligne dans le fichier .properties il suffit de terminer ces lignes par un \\ ce qui donne en exemple :

    L_TXTACC=test texte \n \\
    sur plusieurs lignes \n \\
    encore une ligne.

    @+
    Adelin


Leave a comment

(required)