CurrentCulture d'un PC [Résolu]

Messages postés
208
Date d'inscription
samedi 17 janvier 2009
Statut
Membre
Dernière intervention
5 mars 2013
- - Dernière réponse : cs_JLuc01
Messages postés
208
Date d'inscription
samedi 17 janvier 2009
Statut
Membre
Dernière intervention
5 mars 2013
- 4 nov. 2012 à 22:09
Bonjour,

Un autre probleme sur lequel je bloque depuis un bon moment!

Sur ma Form, j'ai un control MonthCalendar, des Labels...
Lorsque je vais dans "Control Panel" sur mon PC pour changer le language "en-GB" en "fr-FR" ou vice-versa, et que je redemarre mon application, je vois que le control MonthCalendar a change, mais pas les Labels. Je ferme mon application et je la redemarre de nouveau, et cette fois-ci les Labels ont change.

Pourquoi cela ne marche pas la premiere fois?
Ci-dessous mon code ou xLang prend la valeur "en-GB" au premier demarrage de mon application et la valeur "fr-FR" au deuxieme demarrage (apres avoir changer le language sur le PC une seule fois au debut).

Public Class frmAB
    Private xLang As String
Private Sub frmAB_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    xLang = Thread.CurrentThread.CurrentCulture.ToString
End Sub
End Class


En esperant avoir ete assez clair sur ce probleme.
Merci,

A+
JLuc01
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Messages postés
3181
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
36
3
Merci
Salut,

Apparemment, ce problème à déjà été rencontré : http://go4answers.webhost4life.com/Example/csharp-windows-service-culture-info-67525.aspx

La solution est de lire la valeur directement dans la base de registre :

<DllImport("kernel32.dll", SetLastError:=True, CharSet:=CharSet.Unicode)> _
Private Shared Function GetProfileString(ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, <Out()> ByVal lpReturnedString As StringBuilder, ByVal nSize As Integer) As Integer
End Function

Private Function GetCurrentCulture() As CultureInfo
  Dim c As CultureInfo = Nothing
  Dim sb As New StringBuilder(200)
  GetProfileString("Intl", "LocaleName", CultureInfo.CurrentCulture.Name, sb, sb.Capacity)
  Try
    c = CultureInfo.GetCultureInfo(sb.ToString())
  Catch
    c = Nothing
  Finally
    If c Is Nothing Then c = CultureInfo.CurrentCulture
  End Try
  Return c
End Function


_____________
Kenji

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 111 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Charles Racaud
Messages postés
208
Date d'inscription
samedi 17 janvier 2009
Statut
Membre
Dernière intervention
5 mars 2013
1
0
Merci
Impeccable. Ca marche tres bien.
Mais, j'avoue que cela me depasse un peu. Je n'ai pas l'habitude d'utiliser "kernell32.dll".
Je ne suis qu'un debutant en VB.net...

Neanmoins, merci beaucoup, cela me sera utile.

A+
JLuc01
Commenter la réponse de cs_JLuc01
0
Merci
Bonjour,

En VB.net, tu n'es pas obligé d'utiliser directement les appels à Kernel32 pour lire une donnée de registre. Tu peux utiliser la classe Registry. Tu dois effectivement savoir quelle clef du registre tu dois lire.
Commenter la réponse de Utilisateur anonyme
0
Merci
Bonjour,

J'ai (enfin ) lu la question attentivement. Pour forcer ton application à monter l'interface en langue étrangère, tu n'as pas besoin de te battre avec le panneau de configuration. Tu n'as qu'à modifier la CurrentUICuulture de ton application quelque part avant d'afficher tes boîtes de dialogues et tes feuilles. Il n'y a plus assez de réserve dans ma batterie de portable pour je cherche tout cela dans l'aide, mais, en gros, il y a deux cultures à utiliser. CurrentCulture concerne l'ordre de tri, les dates, le séparateur décimal, le symbole monétaire et les éléments qui vont différencier, par exemple, fr-FR de fr-Ca. CurrentUICulture concerne principalement les paramètres de l'interface de l'application. Pour avoir une application "complètement" française, anglaise, italienne, allemande etc, il faut jouer avec les deux.
Commenter la réponse de Utilisateur anonyme
Messages postés
3181
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
36
0
Merci
Cmarcotte, le problème est que ces cultures ne sont pas bien actualisées et qu'elles restent à la valeurs précédente.

J'ai utilisé GetProfileString plutôt que de lire directement la valeur du registre car c'et plus sécurisé, et qu'il faut de tout manière éviter des accès direct au registre.

_____________
Kenji
Commenter la réponse de Charles Racaud
Messages postés
208
Date d'inscription
samedi 17 janvier 2009
Statut
Membre
Dernière intervention
5 mars 2013
1
0
Merci
Bonjour,

En fait, j'utilise le panneau de configuration pour tester mon application, une fois en anglais, une fois en francais. Le but etant de pouvoir reconnaitre si cette application doit se mettre en francais ou en anglais dependant du PC de l'utilisateur.

J'avoue avoir en ce moment d'autres problemes avec des boutons sur mon BindingNavigator qui ne veulent pas se mettre en francais et aussi avec des Tooltips qui restent en anglais. Pourtant pour les labels et les boutons, cela marche tres bien.

Pour information (si j'arrive a me faire comprendre), j'ai une Form "Template" (Language=Default, Localizable=True) avec le texte du label du style lblNom et je rentre mes donnees en changeant le language (Language=English(United Kingdom), Localizable=True) avec le texte du label du style Name (respectivement Nom en francais).

Peut-etre que je dois essayer d'ajuster tout cela avec CurrentUICulture et CurrentCulture comme le suggere cmarcotte.
Je vais essayer d'approfondir dans cette direction, meme si je pensais ne pas avoir besoin de CurrentUICulture dans mon cas.

Merci toutefois pour cette discussion.
JLuc01
Commenter la réponse de cs_JLuc01
Messages postés
3181
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
36
0
Merci
C'est surtout que CurrentUICulture est la langue de l'Interface Utilisateur (langue de Windows) (qui peut être modifiée si Windows est installé avec un pack multilangues) alors que CurrentCulture est la lengue du format d'affichage (nombre, dates, monnaie ...) que l'utilisateur sélectionne.

La fonction que je t'ai faite, te retourne une instance de CultureInfo et c'est en effet avec celle-ci que tu dois utiliser pour afficher, des nombres, dates et autres informations dépendant du format. Cette fonction remplace le CurrentCulture.

_____________
Kenji
Commenter la réponse de Charles Racaud
Messages postés
208
Date d'inscription
samedi 17 janvier 2009
Statut
Membre
Dernière intervention
5 mars 2013
1
0
Merci
Donc, si je comprends bien, je n'ai finalement pas besoin de CurrentUICulture.
Mais quand j'utilise un label (via un fichier .resx), est-ce que le CurrentCulture intervient?

De plus, j'ai resolu mon probleme avec les ToolTips sur un bouton avec du code:
Me.ToolTip.SetToolTip(Me.btnLetter, "Ecris une lettre...")

car cela ne marche pas directement a travers le fichier .resx (Name=btnLetter.ToolTip, Value=Ecris une lettre...).

J'avoue etre decu de ne pas pouvoir utiliser le fichier .resx completement.

Probleme un peu plus complique avec le BindingNavigator surtout si on donne ou non un nom a un bouton.
Mais, je devrais arriver a quelquechose avec du code.

A+
JLuc01
Commenter la réponse de cs_JLuc01

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.