IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

[Converter/Culture] Comment modifier la culture par défaut de mon Converter ?


Sujet :

Windows Presentation Foundation

  1. #1
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut [Converter/Culture] Comment modifier la culture par défaut de mon Converter ?
    Salut,

    Je viens de remarquer un truc bizarre... j'ai codé le convertisseur suivant pour afficher des dates :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     [ValueConversion(typeof(DateTime), typeof(String))]
     public class DateConverter : IValueConverter
     {
         public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null)
                return "";
            string format = "F";
            if (parameter != null)
               format = parameter.ToString();
            DateTime date = (DateTime)value;
            return date.ToString(format, culture.DateTimeFormat);
         }
     
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string strValue = value.ToString();
            DateTime resultDateTime;
            if (DateTime.TryParse(strValue, culture.DateTimeFormat, DateTimeStyles.None, out resultDateTime))
               { return resultDateTime; }
            return value;
         }
     }
    Je l'utilise de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <TextBlock Text="{Binding ReturnDate, Converter={StaticResource convDate}, ConverterParameter=D}" />
    Je m'attendais à avoir en sortie "mercredi 18 juin 2008", mais à la place j'obtiens "Wednesday, June 18, 2008". En mettant un point d'arrêt dans le convertisseur, je vois que la culture transmise à Convert est "en-US". Pourtant mon OS est en français, et Thread.Current.CurrentCulture renvoie bien "fr-FR".

    Quelqu'un aurait une explication et/ou une solution ?
    Je pourrais utiliser Thread.Current.CurrentCulture à la place du paramètre reçu, mais j'aimerais bien comprendre d'où sort ce "en-US"...

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    OK, je viens de trouver... Binding a une propriété ConverterCulture, qui, par défaut, renvoie la culture correspondant au langage de la cible du binding. Et la valeur par défaut de la propriété Language est "en-US"
    Je ne vois pas très bien pourquoi, il me semble que par défaut ça devrait être le langage du système
    Enfin bon, en mettant Language="fr-FR" dans ma fenêtre ça marche bien

    EDIT: une astuce pour utiliser le langage du système :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Language = XmlLanguage.GetLanguage(Thread.CurrentThread.CurrentCulture.IetfLanguageTag);

  3. #3
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    Salut,

    J'ai remarqué ce problème c'est embêtant ...

    Tu exécute cette ligne ou ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    dans le constructeur de ma fenêtre
    c'est pas vraiment idéal, j'aurais préféré pouvoir le faire au niveau de l'application, mais bon...

  5. #5
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    Je vais regarder si c'est pas faisable coté application, si je trouve quelque chose je te ferais signe

    Merci pour le tips

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Autre méthode :

    - Dans le code de l'application :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            public XmlLanguage Language { get; private set; }
     
            protected override void OnStartup(StartupEventArgs e)
            {
                this.Language = this.Language = XmlLanguage.GetLanguage(Thread.CurrentThread.CurrentCulture.IetfLanguageTag);
                base.OnStartup(e);
            }

    - dans l'élément racine de chaque fenêtre :
    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    Language="{Binding Language, Source={x:Static Application.Current}}"
    C'est encore un peu du bricolage mais bon...

  7. #7
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    Voila j'ai trouvé mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        public partial class App : Application
        {
            static App()
            {
                FrameworkElement.LanguageProperty.OverrideMetadata(
                    typeof(FrameworkElement),
                    new FrameworkPropertyMetadata(
                        XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
            }
        }
    Rien d'autre a faire

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    bien vu

  9. #9
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,

    Confronté à ce même problème (qui au passage est assez surprenant... menfin bon ), je suis tombé sur ce post intéressant .

    La solution proposée fonctionne très bien. Mais juste pour info, IetfLanguageTag est dite comme étant "Deprecated." aussi il faut plutôt utiliser la propriété Name .

    Soit donc :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        public partial class App : Application
        {
            static App()
            {
                FrameworkElement.LanguageProperty.OverrideMetadata(
                    typeof(FrameworkElement),
                    new FrameworkPropertyMetadata(
                        XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.Name)));
            }
        }

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    hello je repond un peut tard mais j'ai fait un truc qui ressemble pour notament faire la traduction complete de l'application

    je creer des dictionnary (un par langue)
    je mete en premier dans app.resource celui que je veux utiliser
    et si je veux changer de langue je remplace le premier par celui de la langue selectionné

    a mon avis c'est plus simple
    maintenant si tu veux un exemple je peux aussi te le filer

  11. #11
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,

    Citation Envoyé par ikeas
    hello je repond un peut tard mais j'ai fait un truc qui ressemble pour notament faire la traduction complete de l'application

    je creer des dictionnary (un par langue)
    je mete en premier dans app.resource celui que je veux utiliser
    et si je veux changer de langue je remplace le premier par celui de la langue selectionné

    a mon avis c'est plus simple
    maintenant si tu veux un exemple je peux aussi te le filer
    La problématique du post est un peu différente. Il se trouve que les Converter (et les ValidationRule au passage) utilise le CultureInfo. Et ce CultureInfo a bizarrement une valeur par défaut 'en-US'.

    Pour que nos dates, double, etc. soient donc au format voulu (fr par exemple et pas us : le double utilise une virgule en fr et un point en us par exemple), la solution trouvé a donc été de changer le langage de l'application pour que tous nos Converter et compagnie utilise la bonne culture.

    Pour les textes de l'application ta solution est celle que j'emploie également

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par binoo Voir le message
    La problématique du post est un peu différente. Il se trouve que les Converter (et les ValidationRule au passage) utilise le CultureInfo. Et ce CultureInfo a bizarrement une valeur par défaut 'en-US'.
    Petite remarque en passant... le Converter à l'origine du post n'a plus de raison d'être : le SP1 a introduit la propriété Binding.StringFormat, qui remplace avantageusement le Converter

  14. #14
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Petite remarque en passant... le Converter à l'origine du post n'a plus de raison d'être : le SP1 a introduit la propriété Binding.StringFormat, qui remplace avantageusement le Converter
    Certes mais attention, il existe des scénarios où l'utilisation des convertisseurs reste obligatoire !

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    Certes mais attention, il existe des scénarios où l'utilisation des convertisseurs reste obligatoire !
    oui, bien sûr... mais en l'occurrence ce convertisseur se contentait de formater une date

  16. #16
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    oui moi j'ai mis la chaine de convers dans les resource string et je fais un string.format ou un dattime.tostring(chaine)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment modifier le curseur par défaut de l'application
    Par homeostasie dans le forum Visual C++
    Réponses: 2
    Dernier message: 28/06/2007, 17h56
  2. Comment modifier l'utilisateur par défaut au démarrage de XP SP2 ?
    Par zemeilleurofgreg dans le forum Windows XP
    Réponses: 8
    Dernier message: 14/09/2006, 00h56
  3. Réponses: 4
    Dernier message: 04/10/2005, 01h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo