Flex Localization – Chargement de Resource Modules à la volée
Pour charger un Resource Module à l'exécution, vous allez utiliser la méthode loadResourceModule() du ResourceManager. Une fois que le Resource Module a fini son chargement, vous pouvez fixer la valeur de la propriété localeChain à une nouvelle valeur correspondant à la locale que vous venez de charger.
La méthode loadResourceModule() de ResourceManager est une méthode asynchrone (pouvant être comparée à la méthode loadStyleDeclarations() du StyleManager qui charge des themes Flex).
La méthode loadResourceModule() prend plusieurs paramètres. Le premier paramètre est l'URL du fichier SWF du Module. C'est le seul paramètre obligatoire. Le second paramètre est "update". Vous pouvez le mettre à true ou false, suivant si vous voulez que l'application soit mise à jour tout de suite après le chargement du RM. Les deux paramètres suivants sont applicationDomain et securityDomain. Ces paramètres spécifient les domaines dans lesquels les Resource Modules sont chargés. Ces derniers ne sont nécessaires que si vous essayez de charger de modules venant d'autres domaines que celui où est hébergé l'application.
La méthode loadResourceModule() retourne une instance de la classe IEventDispatcher. Vous pouvez utiliser cet objet pour dispatcher des évènements de type ResourceEvent, qui vont indiquer le succès ou l'échec du chargement du module. Vous aurez accès aux évènements ResourceEvent.PROGRESS, ResourceEvent.COMPLETE et ResourceEvent.ERROR pendant le chargement.
Flex Localization – Création de Resource Modules
Les Resource Modules sont des fichiers SWF, séparés du SWF de l'application, qui contiennent les Resource Bundles pour une "locale". Votre application peut pré-charger (preload) un ou plusieurs Resource Modules au démarrage, avant l'affichage de l'interface utilisateur. Elle peut aussi charger un Resource Module plus tard, en réponse à un utilisateur sélectionnant sa nouvelle langue par exemple. Le ResourceManager interagit avec tous types de Resource Bundles, compilés avec l'application ou chargés dynamiquement.
Les Resource Modules peuvent être une bonne approche pour internationaliser une application car vous allez externaliser les Resource Modules et les charger at run time. Cela permet donc de créer de plus petits fichiers SWF, mais requiert aussi que vous sépariez chaque fichier SWF pour chaque module que vous allez utiliser. Cela peut donc augmenter le nombre de requêtes réseau (autant de requêtes que de fichiers SWF à charger) et alourdir l'application si de nombreux SWF différents sont chargés. Cependant, si vous avez de nombreuses langues à gérer, le chargement à la volée vous fera sûrement gagner du temps.
Vous ne pouvez utiliser les resources contenues dans les Resource Modules que pendant la séquence d'initialization de votre application. Le plus tôt que vous y aurez accès est pendant l'évènement preinitialize de l'application. Vous ne devez pas essayer d'accéder aux resources pendant le preloading par exemple.
Création de Resource Modules
Avant de compiler un Resource Module, vous devez savoir quels Resource Bundles y intégrer. Vous devez donc savoir quels Resource Bundles de votre application (et des classes du framework) sont requis. Cela n'inclut pas seulement le Resource Bundle personnalisé que vous créez, mais aussi les RB du framework qui sont requis par votre application.
Pour déterminer quels RB votre application a besoin, vous allez utiliser l'option "-resource-bundle-list" du compilateur. Quand vous allez l'utiliser, cette option va sortir une liste des Resource Bundles nécessaires en examinant les metadata [ResourceBundle] dans toutes les classes de votre application.
L'option "resource-bundle-list" prend un nom de fichier en argument. Ce nom de fichier représente l'emplacement où le compilateur va écrire la liste de Bundles.
Sur un Mac OS X, vous devez spécifiez un chemin absolu pour cette option. Pour tous les autres OS, vous pouvez spécifier un chemin absolu ou relatif.
Quand vous utilisez l'option "resource-bundle-list", vous devez aussi fixer la valeur de l'option -locale à une chaîne vide.
Flex Localization – ResourceManager et ses différentes méthodes (getString, getInt, getClass…)
Le ResourceManager peut gérer tous les Resource Bundles, peu importe leur source (ils peuvent être chargés en tant que Resource Modules, compilés dans l'application ou crées par du code).
La classe ResourceManager est un Singleton. Tous les composants qui héritent de UIComponent, Formatter ou Validator ont une propriété "resourceManager", qui vous permet d'accéder au manager. Si vous créez d'autres classe qui ont besoin d'utiliser le ResourceManager, vous pouvez toujours appeler ResourceManager.getInstance() pour récupérer une référence vers ce singleton.
Dès que vous modifiez la valeur de la propriété "localeChain", le ResourceManager propage un évènement "change". Cet évènement provoque la mise à jour de toutes les propriétés liées à des resources.
Vous pouvez dispatcher cet évènement "change" manuellement en utilisant la méthode update() du ResourceManager.
L'évènement change provoque les évènements suivants:
- Les expressions ayant un data binding sur les méthodes du ResourceManager telles que getString() seront mises à jour.
- Les composants qui héritent de UIComponent, de Formatter ou de Validator exécutent leur méthode "resourceChanged()". C'est de cette manière que des composants tels que le CurrencyFormatter peuvent mettre à jour leurs valeurs par défaut telles que "currencySymbol". Si vous écrivez une autre classe qui a besoin de répondre aux évènements "change, vous pouvez écouter cet évènements de ResourceManager.
La propriété "localeChain" est un tableau (Array) pour que le ResourceManager puisse supporter les langues incomplètes. Par exemple, supposons que vous fassiez de la localization pour une application en Anglais tel qu'il est parlé en Inde (en utilisant a locale en_IN). La plupart des ressources sont les mêmes que pour la locale "en_US", il n'y a donc aucune raison de dupliquer toutes les propriétés dans le Resource Bundle pour la langue en_IN. Le fichier properties en_IN a seulement besoin d'avoir les resources qui diffèrent entre en_US et en_IN. Si le ResourceManager a des Bundles pour à la fois en_US et en_IN, et que vous fixez la valeur de localeChain à ["en_IN", "en_US"], le ResourceManager va chercher la resource en premier dans le Bundle en_IN. S'il ne la trouve pas, il va la chercher dans le bundle en_US. S'il ne la trouve pas non plus, il retournera "null".
Les différentes méthodes du ResourceManager
La méthode la plus couramment utilisée du ResourceManager est la méthode getString(), qui permet de récupérer des chaînes. C'est ce qui sert le plus pour une internationalisation (i18n) d'application.
Cependant, le ResourceManager supporte d'autres types de données. Vous pouvez récupérer des ressources typées comme Number, Boolean, uint ou int…
Flex Localization – Changement de locale en dynamique avec ResourceManager
L'usage principal de la "localization" est de mettre à disposition de l'utilisateur plusieurs langues pour une seul et même application Flex et de laisser l'utilisateur changer cette langue (locale) à l'exécution. Vous pouvez compiler toutes ces langues possibles dans votre application et laisser ensuite choisir l'utilisateur parmi elles. Cette solution n'est pas très flexible car vous pourrez uniquement sélectionner les langues que vous avez ajouté à la compilation. Cette solution peut aussi amener à faire gonfler le poids de l'application Flex car tous les fichiers .properties et leur dépendances (images, vidéos…) doivent être compilées dans l'application.
Vous pouvez aussi compiler cet fichiers properties dans des fichiers SWF appelés Resource Modules. Ces Modules contiennent chacun ce qu'il faut pour un langage et pourront ensuite être chargés à l'exécution. L'avantage de cette approche est que le fichier SWF principal de l'application sera plus petit car les resources sont externalisées, mais cela demande aussi une requête supplémentaire pour chaque Resource Module que l'utilisateur charge.
On va d'abord voir comment cela se déroule quand on compile les fichiers de langue dans l'application.
Vous pouvez changer de "locale" (langue nationale) à l'exécution en changeant la valeur de la propriété "localeChain" du ResourceManager. Cette propriété prend un Array comme valeur. Le premier élément de cet Array est la langue courante (comme en_US, fr_FR ou es_ES).





