C # 'da .resx dosyasından dizeyi oku


100

Dize c # .resx dosyasından nasıl okunur? lütfen bana yönergeler gönderin. adım adım


Bu bağlantıya bir göz atın , yardımcı olmalı.
Adriaan Stander

15
neden? sorularımda beni tatmin etmezlerse, neden yanlış önerileri kabul etmek zorundayım?
Red Swan

1
.Resx dosya proje özellikleri altında Visual Studio kullanarak eklenmişse, bkz cevabım dize erişmek için daha kolay ve daha az hata eğilimli yol.
Joshcodes

Yanıtlar:


74

Bu örnek, ResourceManager.GetString () üzerindeki MSDN sayfasındandır :

// 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");

4
Başvurduğum MSDN sayfasından: baseName Kaynak dosyasının kök adı, uzantısı olmadan, ancak tüm tam nitelikli ad alanı adı dahil. Örneğin, MyApplication.MyResource.en-US.resources adlı kaynak dosyasının kök adı MyApplication.MyResource şeklindedir.
JeffH

1
items == kaynak dosyanın ad alanı

9
zayıf örnek: öğelerin ad alanı + kaynağın kök türü olduğunu açıklamalısınız
ActiveX

Yalnızca ResourceManagerHarici bir kaynak yüklemek istediğinizde ihtiyacınız vardır . <Namespace>.PropertiesBunun yerine kullanın .
Yousha Aleayoub

132

ResourceManagerHarici bir kaynaktan yükleme yapmadığınız sürece gerekli olmamalıdır .
Çoğu şey için, bir proje (DLL, WinForms, her neyse) oluşturduğunuzu varsayalım, sadece proje ad alanını, "Kaynaklar" ı ve kaynak tanımlayıcısını kullanın. Örneğin:

Bir proje ad alanını varsayarsak: UberSoft.WidgetPro

Ve resxiniz şunları içerir:

resx içerik örneği

Sadece kullanabilirsiniz:

Ubersoft.WidgetPro.Properties.Resources.RESPONSE_SEARCH_WILFRED

4
Bu cevap için çok teşekkürler.
Vaishali

1
Teşekkürler, bu bir cevap olarak işaretlenmelidir. Bu sorunun "cevabından" çok daha net ve temiz.
Jeroen Jonkman

Tür veya ad alanı mevcut değil
Paul McCarthy,

53

Bunu dene, benim için çalışıyor .. basit

Kaynak dosya adınızın "TestResource.resx" olduğunu ve anahtarı dinamik olarak geçirmek istediğinizi varsayalım,

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

Ad Alanı Ekle

using System.Resources;

Varsayılanla çelişen kültüre özgü bir çıktı sağlamak istiyorsanız, isteğe bağlı olarak Kültürü de belirtebilirsiniz. örneğin TestResource.ResourceManager.GetString (açıklama, yeni CultureInfo ("en-GB"));
Ian

Şu hatayı alıyorum: 'Kaynaklar', 'GetString' için bir tanım içermiyor.
Lechucico

Yalnızca ResourceManagerHarici bir kaynak yüklemek istediğinizde ihtiyacınız vardır . <Namespace>.PropertiesBunun yerine kullanın .
Yousha Aleayoub

30

.Resx dosyasını açın ve "Erişim Değiştirici" yi Genel olarak ayarlayın.

var <Variable Name> = Properties.Resources.<Resource Name>

3
Bu yöntem birden çok kaynak dosyasıyla (diller) çalışıyor mu, baktığım her yerde ResourceManager Yöntemini kullanıyorlar ve bu şekilde kullanma riskine
girip girmememi

2
Çalışmıyor. Kaynak
dosyam

27

.Resx dosyasının proje özellikleri altında Visual Studio kullanılarak eklendiğini varsayarsak, dizeye erişmenin daha kolay ve daha az hataya açık bir yolu vardır.

  1. Çözüm Gezgini'nde .resx dosyasını genişletmek bir .Designer.cs dosyası göstermelidir.
  2. .Designer.cs dosyası açıldığında, bir Özellikler ad alanına ve bir dahili sınıfa sahiptir. Bu örnek için sınıfın Kaynaklar olarak adlandırıldığını varsayalım.
  3. Dizeye erişmek şu kadar kolaydır:

    var resourceManager = JoshCodes.Core.Testing.Unit.Properties.Resources.ResourceManager;
    var exampleXmlString = resourceManager.GetString("exampleXml");
  4. Değiştir JoshCodes.Core.Testing.Unitprojenin varsayılan ad ile.

  5. "ExampleXml" yi dize kaynağınızın adıyla değiştirin.

