Comment est-ce que ça marche ? J'en ai donné un bref aperçu dans ce billet en expliquant le fonctionnement de base. Mais pour une utilisation standarde, la seule chose à savoir est qu'une variable (au sens masapi) se décrit comme ceci : ${nomVariable}.

var loader:CompositeMassLoader = new CompositeMassLoader();
var file:ILoadableFile = loader.addFile("./dossier/menus_${LANG}.xml");
trace(file); //./dossier/menus_${LANG}.xml (text)

Il est important de noter que l'URL enregistrée sera toujours l'originale. Le remplacement de la variable ne sera fait que lorsque le fichier sera chargé ! Cela permet de simplement relancer le chargement du MassLoader (ou du fichier) lorsqu'une variable est changée.

Reste à définir une valeur pour la variable 'LANG'... La manière la plus simple est de le faire dans la loadableFileFactory ainsi tous les autres fichiers utiliseront la même valeur.

var loader:CompositeMassLoader = new CompositeMassLoader();
var file:ILoadableFile = loader.addFile("./dossier/menus_${LANG}.xml");
trace(file); //./dossier/menus_${LANG}.xml (text)
 
var factory:LoadableFileFactory = loader.lodableFileFactory;
factory.defaultVariables.put("LANG", "fr");
 
loader.start(); //l'URL sera ./dossier/menus_fr.xml

Et lorsque la variable change, il suffit de relancer le chargement pour que la nouvelle URL soit automatiquement prise en compte :

//...
factory.defaultVariables.put("LANG", "en");
loader.start(); //l'URL sera ./dossier/menus_en.xml

Un des principaux avantages est le management du code, car tous les écouteurs mis sur le MassLoader ou les fichiers n'ont pas besoin d'être modifiés car c'est bien le même ILoadableFile qui est rechargé avec une URL différente.

La seule contrainte restante (pour l'instant) est qu'il faut passer la propriété 'useCache' du MassLoader à false, sinon le fichier n'est pas rechargé. Ce détail sera corrigé lors de la prochaine révision !

Finalement, j'ai aussi mis à jour la spécification du XML des dépendances. Il est désormais possible d'utiliser des variables à l'intérieur de celui-ci, mais également d'en déclarer afin d'alléger le code.

<application>
	<variables>
		<var name="PICTURE_FOLDER">pictures</var>
	</variables>
	<files basePath="./${PICTURE_FOLDER}">
		<file url="storm1.jpg" priority="11" type="swf"  />
		<file url="storm2.jpg" priority="-1" type="swf"   />
		<file url="storm3.jpg" priority="-1" type="swf"   />
		<file url="storm4.jpg" priority="0" type="swf"   />
	</files>
</application>

Et grâce à la classe ApplicationConfigLoader, il est très simple de charger et parser le fichier XML. A noter qu'il n'est plus nécessaire d'avoir des dépendances à l'intérieur de celui-ci (pratique pour des galleries).

var configLoader:ApplicationConfigLoader = new ApplicationConfigLoader();
configLoader.addEventListener(Event.COMPLETE, onConfigLoaded);
configLoader.load(new URLRequest("config.xml"));
 
function onConfigLoaded(evt:Event):void
{
	var appLoader:ApplicationMassLoader = new ApplicationMassLoader();
	appLoader.addAll(); //ajoute tous les fichiers du contexte global dans la file de chargement
	appLoader.start();
}

Bien entendu, les deux méthodes de déclaration des variables (dans le code ou dans le XML) peuvent être combinées !