Olivier Dahan

Microsoft MVP Silverlight 2013, 2012,
2011, MVP CAD 2010, MVP C# 2009


Membre du Developer Guidance Advisory Council Microsoft

Audit, Conseil, Formation, Développement
[WPF, Silverlight, WinRT, MonoDroid]

Historique

StringFormat se joue de votre culture !

Lesen Sie diesen Artikel in Ihrer Sprache IT | EN | DE | ES

Silverlight 4 a introduit le paramètre StringFormat dans la syntaxe du Binding. C’est une excellente chose et supprime le besoin de développer un convertisseur pour la moindre mise en forme de données. Toutefois il y a un petit bug... StringFormat ignore la culture de l’utilisateur et en bon ricain qu’il est, il considère que tout le monde parle la langue des cowboys...

On aime bien les cowboys

On les aime bien, c’est un fait, sinon leurs films, leurs musiques et même leur hamburgers ne se vendraient pas comme des ... petits pains dans notre joli pays à la culture millénaire...

L’utilisateur cette bête étrange

Mais l’utilisateur, cette animal étrange que certains disent avoir déjà vu (info ou intox ? légendes urbaines ? Les témoignages sont-ils fiables ?) semble avoir des gouts pour le moins paradoxaux... S’il se jette sur le premier IPhone venu, s’il déjeune le midi en se “régalant” d’un big Mac (il y a une astuce ou pas ?), s’il se gave de streaming d’Avatar en écoutant le top 50 chanté en langue Hollywood (pour le chewing-gum qu’ils ont dans la bouche en parlant certainement), l’utilisateur, entité pourtant pensante (mais aucun article là dessus n’a été publié dans une revue scientifique à comité de lecture, restons méfiant donc) ne supporte pas un seul instant que ne serait-ce qu’un bout de texte apparaisse en anglais sur son écran !

Il est soudain pris de convulsions, on parle même d’une forme d’œdème du visage entrainant, certainement par mauvaise oxygénation du cerveau, l’émission non contrôlée de quelques jurons gaulois. “Fascinating” aurait dit M. Spock en prenant connaissance de ce comportement terrien.

Drôle de bestiaux quand même... Certainement qu’il est plus facile de se gaver de hamburgers et de musique made in USA que d’apprendre la langue. Le français a une réputation de feignant peut-être méritée, allez savoir...

L’informaticien ce coupable !

Forcément coupable puisque complice de l’anti-France, la fameuse sous-culture-américaine-qui ne-vaut-rien, disent-ils la bouche pleine de Cheeseburger et les oreillettes de leur IPod crachant à fond la rétrospective de Mickael Jackson...

C’est donc forcément lui, en bout de course, qui se fera remonter les bretelles (expression idiote, puisqu’à part Harold Hyman sur BFM TV, personne ne porte plus de bretelles depuis la dernière guerre – remarquons qu’il est américain le bougre, si c’est pas une preuve !).

La solution !

Bon, je vais vous la donner, mais lorsque vous allez voir la longueur de la chose vous allez comprendre pourquoi j’ai un peu brodé autour du sujet !

Le plus simple pour régler la question est ainsi d’ajouter dans le constructeur de toutes les Vues d’une application (on ne sait jamais où on utilisera un StringFormat en Xaml) :

this.Language = XmlLanguage.GetLanguage(Thread.CurrentThread.CurrentCulture.Name);

Voilà... A noter que XmlLanguage se trouve dans le namespace System.Windows.Markup qu’il faut ajouter (soit en using, soit avec un point devant XmlLanguage...).

Conclusion

Il fallait un peu d’humour pour habiller cette “ruse” qui permet de contourner ce léger bug de StringFormat tant le sujet est peu passionnant en lui-même et la solution d’une brièveté déconcertante.

J’ai encore sauvé quelques informaticiens de la fusillades... Mais ne me remerciez pas, les utilisateurs trouveront bien d’autres raisons pour vous maudire ! Sourire

Comments (4) -

Ramah
Ramah
3/17/2011 1:02:04 PM

Thx

PS: ne manque t'il pas le "stay tuned"? Smile

Oliv
Oliv
3/17/2011 5:06:38 PM

M'étant quelque peu pris la tête sur le sujet je me permet d'apporter quelques précision sur le cas qui s'est présenté à moi :
- Le StringFormat n'est pas le seul touché : Les Converter n'ayant pas de culture spécifiée se voient également ralliés au Hyyyaa général.
- Tout les custom ContentControl fils devaient posséder cette petite ligne magique (this.Language = ...), il semble que les droit de successions sur l'héritage soient eux aussi porteur de l'éperon. Ex: Les Converter/StringFormat dans MonContentControl buvaient du doctor pepper alors que ma Childwindow etait une frenchie pure et dure.

Keep it real !

Olivier
Olivier
3/17/2011 6:30:04 PM

@Ramah: Y'en un qui suit ! Smile
Si,il manque le "stay tuned", mais les lecteurs fidèles ont rectifié d'eux mêmes ! Smile

Olivier
Olivier
3/17/2011 6:37:26 PM

@Oliv: Il est vrai que les convertisseurs se chargent souvent de convertir des valeurs raw d'un type à un autre (bool vers visibility par exemple) et qu'on ne s'aperçoit pas trop du problème. Mais si on s'en sert pour faire du formatage, ce que normalement StringFormat permet d'éviter, on peut avoir de mauvaises surprises. Mais il faut noter que les convertisseur ont un paramètre de culture, et on peut s'imaginer qu'il sert à quelque chose, alors que le StringFormat n'est qu'une commande simple ne donnant pas l'impression de pouvoir être personnalisées. L'astuce présentée contourne le problème qui est bien un bug.
Il y a aussi une autre voie que j'exploite souvent : en MVVM le ViewModel est là pour proposer, adapter et persister les données pour la Vue. Dès lors qu'on suit cette pattern il est bien plus commode d'ajouter par exemple une propriété IsNotBusy quand IsBusy existe déjà plutôt que de créer un convertisseur plus une ressource xaml juste quand on a besoin d'une valeur et son contaire. Un autre exemple concerne justement le formatage, si j'ai besoin d'une date ou d'une heure présentée d'une certaine façon, je préfère doubler la propriété "DateTime LaDate" par une seconde "string LaDateStr" que le VM formatte comme il veut (échappant ainsi et aussi au bug du StringFormat).
Comme toujours il y a 100 façons d'arriver au même résultat et certains problèmes n'apparaissent que sur certains chemins (heureusement!) ce qui en laisse d'autres libres pour s'en sortir !

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading