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

C# Discussion :

Bibliothèque de classe multilingue


Sujet :

C#

  1. #1
    Modérateur
    Avatar de toopac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 940
    Points : 2 913
    Points
    2 913
    Par défaut Bibliothèque de classe multilingue
    Bonjour,

    J'ai un service web qui fait appel à une bibliothèque de classes pour différents traitements. Les éventuels messages d'erreur renvoyés sont en français ou en anglais.

    J'ai donc créé deux fichiers ressources CustomError.resx et CustomeError.en-GB.resx (dans un dossier Ressources) et une méthode SetLanguage qui défini le langage en cours.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private void SetLanguage(string language) //fr-FR ou en-GB pour l'instant
    {
        [...]
        Thread.CurrentThread.CurrentCulture = new CultureInfo(language);
        Thread.CurrentThread.CurrentUICulture = new CultureInfo(language);
        Ressources.CustomError.Culture = new CultureInfo(language); 
        [...]
    }
    Lorsque je veux récupérer un message d'erreur je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string errorMesage = Ressources.CustomError.Error1;
    Le problème c'est que je peux mettre n'importe quoi comme langue, je récupère toujours le message en français.


    Il manque quelque chose, ou c'est tout simplement pas la bonne façon de faire?

  2. #2
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Le Ressources.CustomError n'est pas nécessaire mais ça ne devrait pas poser de problèmes.
    A première vue c'est bon. Si tu vas en debug sur la ligne ou tu prend Error1, est-ce que la culture du currenthread est bien sur "en-GB"?
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  3. #3
    Modérateur
    Avatar de toopac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 940
    Points : 2 913
    Points
    2 913
    Par défaut
    Bonjour, EquinoxeDotNet

    Voilà le test que j'ai fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SetLanguage("fr-FR");
    string currentThreadCulture1 = Thread.CurrentThread.CurrentCulture.Name;
    string currentThreadUICulture1 = Thread.CurrentThread.CurrentUICulture.Name;
    string customErrorCulture1 = Ressources.CustomError.Culture.Name;
    string errCodeFr = Ressources.CustomError.ERR01;
     
    SetLanguage("en-GB");
    string currentThreadCulture2 = Thread.CurrentThread.CurrentCulture.Name;
    string currentThreadUICulture2 = Thread.CurrentThread.CurrentUICulture.Name; 
    string customErrorCulture2 = Ressources.CustomError.Culture.Name;
    string errCodeEn = Ressources.CustomError.ERR01;
    et les résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    currentThreadCulture1 = "fr-FR"
    currentThreadUICulture1 = "fr-FR"
    customErrorCulture1 = "fr-FR"
    errCodeFr = "Message d'erreur Français"
     
    currentThreadCulture2 = "en-GB"
    currentThreadUICulture2 = "en-GB"
    customErrorCulture2 = "en-GB"
    errCodeEn = "Message d'erreur Français"
    Donc la culture du currenthread est bien sur en-GB, mais j'obtiens toujours le message en français...

    ERR01 est bien défini dans les deux fichiers resx, avec une valeur en français dans CustomError.resx et une valeur en anglais dans CustomeError.en-GB.resx.CustomError.en-GB.resx

  4. #4
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Il y a un fichier qui s'appelle CustomError.resx et l'autre CustomeError.en-GB.resx . C'est probablement ça, les 2 doivent avoir le même nom.
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  5. #5
    Modérateur
    Avatar de toopac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 940
    Points : 2 913
    Points
    2 913
    Par défaut
    C'est une erreur de frappe de ma part.
    Les deux ont bien le même nom

  6. #6
    Modérateur
    Avatar de toopac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 940
    Points : 2 913
    Points
    2 913
    Par défaut
    Je ne trouve pas vraiment de doc pour une bibliothèque de classe, mais que pour du WinForm, de l'ASP ou du WPF.

    ce que je ne comprend pas c'est que pourtant en regardant le code généré par VS dans CustomError.Designer.cs, tout semble correspondre à ce que j'ai pu trouver :

    Le RessourceManager :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /// <summary>
    ///   Retourne l'instance ResourceManager mise en cache utilisée par cette classe.
    /// </summary>[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
    internal static global::System.Resources.ResourceManager ResourceManager {
        get {
            if (object.ReferenceEquals(resourceMan, null)) {
                global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DocumentDistributionServiceCore.Ressources.CustomError", typeof(CustomError).Assembly);
                resourceMan = temp;
            }
            return resourceMan;
        }
    }
    changement de culture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /// <summary>
    ///   Remplace la propriété CurrentUICulture du thread actuel pour toutes
    ///   les recherches de ressources à l'aide de cette classe de ressource fortement typée.
    /// </summary>
    [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
    internal static global::System.Globalization.CultureInfo Culture {
        get {
            return resourceCulture;
        }
        set {
            resourceCulture = value;
        }
    }
    Récupération de la valeur de ERR01:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    internal static string ERR01 {
        get {
            return ResourceManager.GetString("ERR01", resourceCulture);
        }
    }
    J'ai fais d'autres tests, avec d'autres fichiers de ressources en les créant dans un ordre différent, d'autres langues, l'anglais comme langue pas défaut, en changeant les modificateur d'accès, mais rien n'y fait, la valeur est toujours celle dans le fichier '<nom>.resx', et non celle du ficher '<nom>.<locale>.resx' (quand Culture info et instanciée avec <locale>).

    Il doit manquer quelque chose, mais je ne vois pas quoi...


    [edit]
    Petite précision : en débug je ne passe jamais dans la classe CustomError.Designer.cs, qu'elle soit public ou internal

  7. #7
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    C'est assez dingue ce truc...C'est quel type de projet ? Une classe library qui est utilisée en ASP, WPF,...? Et quelle version de .NET et de VS?
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  8. #8
    Modérateur
    Avatar de toopac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 940
    Points : 2 913
    Points
    2 913
    Par défaut
    Bon j'ai trouvé pourquoi ça ne fonctionnais pas.

    Dans ma solution j'ai trois projets : le service web, la bibliothèque de classes, et un projet de test.

    Je déboguais jusqu'à maintenant l'appli en cliquant sur "Déboguer tous les tests de la solution".


    Là j'ai créé une petite appli hors de la solution qui appelle une méthode de mon service web que j'ai lancé en mode débug (F5 cette fois), et tout fonctionne très bien, je récupère la valeurs dans la langue que je veux.

    Donc les projets de test c'est bien sauf pour les applis multilingue apparemment...

    Merci en tout cas EquinoxeDotNet pour t'être penché sur mon problème.

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

Discussions similaires

  1. bibliothèque de classe
    Par helico2 dans le forum C++/CLI
    Réponses: 8
    Dernier message: 16/07/2007, 16h25
  2. Site Bibliothèque de classes
    Par hugo69 dans le forum WinDev
    Réponses: 11
    Dernier message: 29/03/2007, 15h42
  3. Réponses: 11
    Dernier message: 12/08/2006, 10h22
  4. [VBA-E] comment créer une bibliothèque de classes ?
    Par james-mi dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 31/05/2006, 21h04
  5. Réponses: 3
    Dernier message: 28/04/2006, 11h27

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