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 :

Localisation resx multilingue


Sujet :

Windows Forms

  1. #1
    Membre régulier Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Points : 114
    Points
    114
    Par défaut Localisation resx multilingue
    Bonjour,

    Je me suis servie de ce tuto : ICI

    Mais j'ai une erreur :

    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
    24
    25
    namespace Consultationbis
    {
        public partial class F_ConsultSearch : Form 
        {
            public CultureInfo EnglishCulture = new CultureInfo("en-US");
            public CultureInfo FrenchCulture = new CultureInfo("fr-FR");
    
            private System.Resources.ResourceManager RM = null;
    
            public F_ConsultSearch(Classes.Surveillant surveillant)
            {
                this.oSurveillant = surveillant;
                InitializeComponent();
            }
    
            private void F_ConsultSearch_Load(object sender, EventArgs e)
            {
                RM = new System.Resources.ResourceManager("Consultationbis.ConsultSearch", typeof(F_ConsultSearch).Assembly);
                System.Threading.Thread.CurrentThread.CurrentUICulture = EnglishCulture;
                label1.Text = RM.GetString("label1");
    //Could not find any resources appropriate for the specified culture or the neutral culture.  
    //Make sure "Consultationbis.ConsultSearch.resources" was correctly embedded or linked into assembly "Consultationbis" at compile time,
    // or that all the satellite assemblies required are loadable and fully signed.
            }
    J'ai 3 fichiers resx :
    F_ConsultSearch.en.resx
    F_ConsultSearch.fr.resx
    F_ConsultSearch.resx

    J'ai ajouté une ligne (chaine) dans en.resx et dans fr.resx avec :
    label1 | Hi
    label1 | salut

    Merci d'avance

  2. #2
    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
    Depuis que ce tuto est sorti, la localisation s'est simplifiée, et tout peut se faire via le designer. Du moins pour les petits projets, mais ça devrait te suffire.

    Donc crée ta form, mets tous les textes des labels dans ta langue par défaut ; ensuite, dans les propriétés de la form, passe "Localizable" à true ; puis dans la liste de Langues, choisis ton autre langue ; puis édite les textes des labels dans cette autre langue, directement dans le designer. Ca va créer automatiquement un fichier "taform.xx.resx" (où xx est la nouvelle langue), que tu n'as pas besoin de modifier à la main.

    A chaque fois que la form s'ouvrira, elle mettra les labels dans la langue correspondant à System.Threading.Thread.CurrentThread.CurrentUICulture , sans que t'aies rien à coder.
    ಠ_ಠ

  3. #3
    Membre régulier Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Points : 114
    Points
    114
    Par défaut
    Merci pour ta réponse.

    Alors effectivement le resx se remplie tout seul. J'ai un design pour chaque langue.

    Et lorsque je met la ligne : System.Threading.Thread.CurrentThread.CurrentUICulture = EnglishCulture;
    dans l'instanciation de mon form, ça marche bien.

    Mais je voudrais pouvoir changer de langue quand je suis dans l'appli.
    J'ai donc un bouton qui envoie la culture choisie.

    Mais lorsque je remet la fameuse ligne dans une fonction du form qui se déclenche après avoir appuyé sur le bouton, il ne se passe rien.

    J'ai essayé un InitializeComponent(); mais rien.

    Il faut d'une certaine manière recharger le form, mais je ne vois pas trop comment.

  4. #4
    Membre régulier Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Points : 114
    Points
    114
    Par défaut
    J'ai trouvé quelque chose ICI : The badger man parle de mettre la ligne de changement de langue dans le main, et après avoir cliqué sur le bouton mettre la ligne de changement et enfin faire un Application.Restart()

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    //Dans le Program
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
     
             Classes.Surveillant oSurveillant = new Classes.Surveillant(); 
     
             System.Threading.Thread.CurrentThread.CurrentUICulture = oSurveillant.FrenchCulture;
                Application.Run(oSurveillant);
            }      
    //Dans le menu 
            private void MenuItemEnglish_Click(object sender, EventArgs e)
            {
                oSurveillant.ChangeLangue(oSurveillant.EnglishCulture);
            }
     
            private void MenuItemFrancais_Click(object sender, EventArgs e)
            {
                oSurveillant.ChangeLangue(oSurveillant.FrenchCulture);
            }
     
    //Dans le contexte Surveillant
    public void ChangeLangue(CultureInfo Culture)
            {
                if (System.Threading.Thread.CurrentThread.CurrentUICulture != Culture)
                {
                    System.Threading.Thread.CurrentThread.CurrentUICulture = Culture;
                    Application.Restart();
                }
            }
    Lorsque je clique sur le bouton, il recharge l'appli mais la langue ne change pas.

  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
    Pour garder un paramétrage quelconque à chaque réouverture de ton appli (que ce soit via App.restart ou pas), il faut le sauvegarder, et le récupérer à l'ouverture, les variables n'ayant pas une durée de vie supérieure à celle de l'appli.

    Pour ce faire, .Net a un mécanisme de Settings bien fichu. cf le namespace System.Configuration.
    ಠ_ಠ

  6. #6
    Membre régulier Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Points : 114
    Points
    114
    Par défaut
    C'est exactement ce que je voulais! Merci!

    Mais il reste encore un problème.

    Dans mon Main je vais chercher la langue dans le fichier de configuration et je met la ligne de choix de langue en fonction.

    Dans mon aplli lorque je clique pour changer de langue, je change la valeur de la langue dans le fichier de config, ça à l'air de marcher vu que je fais un MessageBox après.

    Mais lorsque je redémarre mon appli, la valeur de la langue dans le fichier config est restée celle que j'ai écrite en dure la premiere fois.

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    // Dans Program
            static void Main()
            {
                CultureInfo EnglishCulture = new CultureInfo("en-US");
                CultureInfo FrenchCulture = new CultureInfo("fr-FR");
     
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
     
                string Language = ConfigurationManager.AppSettings.Get("Key0");
     
                if (Language == "FrenchCulture")
                {
                    System.Threading.Thread.CurrentThread.CurrentUICulture = FrenchCulture;
                }
                else
                {
                    System.Threading.Thread.CurrentThread.CurrentUICulture = EnglishCulture;
                }
                Classes.Surveillant oSurveillant = new Classes.Surveillant();
     
                Application.Run(oSurveillant);
            }
     
    // Dans l'appli
    public void ChangeLangue(CultureInfo Culture)
            {
                if (System.Threading.Thread.CurrentThread.CurrentUICulture != Culture)
                {
                    Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                    config.AppSettings.Settings.Remove("Language");
                    if (Culture.ToString() == "fr-FR")
                    {
                        config.AppSettings.Settings.Add("Language", "FrenchCulture");
     
                    }
                    else
                    {
                        config.AppSettings.Settings.Add("Language", "EnglishCulture");
                    }
                    config.Save(ConfigurationSaveMode.Modified);
                    ConfigurationManager.RefreshSection("appSettings");
                    MessageBox.Show(ConfigurationManager.AppSettings["Language"]);
     
                    //Application.Restart();
                }
            }
    Fichier de config :

    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
      </configSections>
      <connectionStrings>
        <add name="LSIEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=SQL-DEV;Initial Catalog=LSI;Persist Security Info=True;User ID=lsi;Password=lsilsi;MultipleActiveResultSets=True&quot;"
          providerName="System.Data.EntityClient" />
        <add name="Consultationbis.Properties.Settings.LSIConnectionString"
          connectionString="Data Source=SQL-DEV;Initial Catalog=LSI;Persist Security Info=True;User ID=lsi;Password=lsilsi"
          providerName="System.Data.SqlClient" />
      </connectionStrings>
      <appSettings>
        <add key="Key0" value="EnglishCulture" />
      </appSettings>
    </configuration>

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 62
    Points
    62
    Par défaut
    Pour avoir accés au paramétre de ton application il existe la classe:MonApplication.Properties.Settings et avec laquel tu peux changer les paramatres de langue de façon simple, par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private void button1_Click(object sender, EventArgs e)
            {
                switch (comboBox1.SelectedItem.ToString())
                {
                    case "En": Settings.Default.paramCurrentUICulture = new CultureInfo("en"); break;
                    case "Fr": Settings.Default.paramCurrentUICulture = new CultureInfo("fr"); break;
                    default: break;
                }
                Settings.Default.Save();
                Application.Restart();
            }
    Et dans le constructeur tu utilises:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thread.CurrentThread.CurrentUICulture = Settings.Default.paramCurrentUICulture;
    Cela t'évite de passer par le configuration manager.
    Évidemment pour faire ça il faut avoir crée le paramètre paramCurrentUICulture dans les paramètre de ton application.
    Entre la culture des perles fines et ceux qui perlent l'inculture, un point commun domine : c'est le QI de l'huître !

  8. #8
    Membre régulier Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Points : 114
    Points
    114
    Par défaut
    Ca marche très bien!

    Merci beaucoup!

    Juste pour ceux que ça interesse : il faut créer les paramètres dans le dossier Properties->Settings.

  9. #9
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Points : 49
    Points
    49
    Par défaut
    Bonjour,
    Je me permet d'upper ce sujet car j'aimerais en savoir plus sur la démarche que tu énonces dans ton dernier message:
    Créer les paramètres dans properties->settings

    Merci

  10. #10
    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 r0seBa Voir le message
    Bonjour,
    Je me permet d'upper ce sujet car j'aimerais en savoir plus sur la démarche que tu énonces dans ton dernier message:
    Créer les paramètres dans properties->settings
    Facile : dans visual studio, clic droit sur ton projet dans l'explorateur de solutions ; clic sur "Propriétés" ; dans la fenêtre qui apparait, avec plusieurs onglets sur la gauche, choisir "Paramètres".
    ಠ_ಠ

  11. #11
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Points : 49
    Points
    49
    Par défaut
    J'ajoute donc une ligne au tableau :
    paramCurrentUICulture (mais quel type je dois mettre, le type string ne fonctionne pas).

    J'ai des problèmes de lecture seule, le seul problème que j'ai trouvé est de passer le modificateur d'accés en public, c'est la meilleure solution?

    Le truc c'est que j'arrive pas à trouver le bon type pourtant j'ai cherché,

    Merci

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 62
    Points
    62
    Par défaut
    Tu peux le mettre dans n'importe quel type: dans la combobox tout en bas tu as "parcourir", dans le cas d'un CultureInfo tu dois allez dans System.GLobalization et sélection CultureInfo.

    Pour l'accès généralement moi je les met en "Internal".
    Entre la culture des perles fines et ceux qui perlent l'inculture, un point commun domine : c'est le QI de l'huître !

  13. #13
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Points : 49
    Points
    49
    Par défaut
    Merci beaucoup, cependant j'ai un problème (oui encore)
    J'ai beau sélectionner Anglais dans les options cela ne change rien, ça charge toujours les paramètres français, j'ai meme rajouté une ligne pour modifier juste avant et pareil.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var config_lang= Properties.Settings.Default.paramCurrentUICulture;
            if (config_lang == null)
            {
                Properties.Settings.Default.paramCurrentUICulture = new CultureInfo("en");
            }
            System.Threading.Thread.CurrentThread.CurrentUICulture = Properties.Settings.Default.paramCurrentUICulture;
     
            RM = new System.Resources.ResourceManager("BM2010.frmSaisiesBoutons", typeof(frmSaisiesBoutons).Assembly);
    J'avoue ne pas voir du tout d'ou peut venir ce problème.

    Merci

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 62
    Points
    62
    Par défaut
    tu as "simplement" oublier une petite ligne de code super importante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Settings.Default.Save();
    Entre la culture des perles fines et ceux qui perlent l'inculture, un point commun domine : c'est le QI de l'huître !

  15. #15
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Points : 49
    Points
    49
    Par défaut
    Merci beaucoup, ça marche parfaitement (enfin pour le moment =P)

    Surtout merci pour votre patience

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 62
    Points
    62
    Par défaut
    Bha de rien .

    Par contre j'ai louper un petit truc dans ton code
    var config_lang
    Il est déconseiller d'utiliser le type VAR, utilise plutôt un typage fort pour tes variables.
    Entre la culture des perles fines et ceux qui perlent l'inculture, un point commun domine : c'est le QI de l'huître !

  17. #17
    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 Arsou Voir le message
    Il est déconseiller d'utiliser le type VAR, utilise plutôt un typage fort pour tes variables.
    Hello,

    y'a mécompréhension, là Le mot-clé var n'a pas rendu C# moins typé, il dit juste que la variable est du type déterminé à droite du signe "=".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var b = new Bidule(); // équivaut à Bidule b = new Bidule();
    b = new Truc(); // compile pas, parce que b est une référence vers un Bidule.
    ಠ_ಠ

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 62
    Points
    62
    Par défaut
    Ha, je ne l'avais pas compris comme ça

    Je me souviens qu'au cours on nous avais déconseiller de l'utiliser mais je pensai que son utilisation se faisait comme dans certain autre langage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Var V;
    V = "Toto"
    MessageBox.show(V);
    V = 6;
    V += 4
    etc
    J'ai encore du boulot pour bien connaitre le C# ^^.
    En tout cas merci de la précision Guulh
    Entre la culture des perles fines et ceux qui perlent l'inculture, un point commun domine : c'est le QI de l'huître !

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

Discussions similaires

  1. Avoir une application localisable (multilingue) sous VS2008 et plus
    Par Lucas Panny dans le forum Windows Forms
    Réponses: 1
    Dernier message: 01/08/2011, 18h10
  2. Site multilingue sans fichier .resx
    Par infoIcam dans le forum ASP.NET
    Réponses: 7
    Dernier message: 24/03/2011, 09h07
  3. Site multilingue utilisation de fichiers (.*).resx
    Par nasimpat7 dans le forum Débuter
    Réponses: 20
    Dernier message: 22/06/2009, 17h05
  4. Référencement site multilingue en aspnet: .resx ou pas .resx?
    Par lamalice dans le forum Référencement
    Réponses: 2
    Dernier message: 02/06/2009, 13h48
  5. [FAQ C#] Localiser les valeurs d'une ressource (.resx)
    Par rad_hass dans le forum Contribuez
    Réponses: 1
    Dernier message: 09/04/2008, 01h34

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