Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Forms : changer de culture à partir de l'interface

22 réponses
Avatar
Gloops
Bonjour tout le monde,

Au d=E9but de l'ann=E9e, j'ai appris =E0 cr=E9er des fichiers de ressourc=
es pour=20
internationaliser une application, et gr=E2ce aux conseils de Gilles j'ai=
=20
su que pour d=E9finir dans quelle culture on affiche un formulaire, il=20
fallait mettre dans le constructeur du formulaire :

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

si on veut afficher en Am=E9ricain, ou adapter la cha=EEne de caract=E8re=
s=20
pour une autre.

Je me le suis tenu pour dit, j'ai mis =E7a en dur, et =E7a marche. J'ai=20
suppos=E9 qu'en mettant la cha=EEne dans la ligne de commandes on devait =

pouvoir la r=E9cup=E9rer.

Maintenant, je voudrais aller un peu plus loin, et permettre =E0=20
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,=20
et que pour faire =E7a il fallait en ouvrir un autre (qui pourrait=20
s'appeler Param), faire la s=E9lection de culture dans cet autre=20
formulaire, et refaire la man=9Cuvre dans l'autre sens, mais aussi=20
qu'ouvrir un autre formulaire suppose la cr=E9ation d'un autre thread, et=
=20
la fin du thread courant si on veut fermer le formulaire appelant. Donc=20
=E0 la place de Thread.CurrentThread bien entendu on met le nom du nouvea=
u=20
Thread.

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

Est-ce que c'est bien =E7a qu'il faut faire, ou est-ce que je suis en=20
train de sortir un marteau-pilon pour =E9craser une mouche ?

Si je lance la commande indiqu=E9e ci-dessus (CurrentUICulture =3D ...)=20
alors que le formulaire est d=E9j=E0 ouvert, il reste dans la m=EAme cult=
ure=20
qu'=E0 son ouverture, m=EAme si je lance un Refresh.

10 réponses

1 2 3
Avatar
Gloops
Eh bien là, je sens comme un flottement.

Dans les références j'ai ajouté System.Collections.Specialized, pui s de
l'aide j'ai pompé cette procédure :
Avatar
Gloops
Bon, eh bien là je sens comme un flottement.

Dans les références j'ai ajouté System.Collections.Specialized, pui s de
l'aide j'ai ajouté cette procédure :

static void ShowAppSettings()
{
NameValueCollection appStgs = ConfigurationManager.AppSettings;
int c = appStgs.Count;
string[] names = new string[c];
names = ConfigurationManager.AppSettings.AllKeys;

for (int i = 0; i < appStgs.Count; i++)
{
string strNom = names[i];
string strVal = appStgs[i];
System.Diagnostics.Debug.Print(
i.ToString() + "," + strNom + "," + strVal);
}
}

Eh bien appStgs.Count me retourne zéro.
Ouais M'sieur-Dames, pointé.

Avec le ConfigurationManager j'ai pu récupérer une chaîne de connex ion,
celle de SQL Express, et puis c'est tout.

Pourtant, dans le répertoire Properties, fichier Settings.Settings, mon
projet comporte une ligne :
Name : Culture
Type : string
Scope : Application
Value : fr

Ben, j'sais pas pourquoi, mais quelque chose me dit que je me suis
gourré quelque part ...

Je crois que j'ai un emploi du temps pour demain soir : relire l'aide du
paramétrage (et les réponses qui m'ont été faites ici, aussi, car je
crois que j'ai un peu dérivé :) ).
Avatar
Fred
Dans : news:g0roi5$5a9$,
disait :

Je suis d'accord avec toi. J'utilise aussi cette méthode mais elle ne
me donne pas entière satisfaction.



Je ne l'ai pas compris à la lecture de ton post. D'où mes indications
complémentaires.

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.



J'utilise comme toi des resources (que l'application soit localisée ou
non d'ailleurs).
Mais je ne vois pas trop comment généraliser cette problématique. Sur
ton exemple je suppose qu'il y a une procédure qui se déclenche sur un
évènement de changement d'état de la machine en question ? J'ajouterais
un branchement sur le changement de culture de l'application.

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



Je viens de faire une petite recherche et je suis tombé sur ce composant
qui m'a l'air bien complet et bien écrit.
http://www.codeproject.com/KB/cs/CultureManager.aspx


--
Fred

Avatar
d
En effet, mon application est connectée à un serveur OPC. J'ai une fonction
qui est en attente d'actions provenant de ce serveur.

Mais sur l'ihm principale, on a une fenêtre "changement de langue" avec des
boutons correspondants aux différentes nationalités et en utilisant les
mêmes fonctions citées dans les mails précédants, lorsque l'on clique sur un
de ces boutons et en faisant appel à ces fonctions, l'application change au
vol, sans redémarrer quoique ce soit.

Est-ce que la langue ne peut pas être choisie dans l'interface?

Je n'ai pas encore regarder l'exemple mais je vais le faire.

David L

"Fred" a écrit dans le message de
news:e4OuE%
Dans : news:g0roi5$5a9$,
disait :

> Je suis d'accord avec toi. J'utilise aussi cette méthode mais elle ne
> me donne pas entière satisfaction.

Je ne l'ai pas compris à la lecture de ton post. D'où mes indications
complémentaires.

> 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.

J'utilise comme toi des resources (que l'application soit localisée ou
non d'ailleurs).
Mais je ne vois pas trop comment généraliser cette problématique. Sur
ton exemple je suppose qu'il y a une procédure qui se déclenche sur un
évènement de changement d'état de la machine en question ? J'ajouterais
un branchement sur le changement de culture de l'application.

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

Je viens de faire une petite recherche et je suis tombé sur ce composant
qui m'a l'air bien complet et bien écrit.
http://www.codeproject.com/KB/cs/CultureManager.aspx


--
Fred




Avatar
Gloops
Bonjour,

Tout d'abord merci pour vos interventions.

Au début de la semaine, il me manquait deux nuits de sommeil, peut-êt re
que ça s'est vu :/

Aujourd'hui je profite d'une souplesse d'emploi du temps pour progresser
un peu plus sur la question.

Voilà où j'en suis : j'ai sauvegardé la culture sous fichier xml gr âce à :

Save and Restore Setings of a .NET Form using XML
By Daniel Olson May 28, 2002
http://www.c-sharpcorner.com/UploadFile/dolson/SaveandRestoreSetingsofa.N ETFormusingXML11252005230324PM/SaveandRestoreSetingsofa.NETFormusingXML.a spx

A la suite de cela, Application.Restart() finit par afficher le
formulaire dans la bonne langue.

Il me reste à fignoler un peu l'interface, car là j'ai deux horribles
boutons pour les langues, même pas au même endroit sur le formulaire :)


Après, je vais revenir sur ce que vous me disiez, car plusieurs d'entre
vous ont laissé entendre qu'il doit y avoir plus léger comme façon de
procéder. Un obstacle à franchir pour s'affranchir du
Application.Restart() est d'être capable d'exploiter les fichiers de
ressources après le InitializeComponent du formulaire (je veux dire san s
aller lire explicitement chaque texte, puisque le but est d'obtenir un
traitement plus léger).

Une chose intéressante à faire aussi, et sur quoi portaient vos
réponses, sera d'exploiter les fichiers de paramétrage en tant que te ls,
puisqu'aussi bien Microsoft s'est donné la peine de proposer ça. Je
soupçonne que cette première lancée via xml devrait aider à m'é clairer
la voie.
Avatar
Fred
Dans : news:eJ$,
Gloops disait :
Bonjour,



Bonjour,

Voilà où j'en suis : j'ai sauvegardé la culture sous fichier xml
grâce à :
Save and Restore Setings of a .NET Form using XML
By Daniel Olson May 28, 2002
http://www.c-sharpcorner.com/UploadFile/dolson/SaveandRestoreSetingsofa.NETFormusingXML11252005230324PM/SaveandRestoreSetingsofa.NETFormusingXML.aspx



Un article qui date de 2002.
Ne serait-il pas plus judicieux de tirer parti de ceci par exemple ?
System.Configuration.ApplicationSettingsBase

Gestion des settings dans ce cas (et non des resources comme évoqué dans
le fil)
Quasiment pas de code à écrire.

--
Fred

Avatar
Gloops
Fred a écrit, le 22/05/2008 15:44 :
Un article qui date de 2002.
Ne serait-il pas plus judicieux de tirer parti de ceci par exemple ?
System.Configuration.ApplicationSettingsBase

Gestion des settings dans ce cas (et non des resources comme évoqué dans
le fil)
Quasiment pas de code à écrire.




Oui, un moment j'ai essayé d'utiliser ApplicationSettingsBase.
Si je ne m'abuse il faut commencer par la dériver avant de l'instancier ?

Pour le moment je suis parti sur un projet Access, mais après je revien s
voir ça, je vais bien finir par trouver la syntaxe exacte.

Merci.
Avatar
Fred
Dans : news:ux7%,
Gloops disait :
Fred a écrit, le 22/05/2008 15:44 :
Un article qui date de 2002.
Ne serait-il pas plus judicieux de tirer parti de ceci par exemple ?
System.Configuration.ApplicationSettingsBase

Gestion des settings dans ce cas (et non des resources comme évoqué
dans le fil)
Quasiment pas de code à écrire.




Oui, un moment j'ai essayé d'utiliser ApplicationSettingsBase.
Si je ne m'abuse il faut commencer par la dériver avant de
l'instancier ?



Pourquoi faire compliqué quand VS le fait à ta place ? Libre à toi de
regarder ensuite le code généré pour approfondir.
Tu déclares un «setting» dans Visual Studio (de portée Application
(lecture seule) ou User (lecture écriture)) et le code permettant d'y
accéder est auto-généré.

Un petit exemple fait en deux minutes qui mémorise la position de la
fenêtre (j'ai déclaré un Setting nommé pos de type Drawing.Point)

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Location = Properties.Settings.Default.pos;
}
private void Form1_Closing(object sender,
System.Windows.Forms.FormClosingEventArgs e)
{
Properties.Settings.Default.pos = this.Location;
Properties.Settings.Default.Save() ;
}
}

