簡體   English   中英

在C#Winform中在運行時更改語言

[英]Change language at runtime in 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));
        }
    }

有什么建議么?

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

構造函數的參數是錯誤的,您要告訴它查找System.Type的資源。 這就是為什么它抱怨找不到“ System.Type.resources”。 它永遠找不到。

您需要傳遞實際要本地化的表單的類型。 請改用this.GetType() 盡管這可能只是將“選項”表單而不是應用程序中其余窗口本地化。 您可以代替Application.OpenForms()。 還必須將本地化應用於所有控件。 不僅是表單上的內容,還有位於面板之類的容器中的內容。 從而:

    private static void ChangeLanguage(string lang) {
        Thread.CurrentThread.CurrentUICulture = new CultureInfo(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的功能。 在使用您的程序時,實際上沒有人更改其母語。

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);
}

不過,您需要為所有語言提供適當的資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM