Internationalisation d'une application ASP.NET MVC 3 Razor

Hinault Romaric DONFACK

Cet article a pour vocation de vous fournir une démarche pour mettre en œuvre pas à pas un site multilingue avec le Framework Web ASP.NET MVC.
Commentez

- Titre : Internationalisation d'une application ASP.NET MVC 3 Razor

- Auteur : Hinault Romaric DONFACK

- Parution : 2 mars 2012

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ®  . Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Prérequis

- III. Ce qu'il faut savoir sur l'internationalisation dans l'écosystème .NET

- IV. Différentes possibilités d'internationalisation d'une application ASP.NET

- V. Création de l'application

- VI. Création des fichiers de ressources

- VI-A. Ce qu'il faut savoir sur les fichiers de ressources

- VI-B. Ce qu'il faut savoir sur la culture

- VI-C. Architecture

- VII. Modification des textes dans la vue et le contrôleur

- VIII. Premier aperçu

- IX. Localisation des messages d'erreur de validation et DisplayAttribute

- IX-A. Localisation des messages d'erreur de validation

- IX-B. Localisation des attributs Display

- X. Mécanisme de sélection de la langue dans l'IU

- X-A. Définition d'une stratégie de routage

- X-B. Définition d'un nouveau contrôleur

- X-C. Création d'un Helper pour générer l'URL localisée

- XI. Conclusion

- XII. Liens

- XIII. Remerciements

I - Introduction

Plusieurs articles sont déjà disponibles sur developpez.com ou sur le Web qui traitent de l'internationalisation d'une application Web ASP.NET. Cependant, pour ASP.NET MVC, il en existe très peu, et il n'y a pas de méthode reconnue comme standard pour écrire un site multilingue avec le framework Web de Microsoft.

En me basant donc du meilleur que j'ai pu tirer de quelques articles par-ci par-là et mon expérience, je suis parvenu à une solution qui répondait à mes besoins pour une application ASP.NET MVC Razor. Cette méthode n'est pas standard et peut-être pas la meilleure, mais elle répond pleinement aux exigences de mon projet et aux objectifs que je voulais atteindre.

II - Prérequis

- Visual Web Developer 2010 ;

- ASP.NET MVC 3 ;

- connaissances de base en C# et sur le moteur de vue Razor.

III - Ce qu'il faut savoir sur l'internationalisation dans l'écosystème .NET

Avant de se lancer dans la création d'un site multilingue en ASP.NET, il y a un certain nombre de concepts que vous devriez au préalable savoir. Lorsqu'on parle d'internationalisation d'une application sur la plateforme .NET, cela implique la mise en œuvre de deux mécanismes principaux à savoir : la globalisation et la localisation.

La globalisation est le processus de conception et de développement d'un produit logiciel adapté à plusieurs cultures. Une application globalisée prend en charge des interfaces utilisateurs localisées et des données régionales pour tous les utilisateurs. Par exemple, le format de la date en zone francophone est jj/mm/aaaa. Dans les pays anglophones, nous avons plutôt le format mm/jj/aaaa. La globalisation va consister à afficher le bon format dans une page en fonction de la langue du navigateur d'un utilisateur ou des options choisies par celui-ci.

La localisation est le processus d'adaptation de votre application à une culture et aux paramètres régionaux donnés. Vous devez pendant cette étape, personnaliser votre application pour les cultures auxquelles vous la destinez. Cette étape doit consister essentiellement en une traduction de l'interface utilisateur vers les langues cibles.

IV - Différentes possibilités d'internationalisation d'une application ASP.NET

Il existe sur la plateforme .NET plusieurs procédés pour rendre son site multilingue. L'internationalisation d'une application peut donc être faite en utilisant soit :

- les fichiers de ressources ;

- des vues différentes pour chaque culture (traduction dans le code) ;

- des fichiers texte ;

- utiliser à la place des fichiers de ressources une base de données ;

- ou combiner la première et la seconde méthode.

Chacune de ces techniques a ses avantages et ses inconvénients, et l'orientation vers l'une d'entre elles dépend aussi entre autres des spécifications de votre projet et des contraintes techniques auxquelles vous êtes confronté. Personnellement je préfère les fichiers de ressources que j'utilise couramment lorsque je suis confronté à cette problématique.

Les fichiers ressources sont des fichiers XML optimisés. Au chargement, ils sont entièrement triés afin de limiter les accès que ce soit au niveau de la mémoire ou des différents disques.

Dans le cadre de ce tutoriel, nous nous limiterons donc uniquement à l'utilisation des fichiers de ressources.

V - Création de l'application

Nous allons commencer dès la base même, par la création d'une nouvelle application qui sera utilisée tout au long de l'article.

Pour ce faire, vous allez démarrer votre EDI Visual Studio. Cliquez sur le menu Fichier, ensuite sur la commande Nouveau projet. Dans la fenêtre qui va s'afficher, sélectionnez le Template de projet ASP.NET MVC 3 Web Application, renseignez le nom de l'application et l'emplacement où celle-ci va être stockée et cliquez sur OK.

Sélectionnez ensuite dans la fenêtre qui va s'afficher le modèle de projet Internet Application, en vous assurant que le moteur de vue qui sera utilisé est Razor.

Cliquez ensuite sur OK pour que Visual Studio procède à la création de votre application.

Si vous exécutez l'application à ce stade, vous vous rendrez compte que le texte affiché par défaut dans vos pages est en anglais.

Puisque vous souhaitez que l'internaute - qu'il soit anglophone ou francophone - puisse se sentir à l'aise dans la navigation sur votre site, vous allez ajouter à celui-ci en plus du support de l'anglais, la prise en charge du français.

Pour atteindre ce résultat, les premières étapes suivantes sont nécessaires :

- création des fichiers de ressources ;

- modification des vues ;

- définition de la culture.

VI - Création des fichiers de ressources

Pour gérer efficacement l'internationalisation dans notre application, nous avons opté pour l'utilisation des fichiers de ressources pour stocker les valeurs qui doivent être localisées.

VI-A - Ce qu'il faut savoir sur les fichiers de ressources

Une ressource est une donnée non exécutable qui est déployée logiquement avec une application. Les ressources peuvent contenir des données sous plusieurs formes, telles que des chaînes, des images ou des objets rendus persistants. Le stockage de vos données dans un fichier de ressources vous permet de changer les données sans avoir à recompiler l'intégralité de votre application.

Le format de fichier de ressources .resx se compose d'entrées XML, qui spécifient des objets et des chaînes dans des balises XML. Le .NET Framework fournit une prise en charge complète pour la création et la localisation des ressources. Celles-ci doivent être créées d'une façon particulière pour fonctionner correctement.

Les fichiers de ressources de la langue par défaut de votre application doivent être nommés comme suit : nom_du_fichier.resx.

Les fichiers pour les autres langues doivent suivre le format suivant : nom_du_fichier.culture.resx.

VI-B - Ce qu'il faut savoir sur la culture

La culture ici doit définir le code de la langue. Un code de langue est une convention symbolique permettant d'identifier une langue ou une variété dialectale ou régionale, ou un ensemble de langues par un identifiant défini dans un code, sans avoir à nommer la langue désignée elle-même.

La culture peut être neutre. Dans ce cas, elle sera codée sur deux caractères.

Exemple : en pour l'anglais et fr pour le français.

Ou être stricte. Dans ce cas, elle sera codée sur quatre caractères ayant le format suivant " xx-XX ", deux caractères minuscules pour la langue, et les deux suivantes en majuscules pour la variante régionale.

Exemple : fr-FR pour le français de France, en-US pour l'anglais des États-Unis et en-GB pour l'anglais de la Grande-Bretagne.

Le fichier de ressources par défaut est utilisé si aucune culture n'est définie dans l'application ou si aucune ressource n'existe pour la culture qui a été définie.

VI-C - Architecture

Pour rester dans la logique de regroupement qu'impose ASP.NET MVC, il est préférable que l'arborescence de vos fichiers de ressources soit semblable à la capture ci-dessous :

Vous allez donc créer un dossier Ressources, en faisant un clic droit dans l'explorateur de projets et en cliquant sur Ajouter, puis en sélectionnant l'option Nouveau dossier.

Dans ce dossier vous allez procéder de même pour créer les dossiers Models, Views, etc.

Par la suite, vous devez créer les différents fichiers de ressources.

Je vous recommande de commencer par celui de la page Layout.chtml. Pour cela, vous allez créer les fichiers Layout.resx pour la langue par défaut et Layout.fr.resx pour le français.

Pour créer ces fichiers, faites un clic droit sur le sous-dossier Shared, sélectionnez l'option Ajouter, puis cliquez sur Ajouter un nouvel élément.

