IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Problème ressources envoyant perpétuellement le contenu de mon resx "neutre"


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Points : 60
    Points
    60
    Par défaut Problème ressources envoyant perpétuellement le contenu de mon resx "neutre"
    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 :

    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);
    		}
     
        }
    }
    Appel de ma ressource avec cette technique :

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

    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 !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Ricardo_Tubbs Voir le message
    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...
    Pour que tu puisses avoir un fichier designer associé à tes ressources il faut que tu mettes le modificateur d’accès en mettant sa valeur à Public ou Internal.


    Tu peux tester et voir si ce n'est la cause de ton problème.

  3. #3
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Bonjour,

    je pense que vous vous compliquez la vie pour rien... Je suis aussi passé par là récemment et la réponse à mon problème était bien plus simple qu'il n'y paraît...

    Pas besoin de créer votre propre ResourceManager, si vos deux fichiers de ressources sont directement embarqué dans votre projet vous pouvez faire la chose suivante :

    (Resources.fr-FR.resx)
    Welcome=Bienvenue
    (Resources.en-US.resx)
    Welcome=Welcome


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");
    MessageBox.Show(Resources.Welcome); // Bonjour
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
    MessageBox.Show(Resources.Welcome); // Welcome
    ++

    P.S : Un post que j'avais ouvert ou j'avais plus ou moins le même problème : http://www.developpez.net/forums/d10...bly-satellite/

  4. #4
    Membre du Club
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Points : 60
    Points
    60
    Par défaut
    Bonjour messieurs et merci de vos réponses.

    Pour que tu puisses avoir un fichier designer associé à tes ressources il faut que tu mettes le modificateur d’accès en mettant sa valeur à Public ou Internal.
    J'ai changé la propriété en question, et effectivement, une classe Designer apparait. Par contre elle est vide... Et même en y ajoutant des items, au cun changement... Enfin bref !

    je pense que vous vous compliquez la vie pour rien... Je suis aussi passé par là récemment et la réponse à mon problème était bien plus simple qu'il n'y paraît...

    Pas besoin de créer votre propre ResourceManager, si vos deux fichiers de ressources sont directement embarqué dans votre projet vous pouvez faire la chose suivante :

    (Resources.fr-FR.resx)
    Welcome=Bienvenue
    (Resources.en-US.resx)
    Welcome=Welcome
    J'ai essayé de déployer votre technique, et ça n'a rien changé. Pas de bug, mais le resx pris en compte reste le neutre.

    Pour resituer le contexte, le projet est en fait développé dans le cadre de webpart déployées sur un projet Sharepoint. Du coup, si mes resx font bien partie de ma solution, ils sont en revanche copié dans le répertoire App_GlobalResources du VirtualDirectory de l'application... Lorsque j'affiche la propriété Name de System.Threading.Thread.CurrentThread.CurrentUICulture, j'ai bien en-US, mais ce n'est pas suivi d'effet... Je ne comprends vraiment pas où peut se trouver le souci... J'ai lu que le fichier de ressource neutre prenait le "relais" lorsque le fichier pour la langue demandée n'était pas disponible ou pas trouvé, sauf que les fichiers en question se trouvent au même endroit que le "neutre"... oO

  5. #5
    Membre du Club
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Points : 60
    Points
    60
    Par défaut
    Re-bonjour,

    J'ai réussi à résoudre le problème, grâce au post de Arnaud (que je remercie au passage). Je n'avais pas placé les DLL généré pour les langues dans le bin du VirtualDirectory de mon appli. A l'origine, je l'avais fait, puis retiré parce que j'avais d'autres soucis, et je ne pensais pas en avoir besoin... Enfin bref, pour résumer, comme disait tomlev en réponse à la question d'Arnaud http://www.developpez.net/forums/d10...e/#post5830693, seul la langue par défaut (en l'occurrence la neutre) est embarquée dans la DLL du projet. Les autres langues doivent être déployées via leur DLL... Me voilà soulagé !

    En tout cas merci à tous !

  6. #6
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Heureux d'avoir pu rendre service

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Août 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    désolé de ré-ouvrir ce thread un mois plus tard mais j'ai le même problème que Ricardo et rien dans ce thread ne m'a aidé à résoudre le problème.

    J'ai deux fichiers de ressources "Errors.fr.resx" et "Erros.en.resx" en plus d'un fichier neutre "Errors.resx"

    Les trois sont embeded resources et les répertoires spécifiques aux langage "en" et "fr" sont bien créé à la compilation contenant chacun "Devices.MotorControllers.resources.dll"

    Le problème est qu'à l'appel de GetString() il ne me sort QUE la string du fichier neutre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    protected internal System.Resources.ResourceManager m_ResMgr =
                new System.Resources.ResourceManager("Devices.MotorControllers.Errors",
                    System.Reflection.Assembly.GetExecutingAssembly());
    Et avec le code ci-bas je n'obtient qu'une seule entrée "Devices.MotorControllers.Errors.resources"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    string[] sResNames= System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();
    Je ne comprends pas pourquoi il ne voit pas les deux autres assembly...

    Quelqu'un aurait une piste!?
    Cela fait une journée et demi que je passe sur ce #!$/*?& problème!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SimpleXML] Problème avec simpleXML : il n'affiche pas le contenu de mon élément
    Par ploxien dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 05/05/2007, 19h43
  2. [VBA-E] Explorer le contenu de mon dossier
    Par teaRz dans le forum Macros et VBA Excel
    Réponses: 22
    Dernier message: 29/05/2006, 14h04
  3. [SimpleXML] Le contenu de mon élément ne s'affiche pas
    Par alliance dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 08/05/2006, 20h27
  4. Réponses: 5
    Dernier message: 26/04/2006, 16h36
  5. Réponses: 1
    Dernier message: 03/12/2005, 16h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo