#region using System.ComponentModel; using System.Linq; using System.Reflection; using System.Windows.Forms; using CSFrameworkV5.Core; #endregion namespace CSFrameworkV5.Language { public class LanTool { //不设置语言的组件(.NET组件) private const string WITHOUT_CONTROLS_NET = "TextBox,PictureBox,ImageList,ContextMenuStrip,MenuStrip,"; //不设置语言的组件(Dev组件) private const string WITHOUT_CONTROLS_DEV = "TextEdit,DateEdit,PictureEdit,ComboBoxEdit,LookUpEdit,ImageListBoxControl,GridControl,PanelControl,GroupControl,TableLayoutPanel,SplitterControl,TreeList,BarDockControl,DockPanel,XtraTabControl,TreeView,"; /// /// 获取控件或组件的显示文本,如:.Text,.Caption属性的值 /// /// /// private static string GetControlText(object ctrl) { var type = ctrl.GetType(); var pinfo = type.GetProperties(BindingFlags.Instance | BindingFlags.Public); foreach (var info in pinfo) if (info.Name.ToUpper() == "TEXT" || info.Name.ToUpper() == "CAPTION") { var o = info.GetValue(ctrl, null); return o == null ? "" : o.ToStringEx(); } return string.Empty; } /// /// 判断控件是否可以设置多语言 /// /// /// private static bool IsLanguageControl(object ctrl) { if ((ctrl != null && ctrl is Control) || ctrl is Component) { var type = ctrl.GetType(); var pinfo = type.GetProperties(BindingFlags.Instance | BindingFlags.Public); foreach (var info in pinfo) if (info.Name.ToUpper() == "TEXT" || info.Name.ToUpper() == "CAPTION") return true; } return false; } /// /// 判断当前组件是否需要设置语言 /// /// /// private static bool IsWithoutControl(object ctrl) { if (ctrl == null) return false; var name = ctrl.GetType().FullName.ToLower() + "."; var withouts = (WITHOUT_CONTROLS_NET + "," + WITHOUT_CONTROLS_DEV + ",") .ToLower(); var exists = withouts.Split(',') .Where(e => name.IndexOf("." + e + ".") >= 0).FirstOrDefault(); return !string.IsNullOrWhiteSpace(exists); } /// /// 设置控件或组件的显示文本,如:.Text,.Caption属性的值 /// /// /// private static bool SetControlText(object ctrl, string text) { var type = ctrl.GetType(); var pinfo = type.GetProperties(BindingFlags.Instance | BindingFlags.Public); foreach (var info in pinfo) if (info.Name.ToUpper() == "TEXT" || info.Name.ToUpper() == "CAPTION") { //若设置值报错,请添加此控件类型到常量定义:WITHOUT_CONTROLS_DEV,WITHOUT_CONTROLS_NET info.SetValue(ctrl, text, null); return true; } return false; } /// /// 设置窗体的语言,枚举窗体的成员,字段设置语言 /// /// public static void SetLanguage(Form form) { var mType = form.GetType(); var fields = mType.GetFields( BindingFlags.Instance | /*为了获取返回值,必须指定 BindingFlags.Instance*/ BindingFlags.DeclaredOnly | BindingFlags.NonPublic | /*获取窗体上拖放的控件Private*/ BindingFlags.Public | BindingFlags.CreateInstance); string lan; string id; string defaultText; object ctrl; for (var i = 0; i < fields.Length; i++) { ctrl = fields[i].GetValue(form); //根据类型取组件对象 if (ctrl == null) continue; //仅自动处理控件、组件的多语言 if (IsLanguageControl(ctrl) == false) continue; if (IsWithoutControl(ctrl)) continue; //注意:窗体中组件的语言标识必须是【窗体的命名空间】+【组件名称】 id = mType.FullName + "." + fields[i].Name; defaultText = GetControlText(ctrl); //获取控件或组件的显示文本 lan = LanLib.Get(LanLib.Current, id, defaultText); //获取语言库资料 //设置语言 if (lan != defaultText && !string.IsNullOrWhiteSpace(lan)) SetControlText(ctrl, lan); } } } }