membaca string dari file .resx di C #

99

Bagaimana cara membaca string dari file .resx di c #? tolong kirimkan saya pedoman. selangkah demi selangkah

Angsa Merah
sumber
Lihat tautan ini , ini akan membantu.
Adriaan Stander
15
mengapa? jika mereka tidak memuaskan saya atas pertanyaan saya, lalu mengapa saya harus menerima saran yang salah?
Red Swan
1
Jika file .resx ditambahkan menggunakan Visual Studio di bawah properti proyek, lihat jawaban saya untuk cara yang lebih mudah dan lebih sedikit rawan kesalahan untuk mengakses string.
Joshcodes

Jawaban:

75

Contoh ini dari halaman MSDN di ResourceManager.GetString () :

// Create a resource manager to retrieve resources.
ResourceManager rm = new ResourceManager("items", Assembly.GetExecutingAssembly());

// Retrieve the value of the string resource named "welcome".
// The resource manager will retrieve the value of the  
// localized resource using the caller's current culture setting.
String str = rm.GetString("welcome");
JeffH
sumber
4
Dari halaman MSDN saya mereferensikan: baseName Nama root dari file sumber daya tanpa ekstensinya tetapi termasuk nama namespace yang memenuhi syarat. Misalnya, nama root untuk file resource yang bernama MyApplication.MyResource.en-US.resources adalah MyApplication.MyResource.
JeffH
1
item == namespace dari file sumber daya
7
contoh yang buruk: Anda harus menjelaskan bahwa item adalah namespace + tipe root dari sumber daya
ActiveX
Anda hanya perlu ResourceManagersaat Anda ingin memuat sumber daya Eksternal. Gunakan <Namespace>.Propertiessebagai gantinya.
Yousha Aleayoub
131

ResourceManagertidak diperlukan kecuali Anda memuat dari sumber daya eksternal .
Untuk sebagian besar hal, katakanlah Anda telah membuat proyek (DLL, WinForms, apa pun), Anda cukup menggunakan namespace proyek, "Sumber Daya", dan pengenal sumber daya. misalnya:

Dengan asumsi ruang nama proyek: UberSoft.WidgetPro

Dan resx Anda berisi:

contoh konten resx

Anda bisa menggunakan:

Ubersoft.WidgetPro.Properties.Resources.RESPONSE_SEARCH_WILFRED
nathanchere.dll
sumber
4
Terima kasih banyak untuk jawaban ini.
Vaishali
1
Terima kasih, ini harus ditandai sebagai jawaban. Jauh lebih jelas dan lebih bersih daripada "jawaban" dari pertanyaan ini.
Jeroen Jonkman
Jenis atau namespace tidak ada
Paul McCarthy
53

Coba ini, berhasil untuk saya .. sederhana

Asumsikan bahwa nama file sumber daya Anda adalah "TestResource.resx", dan Anda ingin meneruskan kunci secara dinamis,

string resVal = TestResource.ResourceManager.GetString(dynamicKeyVal);

Tambahkan Namespace

using System.Resources;
Muru Bakthavachalam
sumber
Anda juga dapat menentukan Budaya - berguna jika Anda ingin memastikan keluaran khusus budaya yang bertentangan dengan default. misalnya TestResource.ResourceManager.GetString (deskripsi, CultureInfo baru ("en-GB"));
Ian
Saya mendapatkan kesalahan berikut: 'Resources' tidak berisi definisi untuk 'GetString'.
Lechucico
Anda hanya perlu ResourceManagersaat Anda ingin memuat sumber daya Eksternal. Gunakan <Namespace>.Propertiessebagai gantinya.
Yousha Aleayoub
29

Buka file .resx dan setel "Access Modifier" ke Public.

var <Variable Name> = Properties.Resources.<Resource Name>
SasHok.Tk
sumber
2
apakah metode ini bekerja dengan banyak file sumber daya (bahasa), karena di mana-mana saya melihat mereka menggunakan Metode ResourceManager, dan saya bertanya-tanya apakah saya harus mengambil risiko menggunakan cara ini, atau tidak ...
deadManN
1
Tidak bekerja. File sumber daya saya tidak ditampilkan setelah Properties.Resources. "My filename" meskipun disetel ke publik
pengguna1804084
27

