Réponses:
Vous devez toujours utiliser le gestionnaire de ressources et ne pas lire directement les fichiers pour vous assurer que la globalisation est prise en compte.
using System.Collections;
using System.Globalization;
using System.Resources;
...
/* Reference to your resources class -- may be named differently in your case */
ResourceManager MyResourceClass =
new ResourceManager(typeof(Resources));
ResourceSet resourceSet =
MyResourceClass.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
foreach (DictionaryEntry entry in resourceSet)
{
string resourceKey = entry.Key.ToString();
object resource = entry.Value;
}
ResourceManager MyResourceClass = new ResourceManager("Resources.ResourceFileName", System.Reflection.Assembly.Load("App_GlobalResources"));
Blogué à ce sujet sur mon blog :) La version courte est, pour trouver les noms complets des ressources (sauf si vous les connaissez déjà):
var assembly = Assembly.GetExecutingAssembly();
foreach (var resourceName in assembly.GetManifestResourceNames())
System.Console.WriteLine(resourceName);
Pour les utiliser tous pour quelque chose:
foreach (var resourceName in assembly.GetManifestResourceNames())
{
using(var stream = assembly.GetManifestResourceStream(resourceName))
{
// Do something with stream
}
}
Pour utiliser des ressources dans d'autres assemblys que celui en cours d'exécution, vous obtiendrez simplement un objet d'assemblage différent en utilisant certaines des autres méthodes statiques de la Assembly
classe. J'espère que ça aide :)
Utiliser la classe ResXResourceReader
ResXResourceReader rsxr = new ResXResourceReader("your resource file path");
// Iterate through the resources and display the contents to the console.
foreach (DictionaryEntry d in rsxr)
{
Console.WriteLine(d.Key.ToString() + ":\t" + d.Value.ToString());
}
// Create a ResXResourceReader for the file items.resx.
ResXResourceReader rsxr = new ResXResourceReader("items.resx");
// Create an IDictionaryEnumerator to iterate through the resources.
IDictionaryEnumerator id = rsxr.GetEnumerator();
// Iterate through the resources and display the contents to the console.
foreach (DictionaryEntry d in rsxr)
{
Console.WriteLine(d.Key.ToString() + ":\t" + d.Value.ToString());
}
//Close the reader.
rsxr.Close();
voir le lien: exemple Microsoft
System.Windows.Forms
assembly et n'est pas automatiquement ajoutée si vous utilisez une application MVC
À la minute où vous ajoutez un fichier .RESX de ressource à votre projet, Visual Studio crée un Designer.cs avec le même nom, créant une classe pour vous avec tous les éléments de la ressource en tant que propriétés statiques. Vous pouvez voir tous les noms de la ressource lorsque vous tapez le point dans l'éditeur après avoir tapé le nom du fichier de ressources.
Vous pouvez également utiliser la réflexion pour parcourir ces noms.
Type resourceType = Type.GetType("AssemblyName.Resource1");
PropertyInfo[] resourceProps = resourceType.GetProperties(
BindingFlags.NonPublic |
BindingFlags.Static |
BindingFlags.GetProperty);
foreach (PropertyInfo info in resourceProps)
{
string name = info.Name;
object value = info.GetValue(null, null); // object can be an image, a string whatever
// do something with name and value
}
Cette méthode n'est évidemment utilisable que lorsque le fichier RESX est dans la portée de l'assembly ou du projet en cours. Sinon, utilisez la méthode fournie par "pulse".
L'avantage de cette méthode est que vous appelez les propriétés réelles qui vous ont été fournies, en tenant compte de toute localisation si vous le souhaitez. Cependant, il est plutôt redondant, car vous devez normalement utiliser la méthode directe de type safe pour appeler les propriétés de vos ressources.
Vous pouvez utiliser ResourceManager.GetResourceSet .
Si vous souhaitez utiliser LINQ, utilisez resourceSet.OfType<DictionaryEntry>()
. L'utilisation de LINQ vous permet, par exemple, de sélectionner des ressources en fonction de leur index (int) au lieu de la clé (chaîne):
ResourceSet resourceSet = Resources.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
foreach (var entry in resourceSet.OfType<DictionaryEntry>().Select((item, i) => new { Index = i, Key = item.Key, Value = item.Value }))
{
Console.WriteLine(@"[{0}] {1}", entry.Index, entry.Key);
}
Avec le package nuget System.Resources.ResourceManager
(v4.3.0) le ResourceSet
etResourceManager.GetResourceSet
ne sont pas disponibles.
Utilisation de ResourceReader
, comme le suggère cet article: " C # - Impossible d'obtenir une chaîne de ResourceManager (à partir de l'assembly satellite) "
Il est toujours possible de lire les clés / valeurs du fichier de ressources.
System.Reflection.Assembly resourceAssembly = System.Reflection.Assembly.Load(new System.Reflection.AssemblyName("YourAssemblyName"));
String[] manifests = resourceAssembly.GetManifestResourceNames();
using (ResourceReader reader = new ResourceReader(resourceAssembly.GetManifestResourceStream(manifests[0])))
{
System.Collections.IDictionaryEnumerator dict = reader.GetEnumerator();
while (dict.MoveNext())
{
String key = dict.Key as String;
String value = dict.Value as String;
}
}
Utilisation de LINQ to SQL :
XDocument
.Load(resxFileName)
.Descendants()
.Where(_ => _.Name == "data")
.Select(_ => $"{ _.Attributes().First(a => a.Name == "name").Value} - {_.Value}");
Boucle de lecture simple utiliser ce code
var resx = ResourcesName.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, false, false);
foreach (DictionaryEntry dictionaryEntry in resx)
{
Console.WriteLine("Key: " + dictionaryEntry.Key);
Console.WriteLine("Val: " + dictionaryEntry.Value);
}