Dans la boite de dialogue qui va s'afficher, sélectionnez le type de fichier Ressources File, et renseignez le nom _Layout.resx dans la zone réservée à cet effet, puis cliquez sur Ajouter.

Faites de même pour créer le fichier Layout.fr.resx et les autres fichiers de ressources.

Maintenant, vous devez déplacer les textes qui sont dans votre fichier _Layout.cshtml dans le fichier de ressources, en renseignant le nom (comme celui d'une variable), la valeur (qui est le texte contenu dans le page) et une description s'il y a lieu.

Prenez la peine de vérifier que la zone " Access Modifier " est définie à Public. Sinon, les valeurs que vous avez définies ne seront pas accessibles dans les vues.

Renseignez également la traduction de ces textes pour le fichier _Layout.fr.resx.

Attention, le nom doit être le même que celui que vous avez défini dans le fichier de ressources par défaut pour cette page.

Contrairement à ASP.NET WebForms où il est conseillé de créer les fichiers de ressources dans les dossiers App_GlobalResources et App_LocalResources, avec ASP.NET MVC, l'utilisation de ces dossiers sera une source de problèmes pour vous. Je vous conseille donc d'utiliser un dossier différent (comme ce que nous avons fait plus haut), ou créer les ressources dans une bibliothèque séparée.

Pour plus de détails sur le sujet, je vous invite à lire cet excellent billet de blog de K. Scott Allen : Resource Files and ASP.NET MVC Projects.

VII - Modification des textes dans la vue et le contrôleur

Maintenant que vous avez transféré le texte de la vue vers les fichiers de ressources, vous devez maintenant faire pointer les zones d'affichage de ces textes vers les ressources correspondantes.

Pour cela, ouvrez le fichier Layout.chstml et remplacez le texte suivant :

<div id="title">
<h1>My MVC Application</h1>
</div>

Par

<div id="title">
<h1> @MvcApplication1.Resources.Views.Shared._Layout.Title</h1>
</div>

En observant ces lignes de code, vous pouvez constater que la valeur est accessible comme une propriété de classe. En effet, toutes les ressources sont compilées vers une DLL (MvcApplication1.Resources.Views.Shared). Le nom du fichier (_Layout) est utilisé comme nom de la classe et le nom donné au texte est considéré comme celui de la propriété de la classe.

Dans le contrôleur, vous pouvez procéder comme suit pour modifier les textes qui y sont renseignés :

public ActionResult Index()
{
ViewBag.Message = Resources.Views.Home.Index.Heading;

return View();
}

VIII - Premier aperçu

À ce stade, si tout est correct, vous pouvez déjà obtenir un premier aperçu de votre application localisée en définissant juste la culture qui est utilisée par celle-ci.

Pour cela, vous pouvez simplement définir la culture dans le fichier Globla.ascx.cs en utilisant la méthode Application_BeginRequest qui est exécutée lors du lancement de l'application. Le code permettant de faire cela est le suivant :

protected void Application_BeginRequest(object sender, EventArgs e)
{

Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("fr");
}

En modifiant le paramètre qui est passé à la fonction, CreateSpecificCulture() entre l'anglais(en) et le français(fr), on obtient le résultat suivant :

Vous pouvez également définir la culture qui sera utilisée par défaut dans le fichier Web.Config au sein de l'attribut Globalisation comme l'illustre l'exemple ci-dessous.

<globalization culture="fr-FR" uiCulture="auto:fr" />

Nous avons défini une seule valeur localisée pour la vue Layout. Vous pouvez faire de même pour les autres vues.

IX - Localisation des messages d'erreur de validation et DisplayAttribute

IX-A - Localisation des messages d'erreur de validation

Avec ASP.NET MVC, il est possible de définir les messages d'erreur de validation dans le modèle, au sein des attributs fournis par l'espace de nom DataAnnotations utilisé pour la validation des données utilisateur. Il est également possible de définir les textes par défaut qui seront affichés dans les vues pour les intitulés des champs des formulaires.

Si vous avez donc défini ces infirmations dans votre modèle, vous allez vous rendre compte que ce que nous avons fait jusqu'ici ne permet pas de localiser ces champs texte.

Nous allons créer dans notre application un formulaire permettant l'enregistrement des produits. La classe qui sera utilisée est la suivante :

public class ProductModel
{
public string Name { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
}

Pour créer le modèle correspondant, ajoutez au dossier Model un fichier de classe ProductModel.cs qui contiendra le code ci-dessus.

À ce stade, aucune logique de validation des données n'est implémentée. À l'aide de DataAnnotations, nous allons mettre en œuvre la validation des données pour cette classe.

Le nouveau code de la classe ProductModel produit est le suivant :

public class ProductModel
{
[Required(ErrorMessage = "Le libellé du produit est obligatoire")]
[Display(Name = "Nom")]
public string Name { get; set; }
[Required(ErrorMessage = "La description du produit est obligatoire")]
[Display(Name = "Description")]
public string Description { get; set; }
[Required(ErrorMessage = "Le prix est obligatoire")]
[Display(Name = "Prix")]
[Range(0.01, 400.00, ErrorMessage = "Le prix doit être compris entre 0.01 et 400.00")]
public decimal Price { get; set; }
}

Nous allons commencer par internationaliser les messages d'erreur de validation.

Pour cela, dans le sous-dossier Model du dossier Resources, vous allez créer deux nouveaux fichiers de ressources ProductModel, dans lesquels vous allez définir les messages d'erreur de validation pour cette classe comme l'illustre la capture ci-dessous.

Pour localiser ces valeurs, nous allons utiliser les propriétés ErrorMessageResourceType et ErrorMessageResourceName.

La propriété ErrorMessageResourceType permet de spécifier le type .NET qui correspond au fichier de ressources à utiliser.

La propriété ErrorMessageResourceName, quant à elle, sera utilisée pour définir le nom de la ressource pour rechercher le message d'erreur.

Le nouveau code de la classe ProductModel permettant donc de faire cela est le suivant :

public class ProductModel
{
[Required(ErrorMessageResourceType = typeof(MvcApplication1.Resources.Models.ProductModel),
ErrorMessageResourceName = "NameRequired")]
[Display(Name = "Nom)]
public string Name { get; set; }
[Required(ErrorMessageResourceType = typeof(MvcApplication1.Resources.Models.ProductModel),
ErrorMessageResourceName = "DescriptionRequired")]
[Display(Name = "Description")]
public string Description { get; set; }
[Required(ErrorMessageResourceType = typeof(MvcApplication1.Resources.Models.ProductModel),
ErrorMessageResourceName = "PriceRequired")]
[Display(Name = "Prix")]
[Range(0.01, 400.00, ErrorMessageResourceType = typeof(MvcApplication1.Resources.Models.ProductModel),
ErrorMessageResourceName = "PriceRange")]
public decimal Price { get; set; }
}

À ce stade, si nous exécutons notre application, nous obtenons le résultat suivant :

Pour l'anglais

Pour le français

Nous avons finalisé avec les messages d'erreur de validation. Passons maintenant à la localisation des attributs Display.

IX-B - Localisation des attributs Display

Avec la version précédente d'ASP.NET MVC, la définition des noms des propriétés qui seront affichées dans l'interface utilisateur se faisait en décorant la propriété avec la classe DisplayNameAttribute. Cependant, elle ne possède qu'un seul constructeur et ne supporte pas de ce fait la localisation.

Pour internationaliser ces valeurs, il fallait donc du code personnalisé après beaucoup d'efforts de programmation. Ce problème est résolu avec ASP.NET MVC 3. La localisation des noms des propriétés peut se faire assez aisément dans le modèle en utilisant la classe DisplayAttribute.

Cette classe possède plusieurs propriétés, y compris les propriétés ResourceType, permettant de définir le type de ressource pour les propriétés localisées et Name pour définir le nom de la ressource.

Le nouveau code de la classe ProductModel sera donc le suivant :

public class ProductModel
{
[Required(ErrorMessageResourceType = typeof(MvcApplication1.Resources.Models.ProductModel),
ErrorMessageResourceName = "NameRequired")]
[Display(Name = "DisplayName", ResourceType = typeof(MvcApplication1.Resources.Models.ProductModel))]
public string Name { get; set; }
[Required(ErrorMessageResourceType = typeof(MvcApplication1.Resources.Models.ProductModel),
ErrorMessageResourceName = "DescriptionRequired")]
[Display(Name = "DisplayDescription", ResourceType = typeof(MvcApplication1.Resources.Models.ProductModel))]
public string Description { get; set; }
[Required(ErrorMessageResourceType = typeof(MvcApplication1.Resources.Models.ProductModel),
ErrorMessageResourceName = "PriceRequired")]
[Display(Name = "DisplayPrice", ResourceType = typeof(MvcApplication1.Resources.Models.ProductModel))]
[Range(0.01, 400.00, ErrorMessageResourceType = typeof(MvcApplication1.Resources.Models.ProductModel),
ErrorMessageResourceName = "PriceRange")]
public decimal Price { get; set; }
}

Les fichiers de ressources utilisés seront modifiés comme suit :

À ce stade, si nous exécutons notre application, nous obtenons le résultat suivant :

Pour l'anglais

Pour le français

Et voilà, nous venons de finir avec la localisation des textes du modèle. Vous pouvez vous rendre compte combien, il est facile grâce aux nouveautés introduites par ASP.NET MVC 3 d'internationaliser les messages d'erreur de validation et les intitulés des champs des formulaires dans la vue.

X - Mécanisme de sélection de la langue dans l'IU

Jusqu'ici, lors des tests, vous pouvez vous rendre compte que notre application ne dispose d'aucun mécanisme permettant à un utilisateur de choisir une langue ou de basculer d'une langue à une autre à tout moment à partir de l'interface.

X-A - Définition d'une stratégie de routage

Dans notre cas, nous allons définir la langue qui est utilisée dans L'URL. Pour cela, nous allons commencer par définir la stratégie de routage qui sera utilisée dans notre application, en spécifiant la langue. L'URL que nous allons utiliser sera sous la forme suivante :

http://localhost/fr/home/index pour le français

et

http://localhost/en/home/index pour l'anglais.

La route par défaut dans ASP.NET MVC 3 est définie sous la forme : http://localhost/controller/action/id. À partir de là, nous allons définir de nouveaux paramètres de route qui permettront de générer l'URL avec la langue. Pour cela, nous allons définir la route sous la forme suivante : http://localhost/lang/controller/action/id.

Pour atteindre ce résultat, il suffit de modifier le fichier Global.ascx.cs et enregistrer une nouvelle route. Le code pour faire cela est le suivant :

public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("favicon.ico");

routes.MapRoute(
"LocalizedDefault", // Route name
"{lang}/{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}

X-B - Définition d'un nouveau contrôleur

Maintenant, vous devez ajouter un nouveau contrôleur (BaseController) qui héritera de System.Web.Mvc.Controller. Sa fonction principale sera de changer la langue du Thread d'exécution courant selon la valeur de la langue dans l'URL ou dans un cookie existant, et sauvegarder le choix linguistique de l'utilisateur dans un cookie si ce n'est pas déjà fait. Si aucune langue n'est spécifiée dans l'URL, la langue du Thread d'exécution sera modifiée en utilisant par défaut la langue du navigateur de l'utilisateur.

Le code pour faire cela est le suivant :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Text;
using System.Threading;
using System.Globalization;

namespace MvcApplication1.Controllers
{
public class BaseController : Controller
{
//
// GET: /Base/

protected override void ExecuteCore()
{
if (RouteData.Values["lang"] != null &&
!string.IsNullOrWhiteSpace(RouteData.Values["lang"].ToString()))
{
// modification de la culture dans les données de la route
var lang = RouteData.Values["lang"].ToString();
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(lang);
}
else
{
// chargement de la culture depuis un cookie
var cookie = HttpContext.Request.Cookies["MvcApplication1.CurrentUICulture"];
var langHeader = string.Empty;
if (cookie != null)
{
// modification de la culture avec la valeur dans le cookie
langHeader = cookie.Value;
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(langHeader);
}
else
{
// utilisation de la langue par défaut du navigateur si la culture n'est pas spécifiée
langHeader = HttpContext.Request.UserLanguages[0];
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(langHeader);
}
// modification de la culture dans les données de la route
RouteData.Values["lang"] = langHeader;
}

// sauvegarde de la culture dans un cookie
HttpCookie _cookie = new HttpCookie("MvcApplication1.CurrentUICulture", Thread.CurrentThread.CurrentUICulture.Name);
_cookie.Expires = DateTime.Now.AddYears(1);
HttpContext.Response.SetCookie(_cookie);

base.ExecuteCore();
}

}
}

Tous les contrôleurs de l'application doivent être modifiés pour hériter de ce contrôleur (Basecontroller).

public class HomeController : BaseController

X-C - Création d'un Helper pour générer l'URL localisée

Après avoir enregistré la route localisée, nous devons procéder à l'écriture d'une fonction permettant de générer l'URL localisée en fonction du choix de la langue de l'utilisateur.

Pour cela, nous allons ajouter un HTML Helper dans notre projet. Les Helpers HTML sont des méthodes d'extension pour les classes HtmlHelper. Ces méthodes sont accessibles dans une vue à partir de la méthode HTML.

Le code pour notre Helper HTML est le suivant :

public static class SwitchLanguageHelper
{
public class Language
{
public string Url { get; set; }
public string ActionName { get; set; }
public string ControllerName { get; set; }
public RouteValueDictionary RouteValues { get; set; }
public bool IsSelected { get; set; }

public MvcHtmlString HtmlSafeUrl
{
get
{
return MvcHtmlString.Create(Url);
}
}
}

public static Language LanguageUrl(this HtmlHelper helper, string cultureName,
string languageRouteName = "lang", bool strictSelected = false)
{

cultureName = cultureName.ToLower();
// récupération des valeurs de ka route depuis le view context
var routeValues = new RouteValueDictionary(helper.ViewContext.RouteData.Values);

//copie de la chaine de requête dans les valeurs de route pour générer le nouveau lien
var queryString = helper.ViewContext.HttpContext.Request.QueryString;
foreach (string key in queryString)
{
if (queryString[key] != null && !string.IsNullOrWhiteSpace(key))
{
if (routeValues.ContainsKey(key))
{
routeValues[key] = queryString[key];
}
else
{
routeValues.Add(key, queryString[key]);
}
}
}
var actionName = routeValues["action"].ToString();
var controllerName = routeValues["controller"].ToString();
//modification de la langue dans les valeurs de route
routeValues[languageRouteName] = cultureName;
//génération de l'URL avec la langue
var urlHelper = new UrlHelper(helper.ViewContext.RequestContext, helper.RouteCollection);
var url = urlHelper.RouteUrl("LocalizedDefault", routeValues);
// vérification si la culture courante correspond à celle passée en paramètre
var current_lang_name = Thread.CurrentThread.CurrentUICulture.Name.ToLower();
var isSelected = strictSelected ?
current_lang_name == cultureName :
current_lang_name.StartsWith(cultureName);
return new Language()
{
Url = url,
ActionName = actionName,
ControllerName = controllerName,
RouteValues = routeValues,
IsSelected = isSelected
};
}

public static MvcHtmlString LanguageSelectorLink(this HtmlHelper helper,
string cultureName, string selectedText, string unselectedText,
IDictionary htmlAttributes, string languageRouteName = "lang", bool strictSelected = false)
{
var language = helper.LanguageUrl(cultureName, languageRouteName, strictSelected);
var link = helper.RouteLink(language.IsSelected ? selectedText : unselectedText,
"LocalizedDefault", language.RouteValues);
return link;
}

}

Enfin, dans le dossier View/Shared, nous allons ajouter une vue partielle (_SelectLanguage.cshtml) pour la sélection de la langue par l'utilisateur.

Le code pour cette page est le suivant :

@using MvcApplication1.MyHelper

@Html.LanguageSelectorLink("en-US", "[English]", "English", null)
@Html.LanguageSelectorLink("fr-FR", "[Français]", "Français", null)

La vue partielle doit être appelée dans le Layout de votre projet :

<div id="logindisplay">
@Html.Partial("_LogOnPartial")
@Html.Partial("_SelectLanguage")
</div>

Nous pouvons maintenant exécuter l'application pour voir le résultat final comme l'illustrent les captures suivantes :

XI - Conclusion

Cet article a décrit avec autant de détails que possible comment procéder pas à pas à l'internationalisation d'une application ASP.NET MVC 3. Au travers de celui-ci, vous avez découvert les améliorations qui ont été apportées au framework pour la création des applications multilingues.

XII - Liens

Présentation du moteur de vue Razor

Les nouveautés d'ASP.NET MVC 3

Internationalisation d'une application ASP.Net grâce à une base de données

Codage et localisation

ASP.NET MVC 2 Localization complete guide

Creating a Bilingual ASP.NET MVC 3 Application - Part I

Localization in ASP.NET MVC - 3 Days Investigation, 1 Day Job

ASP.NET MVC 3 Internationalization

XIII - Remerciements

Je tiens à remercier ClaudeLELOUP pour sa relecture et correction orthographique.