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 :

VS2008 / .net : traduction dynamique d'une application dans plusieurs langues


Sujet :

C#

  1. #1
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut VS2008 / .net : traduction dynamique d'une application dans plusieurs langues
    salut


    je viens de me faire une petite appli de test pour voir comment fonctionne la traduction d'une appli dans différentes langues ... je trouve les possibilités trés limité ou alors j'ai pas tout compris.

    le but était tout simple, avoir un bouton par langue pour changer dynamiquement tous les textes de l'application, hors je me retrouve a mettre un évènement sur ces boutons dans lequel je dois faire un ApplyResources sur chaque composant, ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private static CultureInfo ciEs = new CultureInfo("es-ES");
     
    private void btLangEs_Click(object sender, EventArgs e)
    {
       Thread.CurrentThread.CurrentUICulture = ciEs;
       ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1));
       resources.ApplyResources(this, "$this");
       resources.ApplyResources(this.labTitre, "labTitre");
       resources.ApplyResources(this.labFixe, "labFixe");
    }
    pour cet exemple je n'ai que 3 textes sur 3 composants a modifier mais s'il faut faire ca pour chaque formulaire qui peut comporter un 50aine de texte, c'est une belle galère
    surtout sans compter les modifs ... etc


    est ce qu'il existe une manière pour forcer le rechargement de tous les textes de tous les composants aprés une assignation a Thread.CurrentThread.CurrentUICulture sans etre obligé d'utiliser ApplyResources sur chaque composant ?
    ou alors j'ai pris une mauvaise direction ?


    merci
    Le plus grand arbre est né d'une graine menue, une tour de neuf étages est partie d'une poignée de terre.
    Mon blog : http://web.codeur.free.fr

  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
    Malheureusement il n'y a pas de solution toute faite pour gérer le changement de langue...
    Il y a quelques temps j'avais trouvé une solution en utilisant des macros Visual Studio :
    • au début de la compilation : scan des fichiers .designer.cs
    • pour chaque fichier .designer.cs
      • extraction des instructions ApplyResources
      • génération d'un fichier .language.cs avec une méthode qui contient les instructions ApplyResources extraites
      • ajout des fichiers .language.cs au projet

    Ensuite, il suffit d'appeler la méthode générée pour appliquer la nouvelle langue (après avoir changé la culture du Thread courant)
    Si cette solution t'intéresse, j'avais posté la macro dans cette discussion :
    http://www.developpez.net/forums/d41...fichiers-resx/

    Sinon, j'ai pensé récemment à une solution un peu plus élégante, sans macro qui génère du code... je parcours simplement tous les contrôles de façon récursive, et j'appelle ApplyResources dessus. Par contre ça ne marche pas pour les menus par exemple, qui ne sont pas des Control... je n'ai pas encore trouvé une méthode vraiment générique pour faire ça

  3. #3
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    cool
    je suis pas le seul a trouver bizarre ce manque de fonctionnalité.

    pour l'instant le seul truc que j'ai pu trouver qui fonctionne pour l'intégralité des composants d'un formulaire c'est ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void btLangCa_Click(object sender, EventArgs e)
    {
       Thread.CurrentThread.CurrentUICulture = ciCa;
       this.Controls.Clear();
       InitializeComponent();
    }
    par contre faut gérer les effets de bords ... soit en prévenant le client que les données utilisateurs seront remises a zéro ou alors les stocker avant l'action pour les remettre ensuite (vu que ca relance la création du formulaire).

    sinon j'ai aussi pensé a développer une sur couche pour tous les composants graphique pour qu'ils réagissent a un changement de Thread.CurrentThread.CurrentUICulture ...


    merci pour tes macros, c'est génial, ca fonctionne parfaitement !
    dommage que MS n'ai pas prévu le langage des macros pour le C# en C# sinon j'aurais exploré cette voie.
    Le plus grand arbre est né d'une graine menue, une tour de neuf étages est partie d'une poignée de terre.
    Mon blog : http://web.codeur.free.fr

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    salut

    Sinon, tu peux faire ce que j'ai fait déja depuis longtemps

    Une classe static de traduction.

    Je la positionne dans chacune de mes fenetre... Chaque fenetre s'abonne à un evenement OnChangeLanguage et passe ensuite son This à une méthode récursive de parcours de éléments contenu dans this.Controls !

    Je gère les menus (il suffit de tester la nature du control) et pas mal de chose

    Au final, j'ai un fichier XML (hors ressource, donc) qui contient les langues. Avec un système pour que tout nouveau controle non traduit genère une entrée dans mon dictionnaire de traduction et ensuite, avec un petit outil à base de gridview, je trouve rapidement les traductions non effectuées.

    Jusqu'au jours d'aujourd'hui, je n'ai pas trouvé de solution plus souple que la "mienne", et surtout pas avec celle de microsoft

    The Monz, Toulouse
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 22/01/2013, 23h49
  2. Application dans plusieurs langues
    Par Shma94 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 05/04/2011, 11h07
  3. [SP2] Comment débloquer une application dans le SP2
    Par Furius dans le forum Windows XP
    Réponses: 6
    Dernier message: 13/11/2005, 22h45
  4. [CR.NET]Chargement dynamique d'une image
    Par Moah dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 14/12/2004, 11h46
  5. Réponses: 5
    Dernier message: 22/12/2003, 14h18

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