web-dev-qa-db-fra.com

Utiliser ResourceManager

J'essaie d'utiliser ResourceManager dans une classe C #, mais je ne sais pas quoi remplacer par le nom de base lors de la création d'une nouvelle instance de la classe ResourceManager.

J'ai un projet séparé qui contient les fichiers de ressources référencés par mon projet ci-dessus nommé comme suit:

  • Ressources.resx 
  • Resources.es-ES.resx 

Si j'ai un extrait de code comme suit, que dois-je remplacer par le nom de base lorsque je souhaite utiliser la version anglaise ou espagnole des ressources?

ResourceManager RM = new ResourceManager(basename,Assembly.GetExecutingAssembly());

J'ai essayé l'approche suggérée par Tom, mais j'obtiens l'erreur infâme

Impossible de trouver des ressources appropriées pour la culture spécifiée ou la culture neutre.

Ma solution a deux projets où le projet YeagerTech est une application Web et le projet YeagerTechResources contient toutes les ressources. Le projet YeagerTech fait référence à YeagerTechResources. 

J'ai la syntaxe suivante lors de la création de mon gestionnaire de ressources: 

ResourceManager RM = new ResourceManager("YeagerTechResources.Resources",
    Assembly.GetExecutingAssembly());

Évidemment, c'est incorrect. 

Les fichiers de ressources du projet YeagerTechResources ont leur BuildAction défini sur Embedded Resource. 

Les noms de mes fichiers de ressources sont: Resources.resx et Resources.es-ES.resx. 

Si quelqu'un pouvait simplement me dire la syntaxe exacte à utiliser en fonction de mon projet et des noms de fichier de ressources lors de l'instanciation du gestionnaire de ressources, je l'apprécierais grandement ...

J'ai tout fait pour résoudre ce problème et je ne peux pas ...

Ceci est ma dernière tentative de le résoudre ici ...

ResourceManager RM = new ResourceManager("YeagerTechResources.Resources", Assembly.GetExecutingAssembly());

sb.Append(RM.GetString("RegisterThanks"));

J'obtiens l'erreur suivante après avoir exécuté le code ci-dessus:

Impossible de trouver des ressources appropriées pour la culture spécifiée ou la culture neutre. Assurez-vous que "YeagerTechResources.Resources.resources" a été correctement incorporé ou lié dans Assembly "YeagerTech" lors de la compilation, ou que tous les assemblys satellites requis sont chargeables et entièrement signés.

Je suis en mesure d'utiliser les ressources du balisage HTML sans aucun problème, mais lorsque j'arrive au code C # dans le contrôleur, je continue à obtenir l'erreur ci-dessus.

Toute aide pour la syntaxe exacte dont j'ai besoin en fonction de mes projets serait grandement appréciée.

20
sagesky36

Il existe un moyen étonnamment simple de lire ressource par chaîne:

ResourceNamespace.ResxFileName.ResourceManager.GetString("ResourceKey")

C'est une solution propre et élégante pour la lecture de ressources par clés où la "notation par points" ne peut pas être utilisée (par exemple, lorsque la clé de ressources est persistante dans la base de données).

39
Landeeyo

Le moyen rapide et sale de vérifier la chaîne dont vous avez besoin pour consulter les fichiers .resources générés.

Vos .resources sont générés dans le répertoire de ressources projects obj/Debug . (Si ce n'est pas le cas, cliquez avec le bouton droit sur le fichier .resx dans l'explorateur de solutions et cliquez sur 'Exécuter l'outil personnalisé' pour générer les fichiers .resources.)

Accédez à ce répertoire et consultez les noms de fichiers. Vous devriez voir un fichier se terminant par XYZ.resources. Copiez ce nom de fichier et supprimez les .resources de fin, c’est le fichier que vous devez charger. 

Par exemple, dans mon répertoire obj/Bin, j'ai le fichier:

MyLocalisation.Properties.Resources.resources

Si les fichiers de ressources sont dans la même bibliothèque/application de classe, j'utiliserais le C # suivant

ResourceManager RM = new ResourceManager("MyLocalisation.Properties.Resources", Assembly.GetExecutingAssembly());

Cependant, vous avez probablement l’impression que vous utilisez le fichier de ressources d’une bibliothèque/application de classe distincte.

Assembly localisationAssembly = Assembly.Load("MyLocalisation");
ResourceManager RM =  new ResourceManager("MyLocalisation.Properties.Resources", localisationAssembly);
17
SinOB

Cette SO réponse pourrait aider dans ce cas.
Si le projet main fait déjà référence au projet resource, vous pouvez simplement utiliser explicitement votre classe de ressources générées dans votre code et accéder à sa ResourceManager à partir de celui-ci. Par conséquent, quelque chose dans les lignes de:

ResourceManager resMan = YeagerTechResources.Resources.ResourceManager;

// then, you could go on working with that
ResourceSet resourceSet = resMan.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
// ...
10
superjos

Selon la documentation MSDN here , l'argument basename spécifie "Le nom racine du fichier de ressources, sans son extension, mais inclut tout nom d'espace de nom complet. Par exemple, le nom racine du fichier de ressources nommé" MyApplication. MyResource.en-US.resources "est" MyApplication.MyResource "."

ResourceManager essaiera automatiquement de récupérer les valeurs de la culture d'interface utilisateur actuelle . Si vous souhaitez utiliser une langue spécifique, vous devez définir la culture d'interface utilisateur actuelle sur la langue que vous souhaitez utiliser.

4
Tom Lint

en principe, c'est la même idée que @Landeeyos. de toute façon, développant cette réponse: un peu en retard pour le parti mais voici mes deux centimes:

scénario:

J'ai un cas unique d'ajouter des fichiers de modèle prédéfinis (environ 28 fichiers texte) avec mon application WPF. Donc, l’idée est que chaque fois que cette application doit être installée, ces modèles de fichiers texte seront facilement disponibles. Quoi qu'il en soit, ce que j'ai fait, c'est créer une bibliothèque séparée pour contenir les fichiers en ajoutant un fichier resource.resx. Ensuite, j'ai ajouté tous ces fichiers à ce fichier de ressources (si vous double-cliquez sur un fichier .resx, son concepteur est ouvert dans visual studio). J'avais réglé le modificateur d'accès sur public pour tous. En outre, chaque fichier a été marqué en tant que ressource incorporée via l'action de construction de chaque fichier texte (vous pouvez l'obtenir en consultant ses propriétés). appelons cette bibliothek1.dll J'ai référencé cette bibliothèque ci-dessus (bibliothek1.dll) dans une autre bibliothèque (appelez-la bibliothek2.dll), puis avons utilisé cette seconde bibliothèque dans l'application mf wpf.

amusement réel:

        // embedded resource file name <i>with out extension</i>(this is vital!) 

        string fileWithoutExt = Path.GetFileNameWithoutExtension(fileName);

        // is required in the next step

        // without specifying the culture
        string wildFile = IamAResourceFile.ResourceManager.GetString(fileWithoutExt);
        Console.Write(wildFile);

        // with culture
        string culturedFile = IamAResourceFile.ResourceManager.GetString(fileWithoutExt, CultureInfo.InvariantCulture);
        Console.Write(culturedFile);

échantillon: checkout 'testingresourcefilesusage' @ https://github.com/Natsikap/samples.git

J'espère que cela aidera quelqu'un, un jour, quelque part!

0
Ada_Spark

Je suis passé par un problème similaire ... Si vous considérez votre "YeagerTechResources.Resources", cela signifie que votre Resources.resx est dans le dossier racine de votre projet.

Veillez à inclure le chemin complet, par exemple: "projet\sous-dossier (s)\fichier [.resx]" vers le constructeur ResourceManager.

0
leguminator