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 Forms Discussion :

[.NET 2.0] langue de UserControl


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 120
    Points : 48
    Points
    48
    Par défaut [.NET 2.0] langue de UserControl
    Par le biais de la propriété Language d'une form on peut créer autant de fichiers de resource que de langues de l'application. C'est pas mal utile quand on gère une application multilangues.

    Mais je ne trouve pas de moyen de créer l'identique dans un UserControl.
    Le problème c'est que mes UserControl sont dans une librairie de classes utilisés par plusieurs applications. Je voudrais donc tout naturellement que les resources dans chaque langues se retrouvent au niveau du UserControl et pas avoir à gérer :
    1. un Méga fichier de resources au niveau des Forms,
    2. des recopies des mêmes resources dans diverses Form de plusieurs applications qui utilisent ces UserControl (pas terrible la gestion des copier/coller non ?)

    vous feriez comment vous pour résoudre ce problème ?

  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 : 42
    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 749
    Points
    39 749
    Par défaut
    Citation Envoyé par juniorAl Voir le message
    Mais je ne trouve pas de moyen de créer l'identique dans un UserControl.
    Ben chez moi ça marche pareil pour un UserControl que pour une Form...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 120
    Points : 48
    Points
    48
    Par défaut
    En fait pour les UserControl créés sous VS2005, c'est vrai que ça fonctionne comme pour une Form, je viens de vérifier.
    par contre j'ai des UserControl créés à l'origine sous VS2003 et là ça ne fonctionne pas. Qu'ont-ils de différent ?
    Pas de Designer et apparemment c'est ce qui fait la différence, car le Designer en question contient exactement le code du Dispose() et du InitializeComponents() qui était en VS2003 dans le cs du UserControl.
    J'ai copié tout ça dans un designer.cs au même nom et je te confime que dans ce cas ça fonctionne bien comme une Form.

    -> ??? les vérités du seigneur resteront impénétrables ! Krosoft reste déroutant ! mais mon problème est résolu...

    merci

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 120
    Points : 48
    Points
    48
    Par défaut
    ou pas tout à fait (résolu) !
    car je renconte un problème pour gérer les langues de mes Tooltips.
    Ces Tooltips sont rajoutés par du code en fonction de l'état de mon UserControl.

    Dès que je rajoute des objets (des strings correspondant à mes Tootips) à mes fichiers de resource :
    fr-FR ou en-GB
    ces objets sont perdus lors de la modification du UseControl par le Designer Graphique.
    Alors c'est vrai que VS m'averti de ce risque avant l'enregistrement de ces strings, mais alors comment faire pour gérer des resources liées à la langue et indépendants du mode de conception graphique.

    J'ai cherché partout et impossible de trouver une solution satisfaisante...

  5. #5
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par juniorAl Voir le message
    Dès que je rajoute des objets (des strings correspondant à mes Tootips) à mes fichiers de resource :
    fr-FR ou en-GB
    ces objets sont perdus lors de la modification du UseControl par le Designer Graphique.
    Tu peux développer ? Si j'ai bien compris, les chaînes qui ne sont pas directement dans le designer mais que tu affectes via code sont dans les ressources de ton appli, c'est bien ça ?
    Si c'est le cas, ces ressources sont complètement décorrélées du UserControl ; je vois pas bien pourquoi éditer l'UC irait modifier tes chaînes.
    ಠ_ಠ

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 120
    Points : 48
    Points
    48
    Par défaut
    Tu peux développer ? Si j'ai bien compris, les chaînes qui ne sont pas directement dans le designer mais que tu affectes via code sont dans les ressources de ton appli, c'est bien ça ?
    Dans mon UserControl.cs j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           private const string TT_CHOIX = "";
    sachant que TT_CHOIX est un texte contextuel qui pourrait être utilisé pour un ToolTip, une messagBox, etc.
    Je souhaite que ce texte soit lié à mon UserControl pour ne pas à avoir à le réaffecter N fois, chaque fois que le UserControl serait instancié.



    Dans le fr-FR.cs j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      <data name="$this.Text" xml:space="preserve">
        <value>MonUserControl est riche</value>
      </data>
      <data name="$this.TT_CHOIX" xml:space="preserve">
        <value>Etes vous sur?</value>
      </data>
    Dans le en-GB.cs j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      <data name="$this.Text" xml:space="preserve">
        <value>MyUserControl is rich</value>
      </data>
      <data name="$this.TT_CHOIX" xml:space="preserve">
        <value>Are you sure ?</value>
      </data>
    Lorsque je modifie le this.Text par le biais de la propriété dans la fenetre propriétés, VS me demande d'extraire le fr-FR ou en-GB correspondant sur mon serveur de code source (SourceSafe) et résultat de l'extraction :
    la string "$this.TT_CHOIX" est supprimée du fr-FR.resx ou du en-GB.resx.

    Je sais pas si je suis assez clair ?

  7. #7
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Ah, ok Une technique originale, je sais pas si ça marche (d'après ce que tu dis, non... )

    Autant que je sache, les fichiers de ressources xml ne sont pas faits pour être modifiés à la main. Le designer se charge de tout.

    Non ce que je voulais dire, c'est qu'au niveau de ton assembly elle-même, tu peux définir des ressources. (clic droit sur ton projet dans l'explorateur de solutions, onglet Ressources)
    Là, dans ces ressources, tu définis tes chaînes dans la langue par défaut. Et après, si tu veux ajouter une autre langue, tu rajoutes un fichier resources.fr-FR.resx, dans lequel tu mets tes chaînes traduites.

    Après, dans ton code, tu utilises ces chaînes via TonNameSpace.Properties.Resources.TaChaine.
    ಠ_ಠ

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 120
    Points : 48
    Points
    48
    Par défaut
    Non ce que je voulais dire, c'est qu'au niveau de ton assembly elle-même, tu peux définir des ressources. (clic droit sur ton projet dans l'explorateur de solutions, onglet Ressources)
    OK, merci. Mais ça ne répond pas à ma question.
    Si on fait comme ça, les resources sont localisées au niveau du projet et non au niveau du UserControl...

    Pour ce qu est de :
    les fichiers de ressources xml ne sont pas faits pour être modifiés à la main. Le designer se charge de tout
    Je dirais même qu'il reconstruit ces fichiers à chaque extraction puisqu'il détruit tout ce qui a été ajouté à la main, alors qu'il a accepté les modifications manuelles.

    Alors coment faire pour mon besoin de resources non liées à la conception graphique, mais obligatoirement localisées au niveau du UserControl ?
    c'est quand même fort que les fichiers de resources existants ne pemettent pas cela !!!
    il y a bien la solution de rajouter des fichiers de resources manuellement dans le UseControl et de gérer les textes contextuel à l'usage en faisant référence à ces nouveaux fichiers. ça fait juste doubler la structure, si tu as 10 langues, ça fait 20 fichiers, super... et en plus tu dois rajouter chaque fois la référence à ce fichier,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ResourceManager resourceManager = ResourceManager.CreateFileBasedResourceManager(resourceFile, filePath, null);
            string s = resourceManager.GetString(key);
    là où un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string s = resources.String("TT_CHOIX);
    aurait suffit.

  9. #9
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par juniorAl Voir le message
    OK, merci. Mais ça ne répond pas à ma question.
    Si on fait comme ça, les resources sont localisées au niveau du projet et non au niveau du UserControl...
    Et alors ? Ton user control est bien dans un projet, non ?
    et en plus tu dois rajouter chaque fois la référence à ce fichier
    Euh, non Comme je te disais, le designer de ressources se charge de t'encapsuler tout ça dans une classe, appelée "Resources", justement, qui te fournit un accès via code à tes chaînes (ou images, son, etc. d'ailleurs).

    Tout ce qui est propre à une form / un user control, et qui apparaît directement dedans, peut être mis dans les ressources directement associées à ce UC / cette form. Mais ces ressources ne sont pas faites pour être éditées à la main, comme le machin.designer.cs c'est du domaine exclusif du designer. Pour le reste (par exemple : le texte d'une messagebox), le plus simple (et à ma connaissance, c'est la seule façon de faire) est de mettre la chaîne à localiser dans les ressources de l'assembly.
    ಠ_ಠ

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 120
    Points : 48
    Points
    48
    Par défaut
    en plus on sent qu'ils se sont pas posé la question comme moi, puisqu'on peut pas faire de copier/coller des resx existants pour un UserControl (gérés par le concepteur graphique), pui modifier leur nom dans l'Explorateur de solutions.
    ça aurait permit de dupliquer la structure et d'aller modifier dedans.
    va falloir passer par l'explorateur de fichiers...
    Hum...
    sans commentaire au niveau de l'intégration...

    De plus en terme de lisibilité, les fichiers resx rajoutés par ce biais (copier/coller, puis modif nom dans l'Explorateur de fichier et ajout dans le projet depuis l'explorateur de olutions) ne seront jamais vus comme appartenant au UserControl vu qu'ils ne pourront pas avoir le même nom que lui (déjà réservé pour les resources gérées par le concepteur graphique.

    c'est franchement pas terrible !
    pour gérer des petits projets je dis pas, mais quand tu as des solutions à 10 projets avec chacun une 10aine de classes et UserControl la gestion de l'architectre devient vite un casse tête si VS ne propose pas le confort nécessaire...

    Si qelqu'un sais commen faire mieux, je suis preneur...

  11. #11
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    en plus on sent qu'ils se sont pas posé la question comme moi,
    Sans vouloir te vexer, je me permets d'émettre l'hypothèse que les designers du framework, de C# et des winforms ont réfléchi un peu plus que toi sur la question
    Citation Envoyé par juniorAl Voir le message
    De plus en terme de lisibilité, les fichiers resx rajoutés par ce biais (copier/coller, puis modif nom dans l'Explorateur de fichier et ajout dans le projet depuis l'explorateur de olutions) ne seront jamais vus comme appartenant au UserControl vu qu'ils ne pourront pas avoir le même nom que lui (déjà réservé pour les resources gérées par le concepteur graphique.
    Les noms de fichier marche comme ça :
    • t'as une form / un UC : Machin.cs
    • le fichier généré par le designer : Machin.Designer.cs
    • le fichier de ressources, dans la culture par défaut : Machin.resx
    • autant de ressources que tu veux : Machin.fr-FR.resx, Machin.jp.resx, etc.
    Et t'as pas besoin de passer par l'explorateur. Dans le designer, tu choisis une langue dans les propriétés de la form / de l'UC, ça crée automatiquement un fichier Machin.XX.resx, initialisé avec les valeurs de la langue par défaut.
    ಠ_ಠ

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 120
    Points : 48
    Points
    48
    Par défaut
    On n'a pas trop le choix avec VS.
    où les resources sont liées à un Control, donc modifiables par ce biais et elles sont gérées correctement et apparaissent sous le Control au niveau de l'explorateur de solutions.
    Où il faut les faire apparaître au niveau du projet.

    Je sais que c'est pas bien de donner son avis sur les outils sur les Forums, mais là, "Bonjour la modularitée".
    Je veux pas jouer les vieux grincheux, mais il y a dix ans des outils de gestion de projets étaient mieux pensés en terme d'allocation des resources...
    on fera avec (faute de pouvoir faire autrement) mais c'est absolument pas confortable, ni sur... c'est réservé aux petits projets...
    étonnant à priori de la part de MS... ou oubli (déjà sur VS2003 donc je penche pour la 1e solution). Je reste déçu...

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 120
    Points : 48
    Points
    48
    Par défaut
    Sans vouloir te vexer, je me permets d'émettre l'hypothèse que les designers du framework, de C# et des winforms ont réfléchi un peu plus que toi sur la question
    Tu as certainement raison.

    Mais reflechir n'est pas réussir. par ailleurs ce n'est pas parce qu'on réfléchi beaucoup qu'on trouve toutes les réponses à toutes les questions, alors rstons en là sur les jugements.
    Mon besoin n'est pas couvert par VS un point c'est tout. Et ce n'est pas un besoin de martien. Juste un souci d'organisation, de sécurité et de rentabilité... qui estmal pris en compte.

  14. #14
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Comme tu le résumes bien, seules les ressources directement associées à une propriété d'un contrôle (son texte notamment, mais aussi sa position, sa couleur, ...) peuvent être stockées dans le fichier de ressources associé à la form.

    Ça dépend bien sûr des projets, mais je n'ai pas dans les miens beaucoup de chaînes "flottantes", i.e. qui sont amenées à apparaître quelque part mais qui ne sont pas directement le texte d'un contrôle, tel que je l'ai défini dans le designer. Le seul cas qui me vient à l'esprit est le texte des MessageBox ; et dans ce cas là, je vois pas de différence fondamentale entre
    MessageBox.Show(this.Resources.LeMessageDErreur) et MesageBox.Show(MonNamespace.Properties.Resources.LeMessageDErreur). Mais dans ce cas, la MessageBox n'appartient pas conceptuellement à la form, on peut imaginer que ce message d'erreur puisse apparaître à différents endroits du projet, il ne me parait donc pas choquant qu'il soit stocké au niveau du projet.

    En plus, tu peux avoir autant de classes Resource que tu veux, avec le designer qui te génère une classe avec accès typé à tes chaînes. Tu peux alors stocker dans chacun les ressources propres à chacun de tes UC / form.

    Pour ça, il suffit dans l'explorateur de solutions, de rajouter un nouvel élément de types Ressources, de lui donner le nom que tu veux, et voilà. Pas besoin d'un LoadFromFileBidule(), le designer se charge de tout.
    ಠ_ಠ

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 120
    Points : 48
    Points
    48
    Par défaut
    alors je m'y prends certainement comme un ane, mais d'après les tests que je viens de faire, les fichiers de resources collés sous ProjectPath\Properties et ajoutés à MonNamespace.Properties à l'aide du navigateur de solutions et auxquels on pourrait accéder par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MessageBox.Show(MonNamespace.Properties.Resources.LeMessageDErreur).
    doivent obligatoirement porter les noms :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Resources.resx
    Resources.en-GB.resx
    Resources.fr-FR.resx
    "Resources" étant compris, comme resources du Projet ?

    ils ne peuvent en aucune manière s'appeller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Resources.resx
    Resources.en-GB.resx
    Resources.fr-FR.resx
    MonUserControl.resx
    MonUserControl.en-GB.resx
    MonUserControl.fr-FR.resx
    où "Resources" serait compris, comme resources du Projet et MonUserControl, comm resources du Project.UserControl non liées aux contrôles gérés par le concepteur graphique.

    car on ne peut accéder à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MessageBox.Show(MonNamespace.Properties.MonUserControl.LeMessageDErreur).
    ce qui encore une fois aurait permis de s'y retrouver un peu mieux.
    Alor je ne parle même pas de rajouter un dossier Dans Properties portant le nom : MonUserControl qui aurait permis d'y ranger tous les fr, fr-FR, en, en-GB, etc... appartenant à une même classe.

    J'ai tout faux ou pas ?

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 120
    Points : 48
    Points
    48
    Par défaut
    non ! on oublie tout !
    c'est au choix ou je suis étourdi ou un ane...

    j'avais oublié le MonUserControl.resx et son MonUserControl.Designer.cs

    On peut en effet loger toutes les resources non liées au concepteur graphique dans Properties et dans autant de dossier correspondant aux classes du Project.

    On s'y retrouve mieux ensuite pour afficher en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MessageBox.Show(MonNamespace.Properties.MonUserControl.Resources.MaString);
    où MonUserControl est le nom du dossier sous Properties et aussi le nom du UserControl ou de la classe et Resources le nom des fichiers resx...

    on sais jamais ça peut servir à des gens qui ont des projets aussi lourds que les miens alors je poste le résultat...

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/05/2009, 17h20
  2. Réponses: 7
    Dernier message: 19/09/2007, 16h39
  3. [CR][.NET] Rapport multi-langue
    Par Harakor dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 16/02/2005, 17h06
  4. Réponses: 12
    Dernier message: 18/03/2004, 15h09

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