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

VB.NET Discussion :

Changement dynamique de la langue d'affichage d'une application


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 37
    Points : 15
    Points
    15
    Par défaut Changement dynamique de la langue d'affichage d'une application
    Bonjour,

    J'ai une application multilingue, contenant un combobox pour choisir la langue courante. Tout marche à merveille : quand on sélectionne "anglais" on passe dans la langue du Chat qui expire, quand on sélectionne Français on passe dans la langue de Molière...

    Le seul bémol est que ce changement n'est pas immédiat dans la fenêtre en cours, il ne s'effectue que quand on ferme la fenêtre de sélection de langue.

    J'ai trouvé sur un tuto qu'il fallait "changer à la main" tous les textes affiché dans la fenêtre si on voulait une MAJ immédiate, c'était un tuto C#. En VB.NET il y aurait il qqc de plus efficace et moins relou que de faire une sub qui passe en revue tous les labels, boutons etc, pour changer leur textes suivant la langue sélectionné?

    Bien sur Me.refresh ne marche pas...

    que je change la langue courante avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my.application.changeUICulture("fr-FR")
    ou avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Threading.Thread.CurrentThread.CurrentCulture = New Globalization.CultureInfo("fr-FR")
    le résultat est le mê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 754
    Points
    39 754
    Par défaut
    Le problème est que les textes localisés sont évalués au moment où tu crées la fenêtre, dans InitializeComponent :

    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(Form1))
            ...
            resources.ApplyResources(Me.Button1, "Button1")
            ...

    Pour changer les textes à la volée, il faudrait donc réexécuter seulement une partie de InitializeComponent (les appels à ApplyResources), ce qui n'est pas possible...

    Par contre on doit pouvoir tricher un peu, en recréant un ComponentResourceManager, en listant les resources disponibles, et en retrouvant le contrôle correspondant par réflexion :

    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
        Sub ReapplyResources()
            Dim resources As New ComponentResourceManager(GetType(Form1))
            Dim rs As ResourceSet = resources.GetResourceSet(My.Application.UICulture, True, True)
            Dim controlNames = rs.Cast(Of DictionaryEntry)() _
                                 .Select(Function(e) ExtractControlName(e.Key)) _
                                 .Distinct() _
                                 .ToList()
     
            Dim flags = BindingFlags.Instance Or BindingFlags.NonPublic Or BindingFlags.Public
            For Each cName In controlNames
     
                Dim ctl As Object
                If cName = "$this" Then
                    ctl = Me
                Else
                    Dim field As FieldInfo = GetType(Form1).GetField(cName, flags)
                    If field Is Nothing Then field = GetType(Form1).GetField("_" & cName, flags)
                    If field Is Nothing Then Continue For
                    ctl = field.GetValue(Me)
                End If
     
                If (ctl Is Nothing) Then Continue For
                resources.ApplyResources(ctl, cName)
            Next
     
        End Sub
     
        Function ExtractControlName(ByVal key As String) As String
            Dim parts = key.Split("."c)
            Return parts(0).TrimStart(">"c)
        End Function
    Pour l'utiliser tu appelles simplement ApplyResources après avoir changé la culture courante (remplace bien sûr Form1 par le nom de ta form)

  3. #3
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut update UI localise au run-time
    bonjour khaourantin
    Bah c'est un peu ce qu'as dit Tomlev ,le probleme est dans ComponentResourceManager,mais on peut optimiser un peu plus les choses .
    De plus on n' aurait pas besoin de InitiliazeComponent comme le montre ce code avec 2 formes ou un frmTest change immediatement le frmLocalisable sans qu'il soit necessaire de refermer les 2 fenetres:
    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
    49
    50
    51
     
    'ce form est le form localisable avec
    '-un bouton
    '-textbox
    '-label
    Imports System.Globalization
    Imports System.Threading
    Imports System.ComponentModel
     
    Public Class frmLocalisable
     
    	Private Sub frmLocalizable_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
                End Sub
    End Class
     
    'ce form sert à tester le form localisable qui suit 
    'avec un simple combobox
    Imports System.Globalization
    Imports System.Threading
    Imports System.ComponentModel
     
    Public Class formTest
    	'La forme localisee
    	Private maForme As frmLocalisable = New frmLocalisable
    	Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
     
    		ComboBox1.Items.Add("English")
    		ComboBox1.Items.Add("Spanish")
    		ComboBox1.Items.Add("French")
    		ComboBox1.SelectedIndex = 0
    		'Affiche la forme localisee
    		maForme.Show()
    	End Sub
     
    	Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
    		If ComboBox1.SelectedItem.ToString() = "English" Then
    			ChangeLanguage("en")
    		ElseIf ComboBox1.SelectedItem.ToString() = "Spanish" Then
    			ChangeLanguage("es-ES")
    		Else
    			ChangeLanguage("fr-FR")
    		End If
    	End Sub
    	Private Sub ChangeLanguage(ByVal lang As String)
    		For Each c As Control In maForme.Controls
     
    			Dim resources As ComponentResourceManager = New ComponentResourceManager(maForme.GetType)
    			resources.ApplyResources(c, c.Name, New CultureInfo(lang))
    		Next c
    	End Sub
    End Class
    bon code..................

  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 : 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 754
    Points
    39 754
    Par défaut
    @Mabrouki, en fait j'avais pensé à ta techique (qui semble plus propre que de passer par la réflexion), mais elle pose un problème : elle ne gère pas les composants qui ne sont pas des contrôles (menus, toolbars, etc). De plus elle ne gère que les contrôles de premier niveau (ceux qui sont directement dans la Form), pas ceux qui sont imbriqués dans un conteneur (Panel, GroupBox ou autre), donc il faudrait la rendre récursive.

Discussions similaires

  1. Problème d'affichage d'une application.
    Par chapatou dans le forum NetBeans
    Réponses: 4
    Dernier message: 22/12/2007, 17h53
  2. Réponses: 2
    Dernier message: 18/03/2007, 15h38
  3. [DOM] Changement dynamique de l'image de fond d'une balise <TD>
    Par Delphi-ne dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 03/02/2007, 19h40
  4. [JFrame] Affichage d'une application toujours au premier plan
    Par michaeljeru dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 06/12/2006, 22h49
  5. Réponses: 2
    Dernier message: 29/03/2006, 14h29

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