啊鑫
2024-07-11 afbf8700d137710713db61955879d0f5acb73738
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#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,";
 
        /// <summary>
        ///     获取控件或组件的显示文本,如:.Text,.Caption属性的值
        /// </summary>
        /// <param name="ctrl"></param>
        /// <returns></returns>
        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;
        }
 
        /// <summary>
        ///     判断控件是否可以设置多语言
        /// </summary>
        /// <param name="ctrl"></param>
        /// <returns></returns>
        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;
        }
 
        /// <summary>
        ///     判断当前组件是否需要设置语言
        /// </summary>
        /// <param name="ctrl"></param>
        /// <returns></returns>
        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);
        }
 
        /// <summary>
        ///     设置控件或组件的显示文本,如:.Text,.Caption属性的值
        /// </summary>
        /// <param name="ctrl"></param>
        /// <returns></returns>
        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;
        }
 
        /// <summary>
        ///     设置窗体的语言,枚举窗体的成员,字段设置语言
        /// </summary>
        /// <param name="form"></param>
        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);
            }
        }
    }
}