SharePoint et le multilinguisme : Comment gérer la traduction des propriétés dans les toolbars des WebParts
Depuis longtemps, je milite pour l' utilisation systématique des fichiers de ressources dans le développement SharePoint afin de favoriser le multilinguisme !

Je ne suis plus tout seul, heureusement d' ailleurs, d'autre me rejoigne comme ce cher GAT (pour les frenchies, prononcer Gaetan Bouveret
)
Preuve en est son super article sur ASP-PHP (que je ne saurais trop vous conseiller de lire, relire et surtout appliquer !)
http://www.sharepointofview.fr/gat/archive/2008/07/11/internationalisation-des-applications-sharepoint.aspx
En parcourant un peu le site de CodeProject, je suis tombé sur de bien sympathique samples, qui m'ont surtout fait réaliser un oubli cruel.
??? Comment traduire les propriétés partagés des WebPart dans la Toolpart ???



Rappel
Les propriétés des WP correspondent à des propriétés publiques qui ont été décorés avec les attributs WebBrowsable et consoeur du namespace System.ComponentModel et System.Web.UI.WebControls.WebParts
exemple :
[WebBrowsable(true)]
[Personalizable(PersonalizationScope.Shared)]
[WebDisplayName("ListName")]
[WebDescription("ListName")]
[Category("Configuration")]
public string ListName
{
get
{
return _listName;
}
set
{
_listName = value;
}
}
Il est vrai que comme ces arguments sont souvent des paramètres techniques genre : nombre de jour ou nom de la liste de référence, le développeur utilise le nom de la propriété (donc en US bien souvent)
D'ou la problématique : Comment gérer la traduction dynamique de ces attributs déclaratifs ???
Il y a une solution simple à vrai dire
>>> il suffit d'appliquer les techniques de ressources de SharePoint 2007 avec le SPUtility.GetLocalizedRessource sur une classe dérivant justement les attributs WebDisplayName,WebDescription et Category
(Vous me direz, rien de bien nouveau, il s'agit des basiques de l'héritage objet, je sais mais il fallait y penser )
En pratique, vous devez créer 3 classes dans le genre
[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)]
public class SPCategoryAttribute : System.ComponentModel.CategoryAttribute
{
public SPCategoryAttribute(string attribute) : base(attribute) { }
...
[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)]
public class SPWebDisplayNameAttribute : System.Web.UI.WebControls.WebParts.WebDisplayNameAttribute
{
private string _attribute;
public SPWebDisplayNameAttribute(string attribute)
{
_attribute = attribute;
}
...
[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)]
public class SPWebDescriptionAttribute : System.Web.UI.WebControls.WebParts.WebDescriptionAttribute
{
private string _attribute;
public SPWebDescriptionAttribute(string attribute)
{
_attribute = attribute;
}
...
Mais plutôt que continuer avec plein de code (enfin une dizaine tout au plus), je vous conseille plutôt de profiter d'une classe de base contenant toute cette petite mécanique et pourquoi pas en profiter pour rajouter aussi un systéme de log
Non ?
Et pourquoi pas utiliser la classe de base pour WebPart fournir dans le projet SharePointOfView de Codeplex qui gére désormais toute cette problématique ?
Tout simplement. 
A bientôt
PS : bien le bonjour à l'équipe du SOV (SharePoint Of View) !
Renaud Comte aka TheMit (Je code donc je test, variant Dev de "Cogito ergo sum ")
Member of WygTeam
http://www.wygwam.com
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :