首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# Windows Forms 多語言實作完整指南

     編輯:關於C語言

架構概覽:以 XML 組態驅動動態語言切換

本文示範在 Windows Forms 應用程式中,透過三層 XML 檔案實現多語言支援:

  1. LanguageDefine.xml:儲存預設語言代碼(如 ZH、EN)。
  2. AppConfig.xml:定義可用語言清單,以及下拉選單在各語言下的顯示文字。
  3. AppResource_{lang}.xml:各語言專屬的資源檔,對應每個表單控制項的 Name 與 Text 屬性值。

核心步驟與程式碼實作

1. 讀寫預設語言

public static string ReadDefaultLanguage()
{
    var doc = new XmlDocument();
    doc.Load("resources/LanguageDefine.xml");
    var node = doc.SelectSingleNode("Language/DefaultLanguage");
    return node?.InnerText ?? "EN";
}

public static void WriteDefaultLanguage(string lang)
{
    var ds = new DataSet();
    ds.ReadXml("resources/LanguageDefine.xml");
    ds.Tables["Language"].Rows[0]["DefaultLanguage"] = lang;
    ds.WriteXml("resources/LanguageDefine.xml");
}

2. 取得語言選單顯示文字

public static IList GetLanguageList(string lang)
{
    var result = new ArrayList();
    var doc = new XmlDocument();
    doc.Load("resources/AppConfig.xml");
    var nodes = doc.SelectNodes($"Area[Language='{lang}']/List/Item");
    foreach (XmlNode node in nodes) result.Add(node.InnerText);
    return result;
}

3. 載入表單專屬資源

資源檔結構範例(AppResource_EN.xml):

<Resource>
  <Form Name="FrmLogon">
    <Controls>
      <Control name="frmlogon" text="User logon" />
      <Control name="lblusername" text="Username:" />
      ...
    </Controls>
  </Form>
</Resource>

讀取方法:

public static Hashtable ReadResource(string frmName, string lang)
{
    var table = new Hashtable();
    var path = $"resources/AppResource_{lang}.xml";
    if (!File.Exists(path)) path = "resources/AppResource.xml";

    var doc = new XmlDocument();
    doc.Load(path);
    var nodes = doc.SelectNodes($"Form[@Name='{frmName}']/Controls/Control");
    foreach (XmlNode node in nodes)
    {
        var nameAttr = node.Attributes["name"];
        var textAttr = node.Attributes["text"];
        if (nameAttr != null) table[nameAttr.Value.ToLower()] = textAttr?.Value ?? "";
    }
    return table;
}

4. 表單 Load 事件套用語言

public static void ApplyLanguage(Form form)
{
    var lang = Global.GetValue("lang").ToString(); // 假設全域變數管理
    var resources = AppConfig.ReadResource(form.Name, lang);
    ApplyToControls(form.Controls, resources);
    if (resources.Contains(form.Name.ToLower()))
        form.Text = resources[form.Name.ToLower()].ToString();
}

private static void ApplyToControls(Control.ControlCollection controls, Hashtable resources)
{
    foreach (Control ctrl in controls)
    {
        if (ctrl is Panel || ctrl is GroupBox)
            ApplyToControls(ctrl.Controls, resources); // 遞迴處理容器控制項

        if (resources.Contains(ctrl.Name.ToLower()))
            ctrl.Text = resources[ctrl.Name.ToLower()].ToString();
    }
}

在表單的 Load 事件中呼叫 ApplyLanguage(this) 即可完成動態語言切換。切換語言時,更新 LanguageDefine.xml 並重新載入表單(或呼叫 ApplyLanguage)即可見效。

擴充性說明

  • 新增語言:只需在 AppConfig.xml 新增 Area 節點,並提供對應的 AppResource_{lang}.xml。
  • 資源檔採用 Hashtable 查找,效能足夠應付一般表單控制項數量。
  • 可進一步封裝為元件,支援設計時期預覽。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved