Forms : changer de culture à partir de l'interface

Le
Gloops
Bonjour tout le monde,

Au début de l'année, j'ai appris à créer des fichiers de ressourc=
es pour
internationaliser une application, et grâce aux conseils de Gilles j'ai=

su que pour définir dans quelle culture on affiche un formulaire, il
fallait mettre dans le constructeur du formulaire :

Thread.CurrentThread.CurrentUICulture = GetCultureInfo("en-US");

si on veut afficher en Américain, ou adapter la chaîne de caractère=
s
pour une autre.

Je me le suis tenu pour dit, j'ai mis ça en dur, et ça marche. J'ai
supposé qu'en mettant la chaîne dans la ligne de commandes on devait =

pouvoir la récupérer.

Maintenant, je voudrais aller un peu plus loin, et permettre à
l'utilisateur de choisir la culture non plus dans la ligne de commandes, =

mais dans l'interface.

Alors j'ai vu qu'il allait falloir fermer le formulaire et le rouvrir,
et que pour faire ça il fallait en ouvrir un autre (qui pourrait
s'appeler Param), faire la sélection de culture dans cet autre
formulaire, et refaire la manœuvre dans l'autre sens, mais aussi
qu'ouvrir un autre formulaire suppose la création d'un autre thread, et=

la fin du thread courant si on veut fermer le formulaire appelant. Donc
à la place de Thread.CurrentThread bien entendu on met le nom du nouvea=
u
Thread.

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1135710&SiteId==
1

Est-ce que c'est bien ça qu'il faut faire, ou est-ce que je suis en
train de sortir un marteau-pilon pour écraser une mouche ?

Si je lance la commande indiquée ci-dessus (CurrentUICulture = )
alors que le formulaire est déjà ouvert, il reste dans la même cult=
ure
qu'à son ouverture, même si je lance un Refresh.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jean-Luc M.
Le #12146221
Je ne sais pas si ça répondra à ta question mais pour redémarrer une
application, tu peux utiliser Application.Restart()

Pour savoir quelle langue utiliser, tu peux utiliser un Settings (type
string) de ton appli. Tu initialises cette variable avec le nom du
langage à utiliser et au démarrage, tu lis cette valeur avant de
définir ta culture et le tour est joué.

--
Jean-Luc M.
Gloops
Le #12146211
Jean-Luc M. a écrit, le 17/05/2008 16:24 :
Je ne sais pas si ça répondra à ta question mais pour redémarre r une
application, tu peux utiliser Application.Restart()




ça sonne effectivement comme une piste intéressante.
Après, il faut stocker l'option sous une forme qui soit lue au
redémarrage, parce que bien entendu, si je la mets en dur au démarrag e,
j'ai beau mettre une autre valeur avant de redémarrer, ça ne va pas t rop
le faire.

Pour savoir quelle langue utiliser, tu peux utiliser un Settings (type
string) de ton appli. Tu initialises cette variable avec le nom du
langage à utiliser et au démarrage, tu lis cette valeur avant de dé finir
ta culture et le tour est joué.




Voilà qui me paraît être une bonne réponse.

Voyons le résultat.

Alors concrètement, voilà le code du bouton qui demande à afficher en
Anglais (on verra après pour faire une belle liste avec les différent es
cultures disponibles) :

private void btnEnglish_Click(object sender, EventArgs e)
{
Properties.Settings.Default.Culture = "en";
String strLangue = Properties.Settings.Default.Culture;
Application.Restart();
}

strLangue vaut bien "en".

Et voilà le code de démarrage du formulaire principal :

public Form1()
{
String strLangue = Properties.Settings.Default.Culture;
Thread.CurrentThread.CurrentUICulture =
CultureInfo.GetCultureInfo(strLangue);
InitializeComponent();
}

et là, soit on ne s'arrête pas dans le constructeur du formulaire, so it
on s'y arrête mais strLangue vaut "fr" -comme au "design time".

Il y a des trucs qui me laissent perplexe au niveau de l'aide, mais il
me semblait quand même avoir compris. Cette impression serait-elle
trompeuse ?


Ce qui me laisse perplexe, surtout, c'est qu'au départ de l'aide de VS
2005 j'ai mis du temps à arriver là :

Using Settings in C#
http://msdn.microsoft.com/en-us/library/aa730869(VS.80).aspx
Fred
Le #12146201
Dans : news:u2ETa6$,
Gloops disait :
Bonjour tout le monde,



Bonjour,

Si je lance la commande indiquée ci-dessus (CurrentUICulture = ...)
alors que le formulaire est déjà ouvert, il reste dans la même culture
qu'à son ouverture, même si je lance un Refresh.



Regarde dans les sources générés par VS comment la culture est appliquée
aux contrôles. Il suffit d'exécuter ce code à nouveau.

--
Fred

Jean-Luc M.
Le #12146181
> Alors concrètement, voilà le code du bouton qui demande à afficher en Anglais
(on verra après pour faire une belle liste avec les différentes cultures
disponibles) :

private void btnEnglish_Click(object sender, EventArgs e)
{
Properties.Settings.Default.Culture = "en";
String strLangue = Properties.Settings.Default.Culture;
Application.Restart();
}
strLangue vaut bien "en".



Normal, c'est ce qu'il fallait faire.

Et voilà le code de démarrage du formulaire principal :

public Form1()
{
String strLangue = Properties.Settings.Default.Culture;
Thread.CurrentThread.CurrentUICulture > CultureInfo.GetCultureInfo(strLangue);
InitializeComponent();
}

et là, soit on ne s'arrête pas dans le constructeur du formulaire, soit on
s'y arrête mais strLangue vaut "fr" -comme au "design time".



Tu t'arrètes forcément dans le constructeur du formulaire sinon, ton
formulaire n'est pas construit (Lapalisse).

Vérifies que ton Settings est bien en mode Utilisateur et non pas
Application.

J'utilise cette technique pour faire un traitement similaire et ça
fonctionne très bien.

--
Jean-Luc M.
Gloops
Le #12146171
Jean-Luc M. a écrit, le 18/05/2008 20:59 :
Normal, c'est ce qu'il fallait faire.



Ah, on progresse :)

Tu t'arrètes forcément dans le constructeur du formulaire sinon, to n
formulaire n'est pas construit (Lapalisse).



Bon, je vais le dire autrement : j'ai mis un point d'arrêt dans le
constructeur et un dans le code du bouton. Quand je clique sur le
bouton, je vois le point d'arrêt dans son code, et puis juste après l e
formulaire réaffiché.

Mais, il est vrai, pas à tous les coups. Parfois, le point d'arrêt qu e
j'ai mis dans le constructeur est respecté.

On aurait pu dire que j'ai mis un if{}else{} mais j'ai posté
l'intégralité du code du constructeur, je pense que ça se serait vu .


Vérifies que ton Settings est bien en mode Utilisateur et non pas
Application.



ça doit être ça. Depuis hier j'ai oublié. Je regarde demain, la m achine
qui me sert au développement est en cours de sauvegarde d'image ...
Après il sera grand temps de me mettre moi aussi en sauvegarde :)


J'utilise cette technique pour faire un traitement similaire et ça
fonctionne très bien.




Bon, eh bien je vais y arriver.
Pis tant mieux, parce que c'est plus léger que ce que j'ai décrit ...=
Gloops
Le #12146161
Fred a écrit, le 18/05/2008 15:11 :
Si je lance la commande indiquée ci-dessus (CurrentUICulture = ... )
alors que le formulaire est déjà ouvert, il reste dans la même c ulture
qu'à son ouverture, même si je lance un Refresh.



Regarde dans les sources générés par VS comment la culture est ap pliquée
aux contrôles. Il suffit d'exécuter ce code à nouveau.




Bon, je regarde ... en principe demain.
d
Le #12146151
Est-ce que tu utilises les fichiers de ressources .resx pour mettre tes
traductions?
Dans mon appli, je sélectionne la langue et le changement se fait sans
redémarrage d'application, en Live.
Pour ça, j'ai un fichier de ressources par langue et dedans je colles sous
forme de string mes traductions que je récupère sous cette forme:
//Variables globales
public CultureInfo EnglishCulture = new CultureInfo("en-US");
public CultureInfo FrenchCulture = new CultureInfo("fr-FR");
//etc...

