Jawaban:
Anda harus selalu menggunakan manajer sumber daya dan tidak membaca file secara langsung untuk memastikan globalisasi diperhitungkan.
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"));
Blogged tentang hal itu di blog saya :) Versi singkatnya adalah, untuk menemukan nama lengkap sumber daya (kecuali Anda sudah mengetahuinya):
var assembly = Assembly.GetExecutingAssembly();
foreach (var resourceName in assembly.GetManifestResourceNames())
System.Console.WriteLine(resourceName);
Untuk menggunakan semuanya untuk sesuatu:
foreach (var resourceName in assembly.GetManifestResourceNames())
{
using(var stream = assembly.GetManifestResourceStream(resourceName))
{
// Do something with stream
}
}
Untuk menggunakan sumber daya di rakitan lain daripada yang sedang dieksekusi, Anda hanya akan mendapatkan objek rakitan yang berbeda dengan menggunakan beberapa metode statis lain di Assembly
kelas. Semoga bermanfaat :)
Gunakan Kelas 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();
lihat tautan: contoh microsoft
System.Windows.Forms
perakitan dan tidak secara otomatis ditambahkan jika Anda menggunakan aplikasi MVC
Begitu Anda menambahkan file .RESX sumber daya ke proyek Anda, Visual Studio akan membuat Designer.cs dengan nama yang sama, menciptakan kelas untuk Anda dengan semua item sumber daya sebagai properti statis. Anda bisa melihat semua nama sumber daya saat Anda mengetik titik di editor setelah Anda mengetik nama file sumber daya.
Atau, Anda dapat menggunakan refleksi untuk mengulangi nama-nama ini.
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
}
Metode ini jelas hanya dapat digunakan ketika file RESX berada dalam lingkup perakitan atau proyek saat ini. Kalau tidak, gunakan metode yang disediakan oleh "pulsa".
Keuntungan dari metode ini adalah Anda memanggil properti aktual yang telah disediakan untuk Anda, dengan mempertimbangkan lokalisasi apa pun jika Anda mau. Namun, ini agak berlebihan, karena biasanya Anda harus menggunakan metode safe type langsung untuk memanggil properti dari sumber daya Anda.
Anda dapat menggunakan ResourceManager.GetResourceSet .
Jika Anda ingin menggunakan LINQ, gunakan resourceSet.OfType<DictionaryEntry>()
. Menggunakan LINQ memungkinkan Anda, misalnya, untuk memilih sumber daya berdasarkan indeks (int) mereka daripada kunci (string):
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);
}
Dengan paket System.Resources.ResourceManager
nuget (v4.3.0) ResourceSet
danResourceManager.GetResourceSet
tidak tersedia.
Menggunakan ResourceReader
, seperti yang disarankan oleh pos ini: " C # - Tidak dapat memperoleh string dari ResourceManager (dari perakitan satelit) "
Masih mungkin untuk membaca kunci / nilai file sumber daya.
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;
}
}
Menggunakan LINQ ke SQL :
XDocument
.Load(resxFileName)
.Descendants()
.Where(_ => _.Name == "data")
.Select(_ => $"{ _.Attributes().First(a => a.Name == "name").Value} - {_.Value}");
Baca lingkaran sederhana menggunakan kode ini
var resx = ResourcesName.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, false, false);
foreach (DictionaryEntry dictionaryEntry in resx)
{
Console.WriteLine("Key: " + dictionaryEntry.Key);
Console.WriteLine("Val: " + dictionaryEntry.Value);
}