本文示範在 Windows Forms 應用程式中,透過三層 XML 檔案實現多語言支援:
ZH、EN)。Name 與 Text 屬性值。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");
}
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;
}
資源檔結構範例(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;
}
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 查找,效能足夠應付一般表單控制項數量。