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 manuvre 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/Sh...p;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.
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 manuvre 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/Sh...p;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.

Poser une question


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.
ç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.
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
Gloops disait :
Bonjour,
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
Normal, c'est ce qu'il fallait faire.
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.
Ah, on progresse :)
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 .
ç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 :)
Bon, eh bien je vais y arriver.
Pis tant mieux, parce que c'est plus léger que ce que j'ai décrit ...=