public void ChangeLang(int numLanguage) // N° que je récupère via un
automate qui sert de passerelle
{
if(NumLanguage == 0)
setLanguage(EnglishCulture);
if(NumLanguage == 1
setLanguage(FrenchCulture);

//etc...
}

public void setLanguage(CultureInfo Language ) // N° que je récupère via un
automate qui sert de passerelle
{
System.Resources.ResourcesManager rm System.Resources.ResourcesManager(this.GetTypes());

try
{
System.Threading.Thread.CurrentThread.CurrentUICulture = Language;
ChangeText(rm);
}
catch(Exception Ex)
{

}
}

public void ChangeText( System.Resources.ResourcesManager rm ) // N° que je
récupère via un automate qui sert de passerelle
{
//Exemple avec un label
Label1.Text = rm.GetString("Label1");//Nom dans le fichier de resources
}

Voilà, j'espère que ça t'aidera ou d'autres personnes.

David L


"Gloops" news:u2ETa6$
Bonjour tout le monde,

Au début de l'année, j'ai appris à créer des fichiers de ressources pour
internationaliser une application, et grâce aux conseils de Gilles j'ai
su que pour définir dans quelle culture on affiche un formulaire, il
fallait mettre dans le constructeur du formulaire :

Thread.CurrentThread.CurrentUICulture = GetCultureInfo("en-US");

si on veut afficher en Américain, ou adapter la chaîne de caractères
pour une autre.

Je me le suis tenu pour dit, j'ai mis ça en dur, et ça marche. J'ai
supposé qu'en mettant la chaîne dans la ligne de commandes on devait
pouvoir la récupérer.

Maintenant, je voudrais aller un peu plus loin, et permettre à
l'utilisateur de choisir la culture non plus dans la ligne de commandes,
mais dans l'interface.

Alors j'ai vu qu'il allait falloir fermer le formulaire et le rouvrir,
et que pour faire ça il fallait en ouvrir un autre (qui pourrait
s'appeler Param), faire la sélection de culture dans cet autre
formulaire, et refaire la manœuvre dans l'autre sens, mais aussi
qu'ouvrir un autre formulaire suppose la création d'un autre thread, et
la fin du thread courant si on veut fermer le formulaire appelant. Donc
à la place de Thread.CurrentThread bien entendu on met le nom du nouveau
Thread.

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID35710&SiteId=1

Est-ce que c'est bien ça qu'il faut faire, ou est-ce que je suis en
train de sortir un marteau-pilon pour écraser une mouche ?

Si je lance la commande indiquée ci-dessus (CurrentUICulture = ...)
alors que le formulaire est déjà ouvert, il reste dans la même culture
qu'à son ouverture, même si je lance un Refresh.
Fred
Le #12146141
Dans : news:g0rfbn$1gp$,
disait :
Est-ce que tu utilises les fichiers de ressources .resx pour mettre
tes traductions?
Dans mon appli, je sélectionne la langue et le changement se fait sans
redémarrage d'application, en Live.
Pour ça, j'ai un fichier de ressources par langue et dedans je colles
sous forme de string mes traductions que je récupère sous cette forme:



<snip>

Lorsque l'on utilise le designer de VS pour les Forms, les ressources
localisées sont automatiquement créées.
On peut alors les appliquer aux niveau du contrôle et non pour chaque
propriété une à une (bien souvent c'est effectivement le texte qui
change mais cela peut aussi être le positionnement)

ex (copier/coller du code généré par le designer) :
System.ComponentModel.ComponentResourceManager resources = new
System.ComponentModel.ComponentResourceManager(typeof(Form1));
resources.ApplyResources(this.label1, "label1");
resources.ApplyResources(this.textBox1, "textBox1");
resources.ApplyResources(this, "$this");


--
Fred

d
Le #12146131
Je suis d'accord avec toi. J'utilise aussi cette méthode mais elle ne me
donne pas entière satisfaction. Explique moi comment tu fais si tu as
plusieurs intitulés à mettre dans le même label par exemple Marche et Arrêt
en fonction de l'état de ta machine.

C'est pour faire ça que j'utilise la méthode que j'ai donné.

Je veux bien en essayer une autre mais je ne vois pas comment faire avec la
méthode que tu donnes.


David L


"Fred" news:%
Dans : news:g0rfbn$1gp$,
disait :
> Est-ce que tu utilises les fichiers de ressources .resx pour mettre
> tes traductions?
> Dans mon appli, je sélectionne la langue et le changement se fait sans
> redémarrage d'application, en Live.
> Pour ça, j'ai un fichier de ressources par langue et dedans je colles
> sous forme de string mes traductions que je récupère sous cette forme:

<snip>

Lorsque l'on utilise le designer de VS pour les Forms, les ressources
localisées sont automatiquement créées.
On peut alors les appliquer aux niveau du contrôle et non pour chaque
propriété une à une (bien souvent c'est effectivement le texte qui
change mais cela peut aussi être le positionnement)

ex (copier/coller du code généré par le designer) :
System.ComponentModel.ComponentResourceManager resources = new
System.ComponentModel.ComponentResourceManager(typeof(Form1));
resources.ApplyResources(this.label1, "label1");
resources.ApplyResources(this.textBox1, "textBox1");
resources.ApplyResources(this, "$this");


--
Fred




Gloops
Le #12146121
Salut,

Bon, je crois que j'ai trouvé : l'aide ne mentionne nulle part aucune
référence à déclarer pour l'objet Settings, et moi j'ai appliqué bêtement.

Curieusement, d'habitude, quand on oublie une référence, on se fait
rappeler à l'ordre avec un refus de compiler, mais là non, avec maj. F9
on a un message disant que la valeur n'existe pas, mais elle est quand
même passée à une variable (je ne serais pas étonné d'avoir à reformuler
ça ...)

Il m'a semblé que System.Configuration ne devait pas nuire, mais ça n e
semble pas encore suffire, ou alors il faut préciser.

J'ai essayé quelque chose comme ça :
System.Configuration.ApplicationSettingsGroup asg =
new ApplicationSettingsGroup();
asg.AppSettingsSection.Settings.Default.Culture = "en";

Mais là-dessus j'ai comme erreur :
Error 1 The type 'System.Configuration.ConfigurationSectionGroup' is
defined in an assembly that is not referenced. You must add a reference
to assembly 'System.Configuration, Version=2.0.0.0, Culture=neutral,
PublicKeyToken°3f5f7f11d50a3a'.

Bon, ben je vais aller casser une graine, la suite au prochain épisode ...
Publicité
Poster une réponse
Anonyme