可以在VS设计视图下加载出XML多语言配置文件的多语言控件
闲着没事写点东西,可用于WINFORM适当修改下可用在WEB下的多语言控件,在VS设计视图下可自动加载出xml中所配置的语言节点。
1public class LanguageText : Label, IPropertyGridable
2 {
3 public enum LanguageType
4 {
5 CN=0,
6 EN=1,
7 }
8 XmlDocument doc = new XmlDocument();
9 string nodeValue;
10 string xml;
11 /// <summary>
12 /// XML内容
13 /// </summary>
14 private string XMLString
15 {
16 get
17 {
18 if (Language == LanguageType.CN)
19 {
20 if (CnLanguageXmlFile != null && CnLanguageXmlFile != string.Empty)
21 {
22 doc.Load(CnLanguageXmlFile);
23 }
24 }
25 else
26 {
27 if (EnLanguageXmlFile != null && EnLanguageXmlFile != string.Empty)
28 {
29 doc.Load(EnLanguageXmlFile);
30 }
31 }
32 return doc.InnerXml==string.Empty?xml:doc.InnerXml;
33 }
34 set
35 {
36 xml = value;
37 }
38 }
39 /// <summary>
40 ///
41 /// </summary>
42 [Category("Language")]
43 public string NodeValue
44 {
45 get { return nodeValue; }
46 set { nodeValue = value; Text = value; }
47 }
48 string nodeName = "ProductName";
49 /// <summary>
50 /// XML文件中节点列表,绑定LangugeXMLConverter实现VS属性窗口节点选择
51 /// </summary>
52 [Category("Language"), TypeConverter(typeof(LangugeXMLConverter))]
53 public string NodeName
54 {
55 get { return nodeName; }
56 set { nodeName = value; NodeNameChange(value); }
57 }
58 public LanguageText()
59 {
60 NodeNameChange(NodeName);
61 }
62 public override string Text
63 {
64 get
65 {
66 return NodeValue;
67 }
68 set { base.Text = value; }
69 }
70 /// <summary>
71 /// 改变节点时并改变相应的值
72 /// </summary>
73 /// <param name="name"></param>
74 public void NodeNameChange(string name)
75 {
76 nodeName = name;
77 if (XMLString!=null&&XMLString != string.Empty)
78 {
79 doc.LoadXml(XMLString);
80 if (doc.GetElementsByTagName(NodeName).Count > 0)
81 {
82 NodeValue = doc.GetElementsByTagName(NodeName).Item(0).FirstChild.Value;
83 }
84 }
85 }
86 /// <summary>
87 /// 获取XML中的配置节点
88 /// </summary>
89 /// <returns></returns>
90 public string[] GetNodes()
91 {
92 if (XMLString == null || XMLString == string.Empty)
93 {
94 return new string[]{"加载XML失败"};
95 }
96 doc.LoadXml(XMLString);
97 XmlNodeList nodes = (doc.DocumentElement).ChildNodes;
98 List<string> lst = new List<string>();
99 foreach (XmlNode item in nodes)
100 {
101 lst.Add(item.Name);
102 }
103 return lst.ToArray();
104 }
105
106 string enLanguageXmlFile = "";
107 /// <summary>
108 /// 英文XML配置文件
109 /// </summary>
110 [Category("Language"),EditorAttribute(typeof(OpenFileDialogEditor), typeof(System.Drawing.Design.UITypeEditor))]
111 public string EnLanguageXmlFile
112 {
113 get { return enLanguageXmlFile; }
114 set { enLanguageXmlFile = value; }
115 }
116 string cnLanguageXmlFile = "";
117 /// <summary>
118 /// 中文XML配置文件
119 /// </summary>
120 [Category("Language"),EditorAttribute(typeof(OpenFileDialogEditor), typeof(System.Drawing.Design.UITypeEditor))]
121 public string CnLanguageXmlFile
122 {
123 get { return cnLanguageXmlFile; }
124 set { cnLanguageXmlFile = value; }
125 }
126 LanguageType language;
127 /// <summary>
128 /// 语言类型
129 /// </summary>
130 [Category("Language")]
131 public LanguageType Language
132 {
133 get { return language; }
134 set { language = value; NodeNameChange(NodeName); }
135 }
136
137 }
138 public class OpenFileDialogEditor : System.Drawing.Design.UITypeEditor
139 {
140 public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
141 {
142 OpenFileDialog fileD = new OpenFileDialog();
143 fileD.CheckFileExists = true;
144 fileD.CheckPathExists = true;
145 if (fileD.ShowDialog() == DialogResult.OK)
146 {
147 return fileD.FileName;
148 }
149 return "";
150 }
151 public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
152 {
153 return System.Drawing.Design.UITypeEditorEditStyle.Modal;
154 }
155 }
156 public interface IPropertyGridable
157 {
158 string[] GetNodes();
159 }
160 /// <summary>
161 /// 将XML数据转换成字符串数组。实现VS中属性窗口视图化
162 /// </summary>
163 public class LangugeXMLConverter : TypeConverter
164 {
165 public override bool GetStandardValuesSupported(
166 ITypeDescriptorContext context)
167 {
168 return true;
169 }
170 public override bool GetStandardValuesExclusive(
171 ITypeDescriptorContext context)
172 {
173 return false;
174 }
175 public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
176 {
177 IPropertyGridable instance = (IPropertyGridable)context.Instance;
178 StandardValuesCollection vals = new TypeConverter.StandardValuesCollection(instance.GetNodes());
179 return vals;
180 }
181 public override bool IsValid(ITypeDescriptorContext context, object value)
182 {
183 return false;
184 }
185 }
2 {
3 public enum LanguageType
4 {
5 CN=0,
6 EN=1,
7 }
8 XmlDocument doc = new XmlDocument();
9 string nodeValue;
10 string xml;
11 /// <summary>
12 /// XML内容
13 /// </summary>
14 private string XMLString
15 {
16 get
17 {
18 if (Language == LanguageType.CN)
19 {
20 if (CnLanguageXmlFile != null && CnLanguageXmlFile != string.Empty)
21 {
22 doc.Load(CnLanguageXmlFile);
23 }
24 }
25 else
26 {
27 if (EnLanguageXmlFile != null && EnLanguageXmlFile != string.Empty)
28 {
29 doc.Load(EnLanguageXmlFile);
30 }
31 }
32 return doc.InnerXml==string.Empty?xml:doc.InnerXml;
33 }
34 set
35 {
36 xml = value;
37 }
38 }
39 /// <summary>
40 ///
41 /// </summary>
42 [Category("Language")]
43 public string NodeValue
44 {
45 get { return nodeValue; }
46 set { nodeValue = value; Text = value; }
47 }
48 string nodeName = "ProductName";
49 /// <summary>
50 /// XML文件中节点列表,绑定LangugeXMLConverter实现VS属性窗口节点选择
51 /// </summary>
52 [Category("Language"), TypeConverter(typeof(LangugeXMLConverter))]
53 public string NodeName
54 {
55 get { return nodeName; }
56 set { nodeName = value; NodeNameChange(value); }
57 }
58 public LanguageText()
59 {
60 NodeNameChange(NodeName);
61 }
62 public override string Text
63 {
64 get
65 {
66 return NodeValue;
67 }
68 set { base.Text = value; }
69 }
70 /// <summary>
71 /// 改变节点时并改变相应的值
72 /// </summary>
73 /// <param name="name"></param>
74 public void NodeNameChange(string name)
75 {
76 nodeName = name;
77 if (XMLString!=null&&XMLString != string.Empty)
78 {
79 doc.LoadXml(XMLString);
80 if (doc.GetElementsByTagName(NodeName).Count > 0)
81 {
82 NodeValue = doc.GetElementsByTagName(NodeName).Item(0).FirstChild.Value;
83 }
84 }
85 }
86 /// <summary>
87 /// 获取XML中的配置节点
88 /// </summary>
89 /// <returns></returns>
90 public string[] GetNodes()
91 {
92 if (XMLString == null || XMLString == string.Empty)
93 {
94 return new string[]{"加载XML失败"};
95 }
96 doc.LoadXml(XMLString);
97 XmlNodeList nodes = (doc.DocumentElement).ChildNodes;
98 List<string> lst = new List<string>();
99 foreach (XmlNode item in nodes)
100 {
101 lst.Add(item.Name);
102 }
103 return lst.ToArray();
104 }
105
106 string enLanguageXmlFile = "";
107 /// <summary>
108 /// 英文XML配置文件
109 /// </summary>
110 [Category("Language"),EditorAttribute(typeof(OpenFileDialogEditor), typeof(System.Drawing.Design.UITypeEditor))]
111 public string EnLanguageXmlFile
112 {
113 get { return enLanguageXmlFile; }
114 set { enLanguageXmlFile = value; }
115 }
116 string cnLanguageXmlFile = "";
117 /// <summary>
118 /// 中文XML配置文件
119 /// </summary>
120 [Category("Language"),EditorAttribute(typeof(OpenFileDialogEditor), typeof(System.Drawing.Design.UITypeEditor))]
121 public string CnLanguageXmlFile
122 {
123 get { return cnLanguageXmlFile; }
124 set { cnLanguageXmlFile = value; }
125 }
126 LanguageType language;
127 /// <summary>
128 /// 语言类型
129 /// </summary>
130 [Category("Language")]
131 public LanguageType Language
132 {
133 get { return language; }
134 set { language = value; NodeNameChange(NodeName); }
135 }
136
137 }
138 public class OpenFileDialogEditor : System.Drawing.Design.UITypeEditor
139 {
140 public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
141 {
142 OpenFileDialog fileD = new OpenFileDialog();
143 fileD.CheckFileExists = true;
144 fileD.CheckPathExists = true;
145 if (fileD.ShowDialog() == DialogResult.OK)
146 {
147 return fileD.FileName;
148 }
149 return "";
150 }
151 public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
152 {
153 return System.Drawing.Design.UITypeEditorEditStyle.Modal;
154 }
155 }
156 public interface IPropertyGridable
157 {
158 string[] GetNodes();
159 }
160 /// <summary>
161 /// 将XML数据转换成字符串数组。实现VS中属性窗口视图化
162 /// </summary>
163 public class LangugeXMLConverter : TypeConverter
164 {
165 public override bool GetStandardValuesSupported(
166 ITypeDescriptorContext context)
167 {
168 return true;
169 }
170 public override bool GetStandardValuesExclusive(
171 ITypeDescriptorContext context)
172 {
173 return false;
174 }
175 public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
176 {
177 IPropertyGridable instance = (IPropertyGridable)context.Instance;
178 StandardValuesCollection vals = new TypeConverter.StandardValuesCollection(instance.GetNodes());
179 return vals;
180 }
181 public override bool IsValid(ITypeDescriptorContext context, object value)
182 {
183 return false;
184 }
185 }