C#实现多语言切换详细教程(附源码) 您所在的位置:网站首页 飞书怎么切换语言 C#实现多语言切换详细教程(附源码)

C#实现多语言切换详细教程(附源码)

2024-06-18 04:19| 来源: 网络整理| 查看: 265

源代码下载地址: CSDN:点击下载 GitHub:点击下载

环境说明:Windows10,VS2017,.NET Framework4.0

详细步骤:

1.新建一个C#的.NET Framework项目,我这里取名为MultiLanguage。 在这里插入图片描述

2.在项目的解决方案资源管理器处,右键项目名称,依次选择添加、新建项。 在这里插入图片描述

3.在弹出的窗口中新建一个类,取名为LanguageMgr.cs. 在这里插入图片描述

向LanguageMgr.cs里面添加如下代码

using System; using System.Collections.Generic; using System.IO; using System.Windows.Forms; using System.Xml; namespace MultiLanguage { public class LanguageItem { private const string RootNodeName = "language"; private const string StringsNodeName = "strings"; private const string FormsNodeName = "forms"; private XmlNode stringsNode; private XmlNode formsNode; private string id; private string name; private string localeName; public LanguageItem(string fileName)//构造函数 { var xmlDoc = new XmlDocument(); xmlDoc.Load(fileName); var root = xmlDoc.DocumentElement; if (root != null) { this.id = GetAttributeValue(root, "Id"); this.name = GetAttributeValue(root, "Name"); this.localeName = GetAttributeValue(root, "LocaleName"); this.stringsNode = root.SelectSingleNode(StringsNodeName); this.formsNode = root.SelectSingleNode(FormsNodeName); } } public string Id//只读变量 { get { return this.id; } } public string Name//只读变量 { get { return this.name; } } public string LocaleName//只读变量 { get { return this.localeName; } } private void ApplyLanguage(Control control, XmlNode formNode, ToolTip toolTip = null) { var ctrlNode = formNode.SelectSingleNode(control.Name); if (ctrlNode != null) { control.Text = GetAttributeValue(ctrlNode, "Text"); string tips = GetAttributeValue(ctrlNode, "ToolTip"); if (!string.IsNullOrEmpty(tips) && toolTip != null) toolTip.SetToolTip(control, tips); } foreach (Control ctrl in control.Controls) ApplyLanguage(ctrl, formNode, toolTip); //菜单项,特别遍历 if (control is ToolStrip) { foreach (ToolStripItem toolItem in (control as ToolStrip).Items) ApplyLanguage(toolItem, formNode); } } private void ApplyLanguage(ToolStripItem menuItem, XmlNode formNode) { if (string.IsNullOrEmpty(menuItem.Name)) return; var itemNode = formNode.SelectSingleNode(menuItem.Name); if (itemNode != null) { menuItem.Text = GetAttributeValue(itemNode, "Text"); menuItem.ToolTipText = GetAttributeValue(itemNode, "ToolTip"); } if (menuItem is ToolStripDropDownItem) { foreach (ToolStripItem item in (menuItem as ToolStripDropDownItem).DropDownItems) ApplyLanguage(item, formNode); } } public bool LoadFormLanguage(Form form) { if (form == null || formsNode == null || !formsNode.HasChildNodes || formsNode.SelectSingleNode(form.Name) == null) return false; //创建ToolTip控件, 以支持ToolTip显示 var toolTip = new ToolTip(); var formNode = formsNode.SelectSingleNode(form.Name); form.Text = GetAttributeValue(formNode, "Text"); foreach (Control ctrl in form.Controls) ApplyLanguage(ctrl, formNode, toolTip); return true; } private string GetAttributeValue(XmlNode xmlNode, string attrName) { if (xmlNode.Attributes != null && xmlNode.Attributes[attrName] != null) return xmlNode.Attributes[attrName].Value; return string.Empty; } public string GetText(string textID, string defaultText = "") { if (stringsNode == null || !stringsNode.HasChildNodes) return defaultText; foreach (XmlNode node in stringsNode.ChildNodes) if (node.Name.Equals(textID)) return node.InnerText; return defaultText; } } public class LanguageList : List { } //多语言管理器 public static class ML { private static LanguageItem activeLanguage; private static LanguageList languages; //最初调用 public static int LoadLanguages(string searchPattern, string defaultLanguageId = "") { string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Languages"); return LoadLanguages(path, searchPattern, defaultLanguageId); } public static int LoadLanguages(string path, string searchPattern, string defaultLanguageId = "") { languages = new LanguageList(); if (!Directory.Exists(path)) return 0; var files = Directory.GetFiles(path, searchPattern); foreach (string file in files) languages.Add(new LanguageItem(file)); if (!string.IsNullOrEmpty(defaultLanguageId)) LoadLanguageById(defaultLanguageId); return languages.Count; } public static string ActiveLanguageId { get { return (activeLanguage != null) ? activeLanguage.Id : string.Empty; } } public static string[] LanguageLocalNames { get { if (languages == null || languages.Count == 0) return new string[0]; var names = new string[languages.Count]; for (int i = 0; i return activeLanguage; } } public static LanguageList Languages { get { return languages; } } public static bool LoadFormLanguage(Form form) { return (ActiveLanguage != null) ? ActiveLanguage.LoadFormLanguage(form) : false; } public static string GetText(string textId, string defaultText = "") { return (ActiveLanguage != null) ? ActiveLanguage.GetText(textId, defaultText) : defaultText; } public static bool LoadLanguageById(string id) { foreach (var language in Languages) { if (language.Id.Equals(id)) { activeLanguage = language; return true; } } return false; } public static bool LoadLanguageByIndex(int index) { if (index languages.Count - 1) return false; activeLanguage = languages[index]; return true; } } }

4.为了看着方便,把Form1窗体重命名为MainForm。在解决方案资源管理器处右键Form1.cs,即可看到重命名选项。下图是已经重命名之后的效果。 在这里插入图片描述

5.在MainForm窗体中添加MenuStrip控件,增加一项Item,Text属性为“语言”,Name属性为miLanguage。 在这里插入图片描述

6.向MainForm.cs中添加如下代码

using System; using System.Windows.Forms; namespace MultiLanguage { public partial class MainForm : Form { private const string APP_NAME = "记事本"; private const int MAX_PATH = 256; private string appName; //窗体变量 private string[] args = null; private string fileName = string.Empty; private string searchText = string.Empty; public MainForm() { InitializeComponent(); appName = ML.GetText("INF_AppName", APP_NAME); ML.LoadFormLanguage(this); BuildLanguageMenuItems(); } private void BuildLanguageMenuItems() { if (ML.LanguageLocalNames.Length == 0) { miLanguage.Visible = false; return; } for (int i = 0; i foreach (ToolStripMenuItem item in miLanguage.DropDownItems) item.Checked = (item == sender); ML.LoadLanguageByIndex((int)(sender as ToolStripItem).Tag); ML.LoadFormLanguage(this); }); miLanguage.DropDownItems.Add(menuItem); } } private void SetAppText(string text) { this.Text = text + " - " + APP_NAME; }

7.在MainForm中新加一个button,Text属性为“弹窗”,name属性用默认的“button1”就行。 8.新建一个窗体,命名为ChildForm,此窗体主要是用来演示当有多个窗口时,如何实现语言的统一切换。 9.在ChildForm中添加一个label,Text属性修改为“显示简体中文”。 10.为MainForm窗体的button按钮添加点击事件处理函数,用来弹出窗体ChildForm。

private void button1_Click(object sender, EventArgs e) { ChildForm child = new ChildForm(); child.Show(); }

11.在Debug目录下新建文件夹Languages,此文件夹里有两个.lng后缀的文件,分别命名为Chinese和English。往这两个文件中分别添加如下内容。 Chinese.lng

多语言

English.lng

MultiLanguage

12.向Program.cs的Main函数里添加一行代码

ML.LoadLanguages("*.lng", "CHS");

将ChildForm.cs中的代码替换下面的代码

using System.Windows.Forms; namespace MultiLanguage { public partial class ChildForm : Form { public ChildForm() { ML.LoadFormLanguage(this); InitializeComponent(); } } }

13.程序最终运行效果图 在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有