2014-01-11 66 views
2

我想更改語言,但編譯時會彈出一個異常。它說在C#winform運行時更改語言

「找不到適合指定區域性或 中性文化的任何資源。確保‘System.Type.resources’正確 嵌入或鏈接到程序集‘在編譯時mscorlib程序’,或 所需的所有衛星組件都可加載並完全簽名。「

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (comboBox1.SelectedItem.ToString() == "English") 
     { 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo("En"); 
      ChangeLanguage("En"); 
     } 
     else if (comboBox1.SelectedItem.ToString() == "German") 
     { 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo("De"); 
      ChangeLanguage("De"); 
     } 
    } 


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

有什麼建議?

+0

在comboBox1_SelectedIndexChanged中放入Console.Writeline(comboBox1.SelectedItem.ToString());所以你可以看到錯誤 – Tinwor

+0

男人這是要解決什麼...... – franzp

+0

我知道,但我想知道,如果在窗體中調用comboBox1_SelectedIndexChanged – Tinwor

回答

6
ComponentResourceManager resources = new ComponentResourceManager(typeof(Type)); 

構造函數的參數是錯誤的,你告訴它找到System.Type的資源。這就是爲什麼它抱怨它找不到「System.Type.resources」。它永遠不會找到那些。

您需要傳遞您實際想要本地化的表單的類型。改爲使用this.GetType()。雖然這可能只是本地化您的選項窗體,而不是您的應用程序中的其他窗口。你可以迭代Application.OpenForms()。還有必要將本地化應用於所有控件。不只是表單上的那些,也是位於容器內部的面板之類的。因此:

private static void ChangeLanguage(string lang) { 
     foreach (Form frm in Application.OpenForms) { 
      localizeForm(frm); 
     } 
    } 

    private static void localizeForm(Form frm) { 
     var manager = new ComponentResourceManager(frm.GetType()); 
     manager.ApplyResources(frm, "$this"); 
     applyResources(manager, frm.Controls); 
    } 

    private static void applyResources(ComponentResourceManager manager, Control.ControlCollection ctls) { 
     foreach (Control ctl in ctls) { 
      manager.ApplyResources(ctl, ctl.Name); 
      applyResources(manager, ctl.Controls); 
     } 
    } 

小心使用這種wiz-bang功能。在他們使用您的程序時,實際上沒有人改變他們的母語。

+0

非常感謝!它的工作。如果我可能問你,最好的方法是改變語言。 – franzp

+0

如果它在工作,那麼我給你最可取的方法。如果不是,那麼我會假裝我不知道是誰寫的這段代碼,並說你最好假設用戶的默認文化已經與他的語言相匹配了。開玩笑,我不能保證它可以在任何地方工作在世界上。它應該,沒有那樣測試。有一天,我會弄清楚中立文化是如何運作的,那一天還沒有結束。 –

2
private void ChangeLanguage(CultureInfo culture) 
{ 
     Application.CurrentCulture = culture; 
     CultureInfo.DefaultThreadCurrentCulture = culture; 
     CultureInfo.DefaultThreadCurrentUICulture = culture; 

     Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture.Name); 
     Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(culture.Name); 
} 

您需要爲所有語言提供適當的資源。

+0

怎麼做我做到了嗎? – franzp

+0

怎麼做? – Mayank

+0

我得到了德文版的resx文件,英文版默認是usid。對不起,新手我沒有得到這個文化課很多。只是想知道爲什麼我的代碼不工作... – franzp