2012-09-20 146 views
0

我正在使用我的asp.net應用程序上的資源,並且需要使客戶端上的鍵/值對可用。通過使用HttpHandler,我已經能夠通過特定的資源文件獲得它們,但是標準繼承不能與我正在使用的代碼一起工作。c#資源(resx)繼承


基地PM.resx文件包含以下

key: a value: AAAAAA 
key: b value: BBBBBB 
key: c value: CCCCCC 

PM.pt.resx文件包含以下

key: a value: ptptpt 

當我在我的瀏覽器中使用pt的文化或編碼時,由於pt文件只有一個條目,並且基本文件包含其餘的鍵/值對,因此我期望返回以下內容。

key: a value: ptptpt 
key: b value: BBBBBB 
key: c value: CCCCCC 

但我只是得到以下。

key: a value: ptptpt 

,我使用生成的JavaScript如下:C#代碼。

public void ProcessRequest(HttpContext context) 
    { 
     ResourceManager rm = new ResourceManager("Resources.PM", System.Reflection.Assembly.Load("App_GlobalResources")); 
     Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-BR");//for testing culture change 
     //ResourceSet resourceSet = rm.GetResourceSet(CultureInfo.CurrentUICulture, true, true); 
     ResourceSet resourceSet = rm.GetResourceSet(Thread.CurrentThread.CurrentCulture, true, true); 

     string r = string.Empty; 

     if (resourceSet != null) 
     { 
      foreach (DictionaryEntry entry in resourceSet) 
      { 
       string resourceKey = entry.Key.ToString(); 
       object resource = entry.Value.ToString(); 
       r += "\"" + entry.Key.ToString() + "\": \"" + entry.Value.ToString() + "\", "; 
      } 
     } 

     r = "var q = {" + r + " culture: \"" + Thread.CurrentThread.CurrentCulture.ToString() + "\"};"; 
     r += "console.log(q);$.each(q, function(k, v){console.log(k + \": \" + v)});"; 
     context.Response.Write(r); 
    } 

我該如何讓繼承在代碼中工作?

回答

0

我已經想出了我的問題的解決方案。我創建了兩個ResourceSets;一個用於默認語言(用於默認資源),另一個用於當前語言(用於語言特定資源)。然後,我創建了一個字符串dictionary,並首先添加了特定於語言的鍵/值對,然後添加了默認的鍵/值對。如果已經存在特定於語言的鍵,則不會添加默認語言鍵。

public void ProcessRequest(HttpContext context) 
    { 
     string responseString = string.Empty; 
     CultureInfo currentCulture = CultureInfo.CurrentUICulture; 

     ResourceManager rm = new ResourceManager("Resources.PM", System.Reflection.Assembly.Load("App_GlobalResources")); 

     CultureInfo defaultCulture = new CultureInfo("en-US"); 

     ResourceSet currentRS = rm.GetResourceSet(currentCulture, true, true); 
     ResourceSet defaultRS = null; 

     if (defaultCulture != currentCulture) 
     { 
      defaultRS = rm.GetResourceSet(defaultCulture, true, true); 
     } 

     Dictionary<string, string> translations = new Dictionary<string, string>(); 

     if (currentRS != null) 
     { 
      foreach (DictionaryEntry entry in currentRS) 
      { 
       try { 
        translations.Add(entry.Key.ToString(), entry.Value.ToString()); 
       } 
       catch (Exception e) { } 
      } 
     } 

     if (defaultRS != null) 
     { 
      foreach (DictionaryEntry entry in defaultRS) 
      { 
       try { 
        translations.Add(entry.Key.ToString(), entry.Value.ToString()); 
       } 
       catch (Exception e){} 
      } 
     } 

     foreach (KeyValuePair<String, String> entry in translations) 
     { 
      responseString += "\"" + entry.Key.ToString() + "\": \"" + entry.Value.ToString() + "\", "; 
     } 

     responseString = "var translations = {" + responseString + " culture: \"" + currentCulture.ToString() + "\"};"; 
     context.Response.Write(responseString); 

     Compress(context); 
     //SetHeadersAndCache(absolutePath, context); 
    } 

注:我沒有說明在這裏轉義我的鍵和值對。這是我必須在我的代碼中進行跟進的內容。

我希望這可以幫助其他人下線!