2012-09-20 2 views
0

asp.net 응용 프로그램에서 리소스를 사용 중이며 클라이언트에서 키/값 쌍을 사용할 수 있도록해야합니다. HttpHandler를 사용하여 리소스 파일을 가져올 수 있었지만 표준 상속이 내가 사용중인 코드와 작동하지 않습니다.C# Resource (resx) 상속


자료 PM.resx 파일은 다음

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

PM.pt.resx 파일은 다음

key: a value: ptptpt 

를 포함 포함

브라우저에 pt의 culture가 있거나 코드화 된 경우 pt 파일에는 단일 항목 만 있고 기본 파일에는 나머지 키/값 쌍이 포함되어 있으므로 다음과 같이 반환 될 것으로 예상됩니다.

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

그러나 나는 다음을 얻고 있습니다.

key: a value: ptptpt 

나는 다음과 같이 자바 스크립트가 생성하는 데 사용하고 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); 
    } 

참고 : 여기서 키와 값 쌍을 이스케이프 처리하지 않았 음을 설명했습니다. 이것은 내가 코드에서 후속 조치를 취해야 할 사항입니다.

다른 사람이 도움이되기를 바랍니다.