Multi-language sans .dll

Résolu
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 - 10 juil. 2007 à 20:27
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 - 24 juil. 2007 à 20:10
Bonsoir à tous,

J'ai cherché sur pas mal de site et googlem ais je n'ai rien trouvé de convaiquant à ce sujet, je désirerais avoir plusieurs langues pour un form sans avoir de .dll en plus de l'exe (je distribue mon exe sans installation), est-ce possible? et si oui comment?

Cordialement

44 réponses

ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
20 juil. 2007 à 21:07
salut,

euh, oui, le settooltip appartient au controle ToolTip qui fournit la tooltip pour tous les autres controles...c'est le principe des controles Provider en .Net (cela reflette d'ailleurs le fonctionne du controle Windows sou jacent)...

pour le currentuiculture, tu lis simplement une des propriétés qui va te donner le code ISO de la langue, le code xx-XX, le nom anglais, le nom local...après tu peux faire un switch sur la propriété que tu veux...la currentuiculture prendra la valeur de langue au lancement de l'application et garde à priori sa valeur jusqu'à la fin de l'exécution...

ShareVB
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
20 juil. 2007 à 22:27
Auriez-vous un exemple du currentuiculture? J'avoue que je suis totalement paumé, même pour le switch, en tout cas merci pour les pistes que vous m'avez fournient!

Cordialement
0
DeadEye0112 Messages postés 28 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 11 septembre 2007 1
23 juil. 2007 à 17:13
Bonjour à toi,
J'ai récemment gouté aux joies de l'internationalistation et j'ai eu à faire avec ce justement... Sur PDA encore plus fun \o/
Sur un PC, ce que tu peux faire au niveau de CurrentUICulture c'est ce genre de choses :

System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");

en oubliant pas de rajouter System.Globalization et sysglob dans tes références.

A partir de là...

Admettons que tu souhaites avoir des fichiers *.resx séparés pour chaque langue (ce que je fais et à l'échelle de 500 chaines >.<)
Le fichier principal sera par exemple lang.resx
Tu devra le mettre en ressources embarquées dans ton projet et lui affecter en "Custom Tool" (Désolé j'ai Visual Studio en anglais \: "ResXFileCodeGenerator" afin de pouvoir y acceder comme tu le souhaites.
Pour acceder à ta ressource, tu fera

string toto = lang.NomDeTaChaineDeCaracteres;

Maintenant tu souhaites passer ton application en anglais.
Tu changes ta CurrentUICulture comme montré plus haut :
System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
Et tu crée un nouveau fichier lang qui sera une sorte de complément à ton fichier principal lang.resx
lang.en-US.resx
C'est le nom de ton fichier anglais. De la même facon que pour le fichier francais tu le remplis et tu aura juste à changer la CurrentUICulture pour que ton programme aille tout seul aller piocher les informations dont il a besoin.
Par contre n'oublie pas de réaffecter chaque valeur (toto = lang.NomDeTaChaineDeCaracteres) (;

Je sais que c'est très très confus mais j'ai pas su faire mieux :o) Si tu as encore des questions... (=
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
23 juil. 2007 à 19:28
Bonjour, jai effectivement créé trois fichiers "lang.resx" "lang.fr-FR.resx" et "lang.en-US.resx" comment faire pour acceder aux ressources ensuites?

J'ai essayé "lang.nomdemacahine" mais il ne me trouve aucune chaine dans "lang.resx". Auriez-vous un mini exemple concret que je vois à quoi cela ressemble?

Merci beaucoup, je suis perdu! lol
0

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

Posez votre question
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
23 juil. 2007 à 19:47
salut,

normalement, si tu as Visual Studio 2005, que tu as ajouté tes chaines avec des noms, que tu as enregistré...normalement ca a créé une classe du nom de ton fichier (lang)
ton_label.text = lang.le_nom_de_la_chaine...

ensuite, la sélection de la langue se fait tout seul...sauf que ca te créer des dlls satellites dans des dossiers fr-FR et co dans le dossier de ton exe...

ShareVB
0
DeadEye0112 Messages postés 28 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 11 septembre 2007 1
23 juil. 2007 à 19:48
Alors.... Pitites question...
1) Tu compiles avec Visual Studio ou avec autre chose ?
Comme a priori c'est ca devrait être le cas...
2) Tes fichiers resx sont-ils bien marqués comme ressources embarquées ?
3) Ton fichier lang.resx a t-il bien dans son champ Custom Tool : "ResXFileCodeGenerator" ?
  Si c'est le cas, alors tu dois voir apparaitre un lang.designer.resx (un truc qui y ressemble en tout cas) qui contient une classe nommée lang

Dans ton code ca doit ressembler à ca :

string toto = lang.UneChaineQuiDechire;
Et normalement lang est interprété comme une classe (grâce à la manip au niveau du "Custom Tool")

Dis moi où ca bloque (;
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
23 juil. 2007 à 20:06
1) Je compile avec Visual Studio 2005 Pro
2) Mes fichiers sont bien marqués comme "ressources incorporés"
3) Oui mon fichier à bien "ResXFileCodeGenerator" et le lang.designer est bien là!

Là ou je bloque c'est pour les autres fichiers resx des différentes langues... j'ai créer un fichier langue "lang.fr-FR" mais lui ne possède pas de lang.fr-FR.designer.resx ...
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
23 juil. 2007 à 20:25
salut,

c'est normal : le CLR choisi le bon tout seul...

si tu veux pouvoir choisir la langue, il faut :
-> soit définir le currentuiculture = new cultureinfo("en-US") avant de lancer ta première form (donc dans program.cs/Main)
-> soit ne pas nommer le fichier bidule.xx-XX.resx mais bidulexxXX.resx puis accéder à bidulexxXX.nom_chaine

