J'ai une application WPF .NET 4.0 dans laquelle l'utilisateur peut changer la langue (culture). Je laisse simplement l'utilisateur sélectionner une langue, créer un CultureInfo correspondant et le définir :
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
Dans le code C#, cela fonctionne bien. Cependant, dans les contrôles WPF, la culture est toujours en-US. Cela signifie par exemple que les dates seront affichées au format américain au lieu du format correct pour la culture actuelle.
Apparemment, ce n'est pas un bug. Selon MSDN et plusieurs billets de blog et articles sur StackOverflow, le langage WPF ne suit pas automatiquement la culture actuelle. Il est en-US jusqu'à ce que vous fassiez cela :
FrameworkElement.LanguageProperty.OverrideMetadata(
typeof(FrameworkElement),
new FrameworkPropertyMetadata(
XmlLanguage.GetLanguage(CultureInfo.CurrentUICulture.IetfLanguageTag)));
Voir par exemple Problèmes de localisation de StringFormat dans wpf .
Je ne comprends pas complètement ce qui se passe ici. Il semble que la propriété Language de tous les éléments du cadre soit définie sur la culture actuelle. Quoi qu'il en soit, cela fonctionne. Je fais cela au démarrage de l'application et maintenant tous les contrôles fonctionnent comme prévu, et par exemple les dates sont formatées en fonction de la culture actuelle.
Mais maintenant le problème : Selon MSDN FrameworkElement.LanguageProperty.OverrideMetadata
ne peut être appelé qu'une seule fois. Et en effet, si je l'appelle à nouveau (lorsque l'utilisateur change de langue), une exception sera levée. Je n'ai donc pas vraiment résolu mon problème.
La question : Comment puis-je mettre à jour de manière fiable la culture dans WPF plus d'une fois et à tout moment du cycle de vie de mes applications ?
(J'ai trouvé ceci en faisant des recherches : http://www.nbdtech.com/Blog/archive/2009/03/18/getting-a-wpf-application-to-pick-up-the-correct-regional.aspx et on dirait qu'il a quelque chose qui marche là. Cependant, je n'arrive pas à imaginer comment le faire dans mon application. Il semble que je doive mettre à jour la langue dans toutes les fenêtres et tous les contrôles ouverts et rafraîchir tous les liens existants, etc.)
1 votes
Je n'ai jamais trouvé le moyen de faire ce que je demandais dans la question.