Dengan asumsi file .resx telah ditambahkan menggunakan Visual Studio di bawah properti proyek, ada cara yang lebih mudah dan lebih sedikit rawan kesalahan untuk mengakses string.

  1. Memperluas file .resx di Solution Explorer akan menampilkan file .Designer.cs.
  2. Saat dibuka, file .Designer.cs memiliki namespace Properties dan kelas internal. Untuk contoh ini asumsikan kelas tersebut bernama Resources.
  3. Mengakses string itu semudah:

    var resourceManager = JoshCodes.Core.Testing.Unit.Properties.Resources.ResourceManager;
    var exampleXmlString = resourceManager.GetString("exampleXml");
  4. Ganti JoshCodes.Core.Testing.Unitdengan namespace default proyek.

  5. Ganti "exampleXml" dengan nama sumber daya string Anda.
Joshcodes
sumber
3
Sangat membantu. Terima kasih.
ejmin
16

Diikuti oleh jawaban @JeffH, saya sarankan untuk menggunakan typeof()daripada nama rakitan string.

    var rm = new ResourceManager(typeof(YourAssembly.Properties.Resources));
    string message = rm.GetString("NameOfKey", CultureInfo.CreateSpecificCulture("ja-JP"));
Youngjae
sumber
10

Jika karena alasan tertentu Anda tidak dapat meletakkan file sumber daya di App_GlobalResources, Anda dapat membuka file sumber daya secara langsung menggunakan ResXResourceReader atau XML Reader.

Berikut kode contoh untuk menggunakan ResXResourceReader:

   public static string GetResourceString(string ResourceName, string strKey)
   {


       //Figure out the path to where your resource files are located.
       //In this example, I'm figuring out the path to where a SharePoint feature directory is relative to a custom SharePoint layouts subdirectory.  

       string currentDirectory = Path.GetDirectoryName(HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ServerVariables["SCRIPT_NAME"]));

       string featureDirectory = Path.GetFullPath(currentDirectory + "\\..\\..\\..\\FEATURES\\FEATURENAME\\Resources");

       //Look for files containing the name
       List<string> resourceFileNameList = new List<string>();

       DirectoryInfo resourceDir = new DirectoryInfo(featureDirectory);

       var resourceFiles = resourceDir.GetFiles();

       foreach (FileInfo fi in resourceFiles)
       {
           if (fi.Name.Length > ResourceName.Length+1 && fi.Name.ToLower().Substring(0,ResourceName.Length + 1) == ResourceName.ToLower()+".")
           {
               resourceFileNameList.Add(fi.Name);

           }
        }

       if (resourceFileNameList.Count <= 0)
       { return ""; }


       //Get the current culture
       string strCulture = CultureInfo.CurrentCulture.Name;

       string[] cultureStrings = strCulture.Split('-');

       string strLanguageString = cultureStrings[0];


       string strResourceFileName="";
       string strDefaultFileName = resourceFileNameList[0];
       foreach (string resFileName in resourceFileNameList)
       {
           if (resFileName.ToLower() == ResourceName.ToLower() + ".resx")
           {
               strDefaultFileName = resFileName;
           }

           if (resFileName.ToLower() == ResourceName.ToLower() + "."+strCulture.ToLower() + ".resx")
           {
               strResourceFileName = resFileName;
               break;
           }
           else if (resFileName.ToLower() == ResourceName.ToLower() + "." + strLanguageString.ToLower() + ".resx")
           {
               strResourceFileName = resFileName;
               break;
           }
       }

       if (strResourceFileName == "")
       {
           strResourceFileName = strDefaultFileName;
       }



       //Use resx resource reader to read the file in.
       //https://msdn.microsoft.com/en-us/library/system.resources.resxresourcereader.aspx

       ResXResourceReader rsxr = new ResXResourceReader(featureDirectory + "\\"+ strResourceFileName);         

       //IDictionaryEnumerator idenumerator = rsxr.GetEnumerator();
       foreach (DictionaryEntry d in rsxr)
       {
           if (d.Key.ToString().ToLower() == strKey.ToLower())
           {
               return d.Value.ToString();
           }
       }


       return "";
   }
