CurrentCulture d'un PC

Résolu
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 - 3 nov. 2012 à 10:41
cs_JLuc01 Messages postés 206 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

8 réponses

Utilisateur anonyme
3 nov. 2012 à 11:27
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
3
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
3 nov. 2012 à 14:37
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
0
Utilisateur anonyme
3 nov. 2012 à 19:24
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.
0
Utilisateur anonyme
3 nov. 2012 à 19:46
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
4 nov. 2012 à 10:55
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
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
4 nov. 2012 à 12:52
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
0
Utilisateur anonyme
4 nov. 2012 à 15:17
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
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
4 nov. 2012 à 22:09
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
0
Rejoignez-nous