2014-09-28 2 views
1

내 프로그램에서 작동하는 언어 전환이 있습니다. 표준 리소스 파일과 지원하는 각 언어에 대해 하나의 추가 복사본을 사용합니다. 컨트롤과 코드의 문자열 모두 잘 동작합니다.직접 대체 리소스 파일에 액세스

그러나 한 가지 특수한 경우에 현재 어떤 언어가 선택 되더라도 영어 리소스 파일에 직접 액세스하고 싶습니다.

왜냐하면 팝업 메뉴의 경우 이름이 지정된 색상을 독일어로 번역 할 수 있기 때문에 Color.FromName 방법에 영어 이외의 이름을 사용할 수 없기 때문입니다. 그래서 번역 된 이름을 표시하지만 여전히 메서드 호출에 영어 이름을 사용하고 싶습니다. 없이 것을 할 수있는 (단순) 방식

이 있는가 ..

DrawCtl_strings.en.mnRed; 

하지만 컴파일되지 않습니다 :

내 리소스 파일은 내가 노력

DrawCtl_strings.resx 
DrawCtl_strings.en.resx 
DrawCtl_strings.de.resx 

라고 실제로 언어를 전환 하시겠습니까?

나는 this 게시물을 보았지만 더 단순하고 직접적인 방법이있을 수 있는지 궁금합니다.

답변

0

주위를 둘러보고 난 후에 ResourceManager을 사용하여 주변을 둘러 볼 수 있을지 의심 스럽습니다.

그래서이 두 사전, 하나 항상 영어, 기타를 만드는, 나를 위해 작동 CurrentUICulture :

foreach (var resEn in englishResDict.Keys) 
    if (resEn.StartsWith("col_")) 
     ColorDict.Add(englishResDict[resEn], currentResDict[resEn]); 

: 다음 내 컬러 사전 (Dictionary<string, string> ColorDict)을 만들 그들을 결합

ResourceManager rm = new ResourceManager("Knips.DrawCtl_strings", 
          typeof(Knips.DrawCtl_strings).Assembly); 

CultureInfo culture = CultureInfo.CreateSpecificCulture("en"); 
ResourceSet resourceSet = rm.GetResourceSet(culture, true, true); 

var englishResDict = resourceSet.Cast<DictionaryEntry>() 
    .ToDictionary(r => r.Key.ToString(), r => r.Value.ToString()); 

resourceSet = rm.GetResourceSet(Thread.CurrentThread.CurrentUICulture, true, true); 

var currentResDict = resourceSet.Cast<DictionaryEntry>() 
    .ToDictionary(r => r.Key.ToString(), r => r.Value.ToString()); 

나는 여전히 명명 규칙에 의지하고 있지만 적어도 제어 할 수있는 것은 .. (물론 값의 유일성을 보장하는 것은 나에게 달려있다.)

한숨, 나는 그것을 올바르게 얻기를 바랐다 몇 줄의 코드를 제외하고 ..