ShareVB
0
DeadEye0112 Messages postés 28 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 11 septembre 2007 1
23 juil. 2007 à 20:30
Perso pour mon boulot ce que j'utilise c'est Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR") puis je fais une fonction RefreshLanguage() qui rapelle tous lang.blabla. Soit la technqiue 1 proposée par ShareVB (;
Et effectivement tu n'as pas besoin d'avoir de lang.fr-FR.designer vu que c'est choisi automatiquement (pas assez d'expérience donc je fais confiance à ShareVB pour dire que c'est le CLR (; )
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
23 juil. 2007 à 20:45
La je suis totalement dans le flou...

Si je fais deux fichiers la lang.resx et le lang.fr-FR.resx, à quoi me sert le lang.resx car il n'aura aucune définition dedans?
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
23 juil. 2007 à 21:01
salut,

lang.resx, c'est le fallthrow, c'est la langue neutre (par défaut) de ton application au cas où il n'y aurait aucune dll satellite contenant les strings localisés...il faut donc mettre le texte par défaut pour ne pas risquer de te retrouver avec une application sans texte...

ShareVB
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
23 juil. 2007 à 21:27
D'accord donc dans mon cas les mêmes définitions que le fichier "lang.fr-Fr.resx", ensuite pour la sélection il faut que j'utilise "new cultureinfo ("fr-FR");" mais ou le placer concretement?

L'étape d'après est d'indiquer a quoi correspond chaques strings de chaques contrôles c'est bien ca? Un exemple tout bête?
Merci de vous soucier de mon problème!
0
DeadEye0112 Messages postés 28 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 11 septembre 2007 1
23 juil. 2007 à 21:38
Un exemple tout bête
(Je fais ca sans Visual Studio de tête donc désolé des erreurs ^^)
Tu affiches un label
label1.Text = lang.label1

A présent tu cliques sur le bouton ChangeLanguage :

private void buttonChangeLanguage_Click(object event, ClickEventArgs e)
{
  Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
}

Une fois ca fait il faut "rafraichir" ta page...
Ce qui te donne...

private void buttonChangeLanguage_Click(object event, ClickEventArgs e)

{

  Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
  label1.Text = lang.label1;

}

Normalement ton programme va aller chercher le fichier lang.en-US.resx. S'il ne le trouve pas, ShareVB l'a bien expliqué, ton programme ira chercher dans lang.resx et s'il ne trouve toujours pas, il te pètera une Exception (;

A priori ca devrait être bon, la théorie est là, aprs il faut retester j'ai fait ca de tête (;
0
DeadEye0112 Messages postés 28 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 11 septembre 2007 1
23 juil. 2007 à 21:41
Ah oui et petite indication, ca peut toujours servir...
Le Thread.CurrentThread.CurrentUICulture est, au lancement du programme, égal à la localisation de ton OS (comme c'est francais, j'aime ca !), donc si ton OS est en francais et vient de France (à priori), il sera égal à fr-FR (;
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
23 juil. 2007 à 21:49
using



System.Threading;
using
System.Globalization;




Alors j'ai testé dans mon "Form_Load" j'ai mis ceci :

  Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");
  label1.Text = lang.label1;
  // tous mes autres contrôles...

et pour changer avec un bouton par exemple :

private void buttonChangeLanguage_Click(object event, ClickEventArgs e)
{
  Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
  label1.Text = lang.label1;
  // tous mes autres contrôles...
}

Ca à l'aire de fonctionner, est-ce bon pour le "Form_Load"? J'avais dans la tête d'afficher la langue au démarrage en fonction de la langue du pc de l'utilisateur est-ce possible par la même occasion? Merci beaucoup pour votre aide!
0
DeadEye0112 Messages postés 28 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 11 septembre 2007 1
23 juil. 2007 à 21:58
Pour afficher la langue au démarrage tu peux le faire dans une MessageBox par exemple... C'est pas très propre mais dans un label c'est pas plus dur (;
label2.Text = Thread.CurrentThread.CurrentUICulture.DisplayName;
Normalement ca devrait t'afficher la langue (;
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
23 juil. 2007 à 22:20
J'ai du mal m'expliquer désolé, enfet je souhaiterais qu'au démarrage du programme tous ces contrôles prennent la langue de l'os de l'utilisateur et si une langue n'est pas supportée ça affiche la langue par défault... Je ne vois pas comment faire car si je mets comme plus haut dans mon Form_Load ca va me charger que la langue en fr-FR non?

Cordialement
0
DeadEye0112 Messages postés 28 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 11 septembre 2007 1
23 juil. 2007 à 22:23
La langue par défaut est celle de l'OS donc tu n'as pas de souci à te faire... Si jamais la langue de l'OS n'est pas supportée par ton programme, ce sera lang.resx qui sera utilisé. Donc tu n'as rien à faire (;
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
23 juil. 2007 à 22:57
Dans cette logique il ne faudrait pas que je mette le francais "fr-Fr" dans le Form_Load alors? mais juste les définitions comme label1.Text = lang.label1? C'est bien cela?

Merci de m'avoir expliqué tout en détail, tout c'est éclairci! C'est parfait!
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
23 juil. 2007 à 23:36
J'ai fais comme vous m'avez indiquez un peu plus haut une fonction RefreshLanguage() ce qui m'évite de retaper plusieurs fois tous les lang.blablabla, le code s'en trouve par la même occasion rétréci, de plus je n'ai que cette ligne à rajouter avant la fonction avec la langue choisie "Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");".

Tout marche parfaitement merci à tous ceux qui se sont penchés sur le sujet, ca peux en aider pas mal :)
0
Rejoignez-nous