--
Fred

Avatar
Gloops
Fred a écrit, le 22/05/2008 17:37 :
Properties.Settings.Default.Save() ;



ça devait être ça qui manquait.

Effectivement, c'était simple, mais on dirait que je suis passé à c ôté.
Si je me rappelle bien, j'ai dû essayer du côté de
Properties.Settings.Save, ou de Properties.Save, ou les deux, et on m'a
répondu un truc du style y a pas ça en magasin.

Si ça va si vite que ça, j'essaie peut-être ce soir.
Avatar
Gloops
Gloops a écrit, le 22/05/2008 17:59 :
Fred a écrit, le 22/05/2008 17:37 :
Properties.Settings.Default.Save() ;



ça devait être ça qui manquait.

Effectivement, c'était simple, mais on dirait que je suis passé à côté.
Si je me rappelle bien, j'ai dû essayer du côté de
Properties.Settings.Save, ou de Properties.Save, ou les deux, et on m'a
répondu un truc du style y a pas ça en magasin.

Si ça va si vite que ça, j'essaie peut-être ce soir.





Properties.Settings.Default.Culture = "fr";

Error 1 Property or indexer 'LanceAppel2.Properties.Settings.Culture'
cannot be assigned to -- it is read only

Certes on peut ajouter un set, en plus du get, mais si je ne m'abuse
Settings.Designer.cs est un code généré, donc ce n'est pas la bonne
approche de retoucher manuellement dedans :

// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.

Est-ce qu'il y a une option quelque part pour dire qu'on veut un
paramètre accessible en écriture ?
1 2 3