none
Affichage d'une date en Français RRS feed

  • Question

  • Salut,

     

    Voilà mon problème qui a l'air pourtant simple mais il n'y a rien à faire, ça ne passe pas, la date s'affiche toujours en anglais.

    Voici mon code : (je peux fournir une archive si c'est plus clair) :

    Le XAML :

    <phone:PhoneApplicationPage 
        x:Class="TestLanguage.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:local="clr-namespace:TestLanguage;assembly=TestLanguage"
        mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        SupportedOrientations="Portrait" Orientation="Portrait"
        shell:SystemTray.IsVisible="True" Loaded="PhoneApplicationPage_Loaded"
        
        >
        <phone:PhoneApplicationPage.Resources>
            <local:StaticDates x:Key="Date" />
            <local:DateTimeToStringConverter x:Key="DateTimeToStringConverter" />
        </phone:PhoneApplicationPage.Resources>
            <!--LayoutRoot is the root grid where all page content is placed-->
        <Grid x:Name="LayoutRoot" Background="Transparent">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
    
            <!--TitlePanel contains the name of the application and page title-->
            <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
                <TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/>
                <TextBlock x:Name="PageTitle" Text="page name" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
            </StackPanel>
    
            <!--ContentPanel - place additional content here-->
            <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <!--<TextBlock Name="testDate" Text="{Binding Source={StaticResource Date}, Path=Today, StringFormat=\{0:dddd dd MMM yyyy\}}"></TextBlock>-->
                <TextBlock Name="testDate" Text="{Binding Source={StaticResource Date}, Path=Today,  Converter={StaticResource DateTimeToStringConverter}, ConverterParameter=dddd dd MMMMM yyyy}"  />
            </Grid>
        </Grid>
     
        <!--Sample code showing usage of ApplicationBar-->
        <!--<phone:PhoneApplicationPage.ApplicationBar>
            <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
                <shell:ApplicationBarIconButton IconUri="/Images/appbar_button1.png" Text="Button 1"/>
                <shell:ApplicationBarIconButton IconUri="/Images/appbar_button2.png" Text="Button 2"/>
                <shell:ApplicationBar.MenuItems>
                    <shell:ApplicationBarMenuItem Text="MenuItem 1"/>
                    <shell:ApplicationBarMenuItem Text="MenuItem 2"/>
                </shell:ApplicationBar.MenuItems>
            </shell:ApplicationBar>
        </phone:PhoneApplicationPage.ApplicationBar>-->
    
    </phone:PhoneApplicationPage>
    


    Le MainPage.cs :

    namespace TestLanguage
    {
        public partial class MainPage : PhoneApplicationPage
        {
            // Constructor
            public MainPage()
            {
                InitializeComponent();
                this.Language = System.Windows.Markup.XmlLanguage.GetLanguage(System.Threading.Thread.CurrentThread.CurrentCulture.Name);
            }
        }
    }
    


    Le Util.cs où j'ai définis qq classes :

    namespace TestLanguage
    {
        public class StaticDates
        {
            public DateTime Today { get { return DateTime.Today; } }
            public DateTime Now { get { return DateTime.Now; } }
        }
    
        public class DateTimeToStringConverter : IValueConverter
        {
    
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if (parameter == null)
                    return ((DateTime)value).ToString(culture);
                else
                    return ((DateTime)value).ToString(parameter as string, culture);
                    //return ((DateTime)value).ToString(parameter as string, System.Threading.Thread.CurrentThread.CurrentCulture).ToUpper();
            }
    
    
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                return value;
            }
        }
    }
    


    Donc logiquement, Il doit afficher la date du jour, sous le format dddd dd MMMM yyyy.

    J'ai essayé avec un StringFormat et avec un Converter perso. Il est précisé sur MSDN que ConverterCulture prend la valeur de la propriété Language. J'ai setté la propriété Language au niveau de la page dans le constructeur à la valeur de culture courant du thread (qui est bien fr-FR sur mon device).

     

    Qqn a une idée ?

     

    Merci :)

    samedi 12 novembre 2011 18:02

Réponses

  • Deux solutions à ton problème :

     

        public class DateTimeToStringConverter : IValueConverter
        {
    
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if (parameter == null)
                    return ((DateTime)value).ToString();
                else
                    return ((DateTime)value).ToString(parameter as string);
            }
    
    
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                return value;
            }
        }

    Ignore tout simplement culture, ton texte sera bien en français.


    Deuxieme solution : 

    Affecte le langage de ton élément avant le binding, en effet, c'est à la construction du binding qu'il va rechercher le langage, tu auras beau changer cette propriété après, cela ne changera rien.

    Par exemple : 
            <TextBlock Name="testDate" Language="FR-fr" Text="{Binding Source={StaticResource Date}, Path=Today,  Converter={StaticResource DateTimeToStringConverter}, ConverterParameter=dddd dd MMMMM yyyy}"  />
        
    Va bien afficher le texte en francais.

    Pour cela, le plus simple est que tu créés le binding au niveau du code behind après le InitializeComponent


    Voila !


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    dimanche 13 novembre 2011 14:52
    Modérateur

Toutes les réponses

  • Deux solutions à ton problème :

     

        public class DateTimeToStringConverter : IValueConverter
        {
    
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if (parameter == null)
                    return ((DateTime)value).ToString();
                else
                    return ((DateTime)value).ToString(parameter as string);
            }
    
    
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                return value;
            }
        }

    Ignore tout simplement culture, ton texte sera bien en français.


    Deuxieme solution : 

    Affecte le langage de ton élément avant le binding, en effet, c'est à la construction du binding qu'il va rechercher le langage, tu auras beau changer cette propriété après, cela ne changera rien.

    Par exemple : 
            <TextBlock Name="testDate" Language="FR-fr" Text="{Binding Source={StaticResource Date}, Path=Today,  Converter={StaticResource DateTimeToStringConverter}, ConverterParameter=dddd dd MMMMM yyyy}"  />
        
    Va bien afficher le texte en francais.

    Pour cela, le plus simple est que tu créés le binding au niveau du code behind après le InitializeComponent


    Voila !


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    dimanche 13 novembre 2011 14:52
    Modérateur
  • Merci :)

    Je me doutais bien que c'était parce que le binding était fait avant mais j'osais espérer que c'était ma façon de faire qui était foireuse.

    dimanche 13 novembre 2011 15:01