Winform窗體改變語言類型的方式

  Winform改變語言類型比較複雜,須要根據不一樣語言應用語言資源。而軟件在進行語言切換時,須要將當前的UI文化線程引用對應的語言類型。經常使用的有三種方式,此處使用兩種,對比發現其中的優缺點:this

/// <summary>
/// 獲取UI的文化信息
/// 建立者:楊釗
/// 建立時間:2019.05.20
/// </summary>
/// <param name="language">語言</param>
/// <returns>語言環境的縮寫。如:英文的en-US;中文的:zh-CN</returns>
public static string GetUICulture(LanguageType language)
{
    string lang = "en-US";
    if (language == LanguageType.Chinese)
    {
        lang = "zh-CN";
    }
    else if (language == LanguageType.English)
    {
        lang = "en-US";
    }
    return lang;
}
/// <summary>
/// 設置語言
/// </summary>
/// <param name="control">須要切換語言的對象</param>
/// <param name="language">語言</param>
/// <returns>語言環境的縮寫。如:英文的en-US;中文的:zh-CN</returns>
public static  string SetLanguage( this Control control, LanguageType language)
{
    string lang = GetUICulture(language);
    //採用這種方式,會出現若是經過本身寫代碼添加的控件事件(即事件的添加不在InitializeComponent方法中),則須要重寫添加一次。
    //全部選中等設置須要重寫設置一次。不適用於建立好、只等調用的窗體
    //應用語言資源
    //Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
    ////清理控件已應用的語言資源
    //form.Controls.Clear();
    ////從新初始化界面
    //Type type = form.GetType();
    ////MethodInfo[] methodInfos = type.GetMethods( BindingFlags.NonPublic);
    //MethodInfo method = type.GetMethod("InitializeComponent", BindingFlags.NonPublic | BindingFlags.Instance);
    //if (method != null)
    //{
    //    method.Invoke(form, null);
    //}

    //如下方法會有問題,在具備dataGridView控件的窗體中,若是先實例化後,再應用它,不會被應用新資源。然後發現,DataGridView控件的表頭,並非繼承自Control
    // 而且,若是有同名控件,應用會出錯。好比:組合控件內有一個子控件是lblTitle,但窗體也有一個控件是lblTitle,應用資源就會出錯
    if (FormManager.language != language)
    {
        Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
        FormManager.language = language;
    }
    if (control != null)
    {
        var frmtype = control.GetType();
        ComponentResourceManager resources = new ComponentResourceManager(frmtype);
        resources.ApplyResources(control, "$this");
        AppLang(control, resources);
    }
    return lang;
}

/// <summary>
/// 修改:張正選
/// 時間:2017.12.26
/// 緣由:單位顯示偏小,英文下「Cancel」顯示會換行
/// </summary>
/// <param name="control"></param>
/// <param name="resources"></param>
private static void AppLang(Control control, ComponentResourceManager resources)
{
    if (control is Control)
    {
        foreach (Control c in control.Controls)
        {
            resources.ApplyResources(c, c.Name);
            AppLang(c, resources);
            //DataGridView控件的表頭,並非繼承自Control
            if (c is DataGridView)
            {
                DataGridView dgv = c as DataGridView;
                foreach(var item in dgv.Columns)
                {
                    resources.ApplyResources(item, (item as DataGridViewColumn).Name);
                }
            }
        }
    }
}
相關文章
相關標籤/搜索