WWC
sumber
Terima kasih, perhatikan bahwa Anda harus menambahkan referensi System.Windows.Formsuntuk digunakan System.Resources.ResXResourceReader. Selain itu, Anda dapat melakukan var enumerator = rsxr.OfType<DictionaryEntry>();dan menggunakan LINQ sebagai gantinya.
Dunc
Sangat sulit untuk menemukan artikel atau posting tentang cara "membaca, mengurai, dan memuat" file resx. Yang Anda dapatkan hanyalah "menggunakan resx sebagai wadah untuk string proyek Anda". Terima kasih atas jawaban ini!
Simone
9

Setelah Anda menambahkan sumber daya (Name: ResourceName dan Value: ResourceValue) ke solusi / perakitan, Anda cukup menggunakan "Properties.Resources.ResourceName" untuk mendapatkan sumber daya yang diperlukan.

Raghunath Rajendren
sumber
7

Saya menambahkan file .resx melalui Visual Studio. Ini membuat designer.csfile dengan properti untuk segera mengembalikan nilai kunci apa pun yang saya inginkan. Misalnya, ini adalah beberapa kode yang dibuat secara otomatis dari file desainer.

/// <summary>
///   Looks up a localized string similar to When creating a Commissioning change request, you must select valid Assignees, a Type, a Component, and at least one (1) affected unit..
/// </summary>
public static string MyErrorMessage {
    get {
        return ResourceManager.GetString("MyErrorMessage", resourceCulture);
    }
}

Dengan cara itu, saya dapat melakukan:

string message = Errors.MyErrorMessage;

Di mana Errorsadalah Errors.resxfile yang dibuat melalui Visual Studio dan MyErrorMessageadalah kuncinya.

Justin Skiles
sumber
Yup yang baru saja saya lakukan adalah VS2015 hari ini. Klik kanan, tambahkan file "Resources", dan semua kunci menjadi "dottable". Jadi "MyResx.resx" dengan kunci "Script" dapat diakses seperti string scriptValue = MyResx.Script;
ampelas. Noel
5

Saya menambahkan file sumber daya saya ke proyek saya secara langsung, sehingga saya dapat mengakses string di dalamnya dengan baik dengan nama file resx.

Contoh: di Resource1.resx, kunci "resourceKey" -> string "dataString". Untuk mendapatkan string "dataString", saya hanya meletakkan Resource1.resourceKey.

Mungkin ada alasan untuk tidak melakukan ini yang tidak saya ketahui, tetapi berhasil untuk saya.

Eliezer Miron
sumber
3

Cara termudah untuk melakukannya adalah:

  1. Buat folder sistem App_GlobalResources dan tambahkan file sumber daya ke dalamnya, misalnya Messages.resx
  2. Buat entri Anda di file sumber daya misalnya ErrorMsg = Ini adalah kesalahan.
  3. Kemudian untuk mengakses entri itu: string errormsg = Resources.Messages.ErrorMsg
Nomad77
sumber
2

Cara termudah untuk mendapatkan nilai dari file sumber daya. Tambahkan file Sumber Daya dalam proyek. Sekarang dapatkan string di mana Anda ingin menambahkan seperti dalam kasus saya itu adalah blok teks (SilverLight). Tidak perlu menambahkan namespace juga. Ini berfungsi dengan baik dalam kasus saya

txtStatus.Text = Constants.RefractionUpdateMessage;

Konstanta adalah nama file sumber daya saya dalam proyek.Berikut tampilan file resource saya

PRATEEK GHOSH
sumber
0

Buat pengelola sumber daya untuk mengambil sumber daya.

ResourceManager rm = new ResourceManager("param1",Assembly.GetExecutingAssembly());

String str = rm.GetString("param2");

param1 = "AssemblyName.ResourceFolderName.ResourceFileName"

param2 = nama string yang akan diambil dari file sumber daya

Logan412
sumber
0

Ini berhasil untuk saya. katakanlah Anda memiliki file strings.resx dengan string ok di dalamnya. untuk membacanya

String varOk = My.Resources.strings.ok
Miguel Silva
sumber