Bonjour à tous,
Je travaille actuellement sur un projet bilingue. Le client nous impose un certains nombre de normes à appliquer, dont l'utilisation de fichiers de ressource .resx pour la gestion du vocabulaire de l'application. Chose à priori pas trop compliqué à implémenter, sauf que je rencontre quand même un problème que je ne parviens, ni à comprendre, ni à résoudre...
Pour faire court, je dispose de 3 resx :
- Project_ressources.resx
- Project_ressources.fr-fr.resx
- Project_ressources.en-US.resx
Pas de souci de création du ResourceManager. Pas de problème d'item de resource manquant. Pas de message d'erreur en gros, sauf que, quelque soit la culture spécifiée, mon appli m'envoie systématiquement les traductions provenant de mon fichier de ressource "Neutre"... Ce qui est pour le moins problématique (surtout pour l'anglais en fait)...
J'ai testé pas mal de trucs... J'ai commencé par créer une classe spécialement dédiée à récupérer mes ressources :
Appel de ma ressource avec cette technique :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Resources; using System.Globalization; namespace nomClient.Structure.Project { public static class Project_RessourceManager { private static ResourceManager _RM = null; private static CultureInfo _CI = null; static Project_RessourceManager() { } private static void LoadResources(string sRessource, string sCulture) { if (_RM == null) { try { _RM = new ResourceManager("nomClient.Structure.Project."+sRessource, System.Reflection.Assembly.GetExecutingAssembly()); } catch {} } if (_CI == null) { try { _CI = new System.Globalization.CultureInfo(sCulture.ToLower()); } catch { } } } public static string getString(string sRessource, string sCulture, string sKey) { LoadResources(sRessource, sCulture); return _RM.GetString(sKey, _CI); } } }
Puis pensant que le singleton posait problème sur le changement de langue, j'ai tout simplement ajouté la création du RessourceManager, et toutes ses dépendances, dans ma méthode chargeant mes données dans mes champs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 string sHomeTitle = Project_RessourceManager.getString("Project_ressources", sCulture, "Navigation_HomeTitle"); //Nom du menu Accueil
Mais j'ai eu exactement le même résultat que lors de mes précédents tests... Je vous épargne les versions alternatives de ces 2 codes, avec ou sans variables intermédiaires, etc. Plus toutes les manipulations de mes resx...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 string sCulture = System.Threading.Thread.CurrentThread.CurrentUICulture.Name; string sBaseName = "nomClient.Structure.Project.Project_ressources"; Assembly assembly = typeof(nomClient.Structure.Project.Project_ressources).Assembly; ResourceManager manager = new ResourceManager(sBaseName, assembly); CultureInfo ciCulture = new CultureInfo(sCulture); string sHomeTitle = manager.GetString("Navigation_HomeTitle", ciCulture);
J'ai quand même constaté que mon resx "neutre" disposait d'une classe Designer, mais pas les autres... Je ne sais pas comment ça se fait...
En tout cas, si quelqu'un a une idée sur la question... je suis preneur. J'ai passé ma journée à chercher, tester, essayer ce que je pouvais trouver à droite à gauche, et là je suis à sec !
Partager