ASP.NET > Localization, ressources etc... Tuto ? [C#] - C#/.NET managed - Programmation
Marsh Posté le 20-03-2006 à 14:30:32
Genre ce lien il est pas mal :
http://forum.hardware.fr/hardwaref [...] 7795-1.htm
Mais j'ai rien panné...
(en plus c'est du VB.NET et non du C#, et rien que sur le nom des objets ça merde...)
Marsh Posté le 21-03-2006 à 11:05:52
Arjuna a écrit : Chais pas...
|
Je vois vraiment pas ou est le problème à ton truc.
1e page
Code :
|
1e page (CS)
Code :
|
page2
Code :
|
page2 (CS)
Code :
|
Voila c'est pas plus compliqué que ça. Si tu veux tu peux racourcir le truc en une page.
Marsh Posté le 22-03-2006 à 09:40:50
moi23372 a écrit : Je vois vraiment pas ou est le problème à ton truc. |
Sauf que si demain il doit mettre une langue en plus, il doit recoder ds toutes ses pages...
Tu dois pouvoir charger ton fichier de ressource en fonction de la langue en session.
une idée :
un fichier xml avec des balises et des contenu avec les langues
ex:
Code :
|
et une methode getElement("nomdulabel" ) qui va bien (et qui teste la variable en session)
est ce que l'utilisateur peut changer de langue a la volée ? (je dis ca afin de voir ce qui est le plus pertinent, genre mettre en cache de le fichier de langue ou pas, ou le scinder par langue...)
Marsh Posté le 22-03-2006 à 14:24:47
votre solution, c'est ce que j'ai toujours utilisé.
sauf que ça n'utilise en rien les outils de localisation du FrameWork, hors c'est ça que je demande...
évidement que gérer "manuellement" un document XML ou une table de BDD et utiliser un objet pour y rechercher les libellés que je veux, je sais faire...
la solution actuelle :
Fichier "labels.xml" :
Code :
|
Fichier language.cs :
Code :
|
Appels :
Code :
|
Chuis quand même pas boulet à ce point !
Nan, moi ce que je voudrais, c'est un truc genre :
<asp:Label runat="Server" id="monMsgCod" />
Et zou ! A partir d'un fichier Ressources, ça met automatiquement le libellé correspondant à "monMsgCod" en fonction de la locale actuelle.
Le FrameWork permet de faire ça (à quelques détails près).
J'ai trouvé un bout de code le permettant, mais toujours en se basant sur un truc "manuel", un peu plus amériolé (avec surcharge des méthodes de l'objet WebControl afin de faire la recherche du libellé directement au moment du Render du contrôle, plutôt que de le faire à la main).
Sauf que moi, je cherche une solution pour que ce soit 100% en utilisant le FrameWork.
Quand on a une moissoneuse batteuse, je pense que c'est mieux d'apprendre à utiliser l'engin plutôt que de continuer à moissonner à la fauscille...
Marsh Posté le 22-03-2006 à 15:13:16
oui si tu trouves fait moi signe, ça peut être intéressant.
Marsh Posté le 22-03-2006 à 16:19:30
Arjuna a écrit : votre solution, c'est ce que j'ai toujours utilisé. |
ca sent la phrase d'un ex communiste reconverti (c une blague, n'y voit pas d'attaque perso )
enfin pour etre plus serieux :
http://www.microsoft.com/france/ms [...] lier8.mspx
Mais ca ne marche qu'en Framework 2.0 (c'est peut etre celui que tu utilises)
Marsh Posté le 23-03-2006 à 16:49:23
merci ! c'est exactement ça !
seul truc, c'est que là c'est trop tart, j'ai tout fait à la main
mais je mets de ce pas tout de suite là maintenant ce topic en favoris pour le retrouver à la prochaine appli
(ça tombe bien, j'ai 3 nouvelles applis à commencer d'ici 1 semaine, et toutes doivent être multi-lingues -dont une en arabe, je vais m'amuser avec la présentation de gauche à droite... heureusement, de mémoire le framework sait faire tout seul- )
sinon, je n'ai que regardé la vidéo (qui donne pas énorément d'infos) mais à priori, c'est rigoureusement ce que j'avais déjà vu comme possibilité avec le 1.1
Marsh Posté le 24-03-2006 à 11:09:52
OK, après tests hier, j'ai réussi à faire marcher le bignou comme je voulais avec un projet PocketPC
En plus, grosse nouveauté du framework 2.0 : les ressources embeded sont gérée de façon 100% géniales
-> La ressource "default" est intégrée à l'EXE
-> Les autres sont sous forme de DLL dans un répertoire par culture
-> Le fallback fonctionne correctement : si je suis en "fr-FR" (Français/France), mais qu'il n'y a pas de ressouce associée, il teste la ressource "fr" (Français/Standard), et s'il ne trouve pas, la ressource par défaut (InvariantCultulre, par convention, "en" ), et si toujours rien n'est trouvé, une exception est levée.
-> Si après la compilation on supprime ces DLL, l'appli fonctionne sans problème, mais affiche donc les infos à partir de la ressource par défaut (incluse dans la DLL)
-> Si après la compilation on ajouteune nouvelle DLL en fonction d'une nouvelle culture, elle est immédiatement prise en compte, ce qui permet, comme certains softs, de livrer après coup des traductions, mais aussi de demander à une tierce personne de créer ces traduction au format DLL sans avoir à lui donner les sources de l'appli.
Ce que j'ai fais (je posterai le source ce soir, peut-être dans un nouveau thread) :
- Création de classes GForm et GLabel dérivées de System.Windows.Forms.Form et System.Windows.Forms.Label
- Pour le GForm, override du "OnPaint", afin de faire ce petit algo :
Si this.Text == string.Empty Ou this.Text == this.Name
Alors
try {
this.Text = recherche du txt localisé selon la culture de l'appli (automatiquement mise à la culture UI de l'OS, mais aisément écrasable manuellement si besoin)
} catch (MissingRessourceDefaultMachinChoseException ex) {
this.Text = ex.Message
}
Fin Si
Pour le GLabel, évidement, FrameWork buggé pourri inside... OnPaint ne se déclenche jamais. J'ai pas pu trouver un seul évènement capable de se lancer lors de l'affichage/création du contrôle.
Du coup j'ai ajouté une méthode public "SetLabel()" qui fait la même chose.
J'ai modifié dans mon projet toutes mes Form et Label par GForm et GLabel (G pour "Globalized" ).
Et du coup, sans une ligne de code (sauf ces putains de "SetLabel()" sur les GLabel) je localise et nomme correctement toutes mes fenêtres et libellés.
J'ai créé aussi une class "GMessage" qui me permet de gérer tout ce qui est message (de la même manière, la classe appelle sur le "get" d'une propriété "Text" la ressource correspondant à la valeur du msgCode passé en paramètre au constructeur).
Bref, ça marche et c'est bien cool (mais j'en ai chié un max pour en arriver là )
Marsh Posté le 24-03-2006 à 15:49:07
Arjuna a écrit : Genre ce lien il est pas mal : |
Ah ouais j'me rappelle. J'en ai aussi chié pour réussir à faire tout fonctionner. Mais une fois que t'as capté pour ces histoires de localisation, ça va. Tu remercie les concepteurs d'avoir rendu ça aussi simple (une fois que tout est pigé)...
Marsh Posté le 24-03-2006 à 15:50:46
surtout avec la version 2.0, où maintenant "tous" les défaut des versions précédentes ont disparus !
Marsh Posté le 24-03-2006 à 15:57:06
P'tain, et moi qui doit développer encore sous le 1.1... J'me rappelle de certains trucs (qui touchent aux bases de données et aux transactions). Des machins qui paraissaient logiques, mais seulement implémentés dans le 2.0... Je sais plus exactement ce que c'était. Je crois style impossible de faire un rollback lors d'un UPDATE. Faudrait que je retrouve...
Marsh Posté le 24-03-2006 à 16:05:42
Ah ouais nan voilà : ils ont enfin mis un AcceptChangesDuringUpdate sur les DataAdapter
Marsh Posté le 24-03-2006 à 16:41:03
chais pas, moi je suis de la vieille école, je bosse jamais sur des données en mode connecté. je trouve ça tout ce qu'il y a de plus gore.
Marsh Posté le 27-03-2006 à 09:00:59
Nan là c'est justement pas connecté. C'est plutôt "Je rappatrie ce que je veux dans un DataSet, et après je bosse sur le DataSet. Une fois que c'est fait, mise à jour"...
Marsh Posté le 20-03-2006 à 14:28:39
Chais pas...
Je dois m'y prendre comme un manche, mais je ne trouve rien nulle par de "compréhensible".
J'ai l'impression d'être face à un bouquin où on passé 800 pages à expliquer comment écrire "hello world", et qui explique en 20 lignes comment faire une appli client/server multi-threadée d'un jeu en DX10 avec une architecture déporté.
Mon besoin est simple.
J'ai une page ASPX, avec un texte, genre :
Maintenant, j'ai en Session un code langue.
Il peut être "FRA", "ENG" ou autrechose.
Moi je veux que ça donne :
Et ça met dans mon label :
"Toto va à la plage" quand ma variable est "FRA"
"Toto goes to the beach" quand elle est "ENG"
"Toto va dtc" quand c'est autrechose.
Le tout en utilisant le FrameWork (et un fichier Ressource), plutôt que de faire une méthode proprio qui tape dans la base ou un fichier XML géré à la main.
Est-ce que qq1 peut me trouver un lien vers un tuto, ou me filer un exemple (complet) pour faire ça.
Jusqu'à présent, tout ce que je trouve, c'est formatter une date en "fr-fr" ou "en-us" en fonction d'une Locale écrite en dure dans la page ASPX (genre 25 pages différentes pour 25 cultures différentes -pkoi pas directement coder en dur...-) et jamais traduire un texte et encore moins un exemple complet.
Genre un coup j'ai bien trouvé un truc, mais à aucun moment j'ai eu l'info de comment ajouter et déclarer mon fichier resx dans mon projet, et je m'en suis jamais sorti...
Merci pour votre aide...