Archive for août, 2008

Globalisation et Coldfusion

Un CFC pour Coldfusion afin de globaliser une application en utilisant l’internationalisation de Java avec les Resource Bundles. Je suis parti du CFC de Paul Hastings pour charger les bundles et ensuite je me suis inspiré du code de BlogCFC pour le chargement dans l’application et pour le pointeur. Cet objet n’est pas finalisé mais peut être utilisé en production. Il prends en compte les performances et la gestion au mieux de la mémoire.

Télécharger : g11n CFC

Les méthodes pourraient être étendu pour charger des traductions depuis une base de données ou parser toute sorte de fichiers.

Utilisation

Ce fichier est dans dossier include qui se trouve à la racine du site root\include\org\g11n\g11n.cfc et est appelé dans le fichier application.cfm à la racine du site.

<cfif not isDefined("application.init") or (isDefined("url.reinit"))>
<cfset application.g11n=createObject("component","include.org.g11n.g11n").init()>
</cfset><cfset application.g11n.LoadResourceBundle(expandPath('/include/main'))>
</cfset><cfset application.g11n.addResourceBundle(expandPath('/p_dynamic/sites/main'))>
 </cfset><cfset application.g11n.utils=createObject("component","include.org.g11n.utils")> 
</cfset><cfset application.init = true>
</cfset></cfif>
 <cfset __ = application.g11n.utils.getResourceLocale>
</cfset>

Une seule instance de l’objet G11N est créé par application pour ne pas charger la mémoire et utiliser au mieux le cache d’une variable d’application. La variable application.init est utilisée pour réinitialiser les variables d’application en tapant un url du type http://moniste.com/monfichier?reinit

Les méthodes LoadResourceBundle et addResourceBundle parsent les différents bundles de langues et les stoquent dans des variables de type struct de l’objet G11N.

Cela se complique un peu avec le pointeur (ou alias) qui est utilisé pour simplifier l’écriture dans le code. fichier utils.cfc doit être éditer pour chaque application suivant l’instance de l’objet qui est créé et la variable de session ou est stoqué la langue.
Juste pour faire un pointeur tout en appelant la variable locale de l’object il faut passer par un objet ou une fonction itermédiaire (un “wrapper”) qui est ici dans utils.cfc Je ne trouve pas cela très élégant et rend l’organisation du code confus mais et très utile pour une simplication d’écriture. Le pointeur est créé par la ligne __ = application.g11n.utils.getResourceLocale dans l’application.cfm

<cfcomponent displayName="Utils" output="false">
           <cffunction name="getResourceLocale" access="public" returnType="string" output="false"
                hint="A utility wrapper for RB, to allow pointers / object application.g11n must be instantiate">
        <cfargument name="str" type="string" required="true">
            </cfargument><cfargument name="locale" type="string" default="#session.l#" required="false">
        <cfreturn application.g11n.getResource(arguments.str,arguments.locale)>
    </cfreturn></cfargument></cffunction>
</cfcomponent>

Donc maintenant que tout est instancié et pointé pour une simple localisation il vous suffit d’appeler la fonction qui pointe vers la méthode de l’objet.

<cfscript>
/* le pointeur à la variable de langue de la session par défaut #session.l# */
__("maclefdemonbundlealocaliser")
/* une clef a traduire avec une autre langue*/
__("maclefdemonbundlealocaliser","zh")
</cfscript>

Plusieurs remarques:

  • Les éditeurs de resources bundles ne sont pas trés courants. L’utilisation des resources bundles est laborieuse pour des non-codeurs. Je viens de travailler avec des traducteurs arabes/russe/chinois/espagnol, avec un export/import Excel je n’ai pas eu de remarques et cela a été efficace.
    Quelques liens utiles :
    Resource Bundle Editor en “standalone”
    Tranformer un Resource Bundle en fichier Excel en ligne de commande
    Un éditeur de Resource Bundle pour Eclipse
    Jinto, un autre éditeur de Resource Bundle pour Eclipse en mode tableaux
  • La mémorisation et l’utilisation de clefs n’est pas très pratique et demande plus d’attention au moment de coder.
  • Java semble bien gérer l’internationalisation. J’ai quelques problèmes avec la classe choiceFormat utile pour les pluriels. Je ne peux pas utiliser les méthodes ou instancier cet objet via Coldfusion.
  • Pointer une variable ou une méthode dans un objet n’est pas très intuitif avec CF
  • Je n’ai pas créé de pointeur pour la méthode messageformat mais cela reste possible.
  • La globalisation est importante mais Coldfusion n’offre rien de très utile pour cela au nivau de l’application il ya quelques fonctions de localisation. La mise en place et l’utilisation de ce CFC est laborieuse, mais une fois que cet objet est instancié avec un pointeur cela devient très simple.

CFFORUM, enfin un forum francophone pour Coldfusion !

Le travail communautaire c’est important. Comme des artisants nous avons besoins d’échanger nos bonnes pratiques ou nos outils. Pour Coldfusion la communauté francophone est très réduite. C’est pourtant un outil efficace mais payant. C’est peut être le prix qui à mis un frein à la diffusion de Colfusion. Quoi qu’il en soit vous pouvez trouver de nombreuses ressources, des astuces, poser des questions sur le forum www.Cfforum.eu de notre amis Serge Rapaille.