Blog d'un EPSIen Epsylon

Informatique & co

Blog


18/07/2006 - 09:58 - Programmation - Aucun commentaire

Internationalisation d'un site & ASP .NET 2.0


Je dois développer une solution Intranet multi-langue, de ce fait des équipes françaises et anglophones seront ammener à utiliser ce site. Certe on pourrait créer ce site uniquement en anglais vu que c'est la langue la plus parlé mais il a été définis dans le cahier des charges que l'utilisateur doit avoir le choix entre deux langues que sont l'anglais et le français. Il fallait donc trouver un moyen efficace de pouvoir changer le contenu des labels selon la langue sélectionné.

La première solution qui pourrait venir à l'esprit c'est d'effectuer le chargement du contenu des labels de la page à la main, sur le :

protected void Page_Load(object sender, EventArgs e)


Il suffirait de tester le langage que l'utilisateur a sélectionné (on le sauvegarder dans une variable de Session) et remplir en conséquence.
C'est quand même assez moche comme solution non ?

En surfant sur le net j'ai trouvé une solution simple et éfficace que j'ai adapté et légèrement modifié. En fait la méthode la plus raisonnable est bien évidemment l'utilisation de fichier de ressources contenant le texte. Il y aurait donc un fichier de ressource pour chaque langue multiplié par le nombre de pages du site. Pour créer ces fichiers de ressources, Visual Studio 2005 propose une fonction bien sympathique il faut le dire. Il suffit d'aller dans Tools > Generate Local Ressource (uniquement lorsqu'on est en mode Design), et un nouveau fichier de ressource est généré par rapport au contenu de votre page (Label, Button, DetailView? etc...). Le fichier généré est celui qui sera utilisé par défaut si on ne définit pas la Culture de la page. Ces fichiers sont sous la forme : NomPage?.aspx.resx.
Il faut toujours avoir un fichier de ressource par defaut sous cette forme, ensuite c'est à nous de créer un fichier ressource pour chaque langue. J'ai donc créée deux autres fichiers pour chaque page : NomPage?.aspx.fr-FR.resx et NomPage?.aspx.en-US.resx. Cette notation est trés importante, si les fichiers ne sont pas nommés de cette façon, les fichiers ressources ne pourront pas être chargés dynamiquement par l'application. Il existe bien évidemment de nombreux autres codes : de-CH pour la Suisse par exemple, etc...

Une fois ces fichiers créés il ne reste plus qu'à indiquer à l'application si on souhaite utiliser le français (fr-FR) ou l'anglais (en-US).
Pour cela il suffit de surcharger une méthode de la classe System.Web.UI.Page :
protected override void InitializeCulture()

C'est ici que la mise en place de la culture choisie sera éffectuée. J'ai choisis de sauvegarder le code de la langue sélectionnée dans une variable de session (Session["Language"]). Le code de cette surcharge sera donc :

protected override void InitializeCulture()
{
        if (HttpContext.Current.Session["Language"] != null)
        {
                String selectedLanguage = HttpContext.Current.Session["Language"].ToString();

                UICulture = selectedLanguage;
                Culture = selectedLanguage;

                Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(selectedLanguage);
                Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage);
         }

          base.InitializeCulture();
}


Grace à ce code, le fichier ressource correspondant à la valeur de Session["Language"] (fr-FR ou en-US) sera automatiquement chargé dans la page. Nous n'aurons pas à attribuer la valeur des labels et autres composants à la main !
Cependant c'est quand même assez pénible de devoir coller ce code pour chaque page de notre site, c'est pour cela que j'ai créé une nouvelle classe héritant elle même de System.Web.UI.Page qui surcharge la méthode InitializeCulture?(). De ce fait, toutes mes pages héritent maintenant de cette nouvelle classe et non plus de System.Web.UI.Page, grace à cela nous n'avons pas à copier-coller de partout notre méthode surchargée. C'est quand même plus propre non ? =)