This article has been localized into French by the community.
Application Culture / UICulture
Si vous avez déjà un peu manipulé les nombres ou les dates dans votre application WPF, par exemple à cause de l'un des articles de ce tutoriel, vous avez peut-être remarqué quelque chose de sympa : les nombres et les dates ont un format d'affichage qui coïncide avec celui de l'ordinateur. Si vous venez d'un pays anglophone, ça ne vous sautera pas aux yeux, mais si vous vivez dans l'un des NOMBREUX pays où les dates et les nombres s'écrivent différemment, c'est très intéressant.
Et si vous pensez qu'il ne peut pas y avoir tant de différences que ça lorsqu'on formate des trucs aussi simples que des nombres et des dates, je vous suggère de jeter un coup d’œil à cette appli simple, où j'ai formaté le même nombre et la même date en suivant la préférence américaine, allemande et suédoise :
Comme vous le voyez, il y a de subtiles différences sur la façon d'afficher les nombres et les dates. La bonne nouvelle est que le framework .NET peut fortement vous aider - en réalité il le fait déjà : par défaut, les dates et nombres sont formatés d'après les réglages système de l'ordinateur sur lequel est exécuté l'application. La mauvaise nouvelle est que ça peut ne pas avoir le comportement désiré. Mais ne vous inquiétez pas - vous pouvez facilement y remédier. Tout est lié à l'utilisation de la classe CultureInfo, dont vous trouverez plus de détails dans l'onglet du tutoriel C# sur CultureInfo. Pour l'instant, discutons de la façon d'appliquer ces techniques dans votre application WPF.
Formatage ad hoc
Si vous n'avez besoin d'appliquer le formatage que pour une information spécifique, par exemple le contenu d'un seul contrôle Label, vous pouvez aisément le faire à la volée, via une combinaison de la méthode ToString() et de la classe CultureInfo. A titre d'exemple, j'ai appliqué un formatage différent dans l'exemple ci-dessus, plus basé sur la culture comme ceci :
double largeNumber = 123456789.42;
CultureInfo usCulture = new CultureInfo("en-US");
CultureInfo deCulture = new CultureInfo("de-DE");
CultureInfo seCulture = new CultureInfo("sv-SE");
lblNumberUs.Content = largeNumber.ToString("N2", usCulture);
lblNumberDe.Content = largeNumber.ToString("N2", deCulture);
lblNumberSe.Content = largeNumber.ToString("N2", seCulture);
Ceci devrait suffire dans la plupart des cas, où il ne faut appliquer un formatage spécial qu'à quelques endroits, mais en général, vous devez pouvoir décider si votre application utilise les réglages système (par défaut) ou si vous lui substituez un réglage plus spécifique pour l'ensemble de l'application.
CurrentCulture & CurrentUICulture
Appliquer une autre culture à votre application WPF est assez simple.Vous aurez potentiellement à traiter deux attributs visibles dans la propriété CurrentThread de la classe Thread : CurrentCulture et CurrentUICulture. Mais quelle est la différence ?
La propriété CurrentCulture est celle qui contrôle le formatage des nombres, des dates, etc. La valeur par défaut vient du système d'exploitation de l'ordinateur qui exécute l'application, et est indépendante du langage utilisé par les systèmes d'exploitation du pays. Il est par exemple très commun, pour une personne vivant en Allemagne, d'installer Windows avec l'anglais comme langage d'interface, mais en privilégiant la notation allemande des nombres et des dates. Pour une telle situation, la propriété CurrentCulture devrait être placée à "Allemand" (German) par défaut.
La propriété CurrentUICulture spécifie le langage que devrait utiliser l'interface. Ceci n'est pertinent que si votre application supporte plusieurs langages, par exemple par le biais de fichiers de ressource pour les langues. Encore une fois, ceci vous permet d'utiliser une culture pour le langage (par exemple l'anglais) tout en en utilisant une autre (par exemple l'allemand) pour traiter les entrées/sorties de nombres, de dates, etc.
Changer la culture de l'application
Avec ceci en tête, vous devez maintenant décider s'il faut changer la propriété CurrentCulture et/ou CurrentUICulture. Cela peut être fait pratiquement quand vous voulez, mais ça a plus de sens de le faire au démarrage de l'application - autrement, certains résultats pourraient être générés avec la culture par défaut, avant même le changement. Voici un exemple où l'on modifie la culture et la culture UI dans l’évènement Application_Startup(), qui peut être utilisé dans le fichier App.xaml.cs de votre application WPF.
private void Application_Startup(object sender, StartupEventArgs e)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
}
Puisque nous utilisons aussi bien la classe Thread que la classe CultureInfo, n'oubliez pas d'ajouter les namespaces requis à votre fichier, s'ils ne sont pas déjà présents :
using System.Threading;
using System.Globalization;
Ceci mis en place, les nombres et les dates seront désormais formatés en fonction de leur préférence pour l'allemand (de-DE). Comme mentionné précédemment, vous pouvez omettre la ligne définissant la culture de l'UICulture (la dernière ligne) si votre application ne supporte pas plusieurs langues.
Changer la culture durant l'événement Application_Startup, ou au plus tard dans le constructeur de votre fenêtre principale, a plus de sens, car les valeurs déjà générées ne se mettent pas à jour automatiquement lorsque vous changez la propriété CurrentCulture. Cependant, cela ne veut pas dire que vous ne pouvez pas le faire, comme illustré dans ce prochain exemple, qui fait également office de démonstration subtile de la façon dont le résultat est affecté par la propriété CurrentCulture :
<Window x:Class="WpfTutorialSamples.WPF_Application.ApplicationCultureSwitchSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfTutorialSamples.WPF_Application"
mc:Ignorable="d"
Title="ApplicationCultureSwitchSample" Height="200" Width="320">
<StackPanel Margin="20">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label>Number:</Label>
<Label Name="lblNumber" Grid.Column="1" />
<Label Grid.Row="1">Date:</Label>
<Label Name="lblDate" Grid.Row="1" Grid.Column="1" />
</Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,20">
<Button Tag="en-US" Click="CultureInfoSwitchButton_Click" HorizontalContentAlignment="Stretch">English (US)</Button>
<Button Tag="de-DE" Click="CultureInfoSwitchButton_Click" HorizontalContentAlignment="Stretch" Margin="10,0">German (DE)</Button>
<Button Tag="sv-SE" Click="CultureInfoSwitchButton_Click" HorizontalContentAlignment="Stretch">Swedish (SE)</Button>
</StackPanel>
</StackPanel>
</Window>
using System;
using System.Globalization;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
namespace WpfTutorialSamples.WPF_Application
{
public partial class ApplicationCultureSwitchSample : Window
{
public ApplicationCultureSwitchSample()
{
InitializeComponent();
}
private void CultureInfoSwitchButton_Click(object sender, RoutedEventArgs e)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo((sender as Button).Tag.ToString());
lblNumber.Content = (123456789.42d).ToString("N2");
lblDate.Content = DateTime.Now.ToString();
}
}
}
La partie intéressante se trouve dans l'événement CultureInfoSwitchButton_Click, où l'on définit CurrentCulture en fonction du bouton sur lequel on a cliqué, puis où l'on met à jour les labels contenant un nombre et une date :
Culture & Thread : la propriété DefaultThreadCurrentCulture
Si votre application utilise plus d'un thread, vous devriez considérer la propriété DefaultThreadCurrentCulture. On peut la trouver dans la classe CultureInfo (introduite dans le framework .NET v4.5) ; la propriété assure que le thread actuel, mais aussi les threads futurs, utilisera la même culture. Vous pouvez l'utiliser comme ci-dessus, dans l'événement Application_Startup :
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");
Aurez-vous donc à définir les deux propriétés CurrentCulture ET DefaultThreadCurrentCulture ? En réalité, non - si vous n'avez pas déjà modifié la propriété CurrentCulture, définir la propriété DefaultThreadCurrentCulture s'appliquera aussi à la propriété CurrentCulture. En d'autres termes, il est logique d'utiliser DefaultThreadCurrentCulture à la place de CurrentCulture si vous prévoyez d'utiliser plusieurs threads dans votre application - il prendra en compte tous les scenarios.
Résumé
Traiter la culture de votre application WPF est très important, mais fort heureusement, WPF fera en sorte de vous rendre beaucoup de choses prêtes à l'emploi. Si vous avez besoin de changer le comportement par défaut c'est aussi assez simple, en utilisant les propriétés CurrentCulture et CurrentUICulture, comme illustré dans les divers exemples de cet article.