3
Çok yararlı. Teşekkürler.
ejmin

16

@JeffH cevabının ardından, typeof()dize derleme adı kullanılmasını tavsiye ederim .

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

10

Herhangi bir nedenle kaynak dosyalarınızı App_GlobalResources içine koyamıyorsanız, kaynak dosyalarını doğrudan ResXResourceReader veya XML Reader kullanarak açabilirsiniz.

ResXResourceReader'ı kullanmak için örnek kod:

   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 "";
   }

Teşekkürler, System.Windows.Formskullanmak için bir referans eklemeniz gerektiğini unutmayın System.Resources.ResXResourceReader. Ayrıca, var enumerator = rsxr.OfType<DictionaryEntry>();bunun yerine LINQ yapabilir ve kullanabilirsiniz.
Dunc

Bir resx dosyasının nasıl "okunacağı, ayrıştırılacağı ve yükleneceği" hakkında makaleler veya gönderiler bulmak çok zordur. Elde ettiğiniz tek şey "resx'i projenizin dizeleri için kapsayıcı olarak kullanmaktır". Bu cevap için teşekkürler!
Simone

9

Çözüme / derlemeye bir kaynak (Ad: KaynakAdı ve Değer: KaynakDeğeri) ekledikten sonra, gerekli kaynağı almak için yalnızca "Özellikler.Kaynakları.KaynakAdı" kullanabilirsiniz.


7

.Resx dosyasını Visual Studio üzerinden ekledim. Bu designer.cs, istediğim herhangi bir anahtarın değerini hemen döndürmek için özelliklere sahip bir dosya oluşturdu . Örneğin, bu, tasarımcı dosyasından otomatik olarak oluşturulmuş bir koddur.

/// <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);
    }
}

Bu şekilde basitçe şunları yapabildim:

string message = Errors.MyErrorMessage;

Nerede Errorsolduğunu Errors.resxVisual Studio ile oluşturulan dosya ve MyErrorMessageanahtarıdır.


Evet, bunu bugün VS2015 yaptım. Sağ tıklayın, "Kaynaklar" dosyası ekleyin ve tüm anahtarlar "noktalı" hale gelir. Dolayısıyla, "Script" anahtarına sahip "MyResx.resx" 'e scriptValue = MyResx.Script gibi erişilebilir;
emery.noel

5

Kaynak dosyamı doğrudan projeme ekledim ve böylece resx dosya adıyla gayet iyi içindeki dizelere erişebildim.

Örnek: Resource1.resx'te, "resourceKey" anahtarı -> "dataString" dizesi. "DataString" dizesini almak için sadece Resource1.resourceKey'i koydum.

Bunu yapmamak için bilmediğim sebepler olabilir ama benim için işe yaradı.


3

Bunu yapmanın en kolay yolu şudur:

  1. Bir App_GlobalResources sistem klasörü oluşturun ve buna bir kaynak dosyası ekleyin, örneğin Mesajlar.resx
  2. Girişlerinizi kaynak dosyada oluşturun, örn. ErrorMsg = Bu bir hatadır.
  3. Ardından bu girişe erişmek için: string errormsg = Resources.Messages.ErrorMsg

2

Kaynak dosyasından değer elde etmenin en basit yolu. Projeye Kaynak dosyası ekleyin. Şimdi, benim durumumdaki gibi eklemek istediğiniz dizeyi alın metin bloğu (SilverLight). Ayrıca herhangi bir ad alanı eklemeye gerek yok. Benim durumumda iyi çalışıyor

txtStatus.Text = Constants.RefractionUpdateMessage;

Sabitler, projedeki kaynak dosyamın adıdır.İşte kaynak dosyam nasıl görünüyor


0

Kaynakları almak için bir kaynak yöneticisi oluşturun.

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

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

param1 = "AssemblyName.ResourceFolderName.ResourceFileName"

param2 = kaynak dosyasından alınacak dizenin adı


0

Bu benim için çalışıyor. Dize tamam olan bir strings.resx dosyanız olduğunu varsayalım. okumak için

String varOk = My.Resources.strings.ok
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.