2011-10-04 4 views
0

Windows Forms 응용 프로그램 프로젝트가 있으며 기본 폼에는 메뉴 모음이 있습니다. 이 메뉴 스트립의 일부 장소에서 다양한 언어를 선택할 수 있습니다. 예를 들어 사용자가 "영어"를 선택하면이 기본 양식 (및 향후 다른 언어)의 모든 내용이 영어로 바뀌어야합니다. 전환 언어 (cultureinfo/globalization)는 ToolStripMenuItems에 영향을주지 않습니다.

나는이 튜토리얼에 나섭니다 : click

이 라벨 등으로 잘 작동을하지만, 모든 도구 스트립 메뉴 항목이 작동하지 않습니다. 그들은 단지 기본 텍스트를 유지합니다.

private void ChangeLanguage(string lang) 
{ 
    foreach (Control c in this.Controls) 
    { 
     ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1)); 
     resources.ApplyResources(c, c.Name, new CultureInfo(lang)); 
     ComponentResourceManager res2 = new ComponentResourceManager(typeof(ToolStripMenuItem)); 
     res2.ApplyResources(c, c.Name, new CultureInfo(lang)); 
    } 
} 

을하지만 실패하고 말한다 :

은 내가 ChangeLanguage 방법이 개 더 라인을 추가하려고

지정된 문화 또는 중립 문화권에 적합한 리소스를 찾을 수 없습니다. 컴파일시 "System.Windows.Forms.ToolStripMenuItem.resources"가 올바르게 임베드되거나 어셈블리 "System.Windows.Forms"에 링크되었는지 또는 필요한 모든 위성 어셈블리가로드 가능하고 완전히 서명되었는지 확인하십시오.

진행 방법 - 확실한 도움을 주셨습니다.

답변

2

foreach 루프의 마지막 두 줄을 제거해야합니다. 그 줄은 System.Windows.Forms.ToolStripMenuItem.resx 파일에서 지역화 정보를 찾고 있지만 Forms 리소스 파일을보고 싶다고 말합니다.

ToolstripMenuItems는 ToolStripItems DropDownItems 컬렉션에 추가되며 폼의 Controls 컬렉션에는 추가되지 않습니다. 이렇게하면 문제를 해결하는 데 도움이 될 수 있습니다.

private void ChangeLanguage(string lang) { 
    ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1)); 
    foreach (Control c in this.Controls) { 
     resources.ApplyResources(c, c.Name, new CultureInfo(lang)); 
    } 

    foreach (ToolStripItem item in toolStrip1.Items) { 
     if (item is ToolStripDropDownItem) 
      foreach (ToolStripItem dropDownItem in ((ToolStripDropDownItem)item).DropDownItems) { 
       resources.ApplyResources(dropDownItem, dropDownItem.Name, new CultureInfo(lang)); 
      } 
    } 
} 

추가 드롭 다운 항목이있는 경우 재귀 적 접근 방식을 고려해야합니다.

편집 : 내 첫 코멘트

private void ChangeLanguage(string lang) { 
    ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1)); 
    foreach (Control c in this.Controls) { 
     resources.ApplyResources(c, c.Name, new CultureInfo(lang)); 
    } 

ChangeLanguage (toolStrip1.Items)으로; }

private void ChangeLanguage(ToolStripItemCollection collection) { 
    foreach (ToolStripItem item in collection) { 
     resources.ApplyResources(item, item.Name, new CultureInfo(lang)); 
     if (item is ToolStripDropDownItem) 
      ChangeLanguage(((ToolStripDropDownItem)item).DropDownItems); 
    } 
} 
+0

감사합니다. 일부는 작동합니다. 이것은 메뉴 스트립의 "머리글"이 아닌 메뉴 스트립의 드롭 다운 항목의 언어 만 변경하거나 첫 번째 드롭 다운 메뉴 안에 드롭 다운 메뉴가 추가로있는 경우에만 변경됩니다. – eightx2

+0

이것이 제가 말한 것입니다 [재귀 적 접근] (http://www.dotnetperls.com/recursion)이 될 것입니다. 두 번째 foreach 루프 대신 내 편집에서 메서드를 호출하십시오. 그러면 이제 메뉴 구조의 모든 레이어가 지역화를 위해 반복됩니다. – dwonisch

+0

고마워, 나는 그 코드가 나를 위해 잘 작동하도록 사용했다. – eightx2

관련 문제