Internationalisation d’une application ASP.NET MVC 3 Razor part 2 : messages d’erreur de validation et DisplayAttribute

Dans mon précédent billet de blog, nous nous sommes familiarisés avec les différents concepts qui sont liés à l’internationalisation d’une application sur l’écosystème .NET. Nous avons également procédé à la création des fichiers de ressources et obtenu un premier aperçu de notre application.

Cependant, avec ASP.NET MVC, il est possible de définir les messages des erreurs de validation dans le modèle, au sein des attributs fournis par l’espace de noms 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 verrons donc dans ce billet comment internationaliser les messages des erreurs de validation et les intitulés des champs des formulaires définis dans le modèle.

Pour cet exemple, nous allons créer dans l’application que nous avons utilisée précédemment (dans la partie 1) 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 = "La 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 des erreurs 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’erreurs 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 de message d’erreur qui est associé à un contrôle de validation.
La propriété ErrorMessageResourceName, quant à elle, sera utilisée pour définir le nom de la ressource pour recherche 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 des erreurs de validation. Passons maintenant à la 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 donc ces valeurs, il fallait du code personnalisé après beaucoup d’effort 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.

La prochaine étape sera la mise au point sur l’interface utilisateur d’un mécanisme permettant à l’internaute de modifier la culture pour faire passer l’application d’une langue à une autre.

Laisser un commentaire