由于时间紧促,来不及去看.Net的全球化实现方法,所以自己写了个资源文件的实现方法,来实现工程的多语言版需求。原理很简单,将一个窗体会用到的所有字符串,包括各种控件的显示文本,用序列化方法保存到文件中。定义一个继承类BaseForm,在窗体加载中读出资源文件,实现语言化。
以下让我们来具体实现。
一、ResCollection类
此类实现了资源文件的结构定义。
1
using System;
2
using System.Collections;
3
4
namespace FaibClass.Language
5
{
6
7
[Serializable()]
8
public class ResCollection
9
{
10
Hashtable hast = new Hashtable();
11
private string m_Copyright;
12
private string m_Description;
13
14
public string Copyright
15
{
16
get{return m_Copyright;}
17
set{m_Copyright = value;}
18
}
19
20
public string Description
21
{
22
get{return m_Description;}
23
set{m_Description = value;}
24
}
25
26
public ResCollection()
27
{
28
}
29
30
public int Count
31
{
32
get{return hast.Count;}
33
}
34
35
public string this[int Index]
36
{
37
get
38
{
39
string[] s = new string[this.Count];
40
hast.Keys.CopyTo(s, 0);
41
return s[Index];
42
}
43
}
44
45
public ValueList this[string Section]
46
{
47
get
48
{
49
return hast[Section] as ValueList;
50
}
51
set
52
{
53
if(hast.ContainsKey(Section))
54
{
55
hast[Section] = value;
56
}
57
}
58
}
59
60
public void Add(string Section, string Key, string Value)
61
{
62
if(hast.ContainsKey(Section))
63
{
64
(hast[Section] as ValueList).Add(Key, Value);
65
}
66
else
67
{
68
ValueList vl = new ValueList();
69
vl.Add(Key, Value);
70
hast.Add(Section, vl);
71
}
72
}
73
74
public void Clear()
75
{
76
hast.Clear();
77
}
78
79
public void Remove(string Section)
80
{
81
hast.Remove(Section);
82
}
83
}
84
85
[Serializable()]
86
public class ValueList
87
{
88
Hashtable hast = new Hashtable();
89
90
public ValueList()
91
{
92
}
93
94
public int Count
95
{
96
get{return hast.Count;}
97
}
98
99
public string this[int Index]
100
{
101
get
102
{
103
string[] s = new string[this.Count];
104
hast.Keys.CopyTo(s, 0);
105
return s[Index];
106
}
107
}
108
109
public string this[string Key]
110
{
111
get
112
{
113
if(hast.ContainsKey(Key))
114
{
115
return hast[Key].ToString();
116
}
117
else
118
{
119
return "";
120
}
121
}
122
set
123
{
124
if(hast.ContainsKey(Key))
125
{
126
hast[Key] = value;
127
}
128
}
129
}
130
131
public void Add(string Key, string Value)
132
{
133
hast.Add(Key, Value);
134
}
135
136
public void Clear()
137
{
138
hast.Clear();
139
}
140
141
public void Remove(string Key)
142
{
143
hast.Remove(Key);
144
}
145
}
146
}
using System;2
using System.Collections;3

4
namespace FaibClass.Language5
{6

7
[Serializable()]8
public class ResCollection9
{10
Hashtable hast = new Hashtable();11
private string m_Copyright;12
private string m_Description;13

14
public string Copyright15
{16
get{return m_Copyright;}17
set{m_Copyright = value;}18
}19

20
public string Description21
{22
get{return m_Description;}23
set{m_Description = value;}24
}25

26
public ResCollection()27
{28
}29

30
public int Count31
{32
get{return hast.Count;}33
}34

35
public string this[int Index]36
{37
get38
{39
string[] s = new string[this.Count];40
hast.Keys.CopyTo(s, 0);41
return s[Index];42
}43
}44

45
public ValueList this[string Section]46
{47
get48
{49
return hast[Section] as ValueList;50
}51
set52
{53
if(hast.ContainsKey(Section))54
{55
hast[Section] = value;56
}57
}58
}59

60
public void Add(string Section, string Key, string Value)61
{62
if(hast.ContainsKey(Section))63
{64
(hast[Section] as ValueList).Add(Key, Value);65
}66
else67
{68
ValueList vl = new ValueList();69
vl.Add(Key, Value);70
hast.Add(Section, vl);71
}72
}73

74
public void Clear()75
{76
hast.Clear();77
}78

79
public void Remove(string Section)80
{81
hast.Remove(Section);82
}83
}84

85
[Serializable()]86
public class ValueList87
{88
Hashtable hast = new Hashtable();89

90
public ValueList()91
{92
}93

94
public int Count95
{96
get{return hast.Count;}97
}98

99
public string this[int Index]100
{101
get102
{103
string[] s = new string[this.Count];104
hast.Keys.CopyTo(s, 0);105
return s[Index];106
}107
}108

109
public string this[string Key]110
{111
get112
{113
if(hast.ContainsKey(Key))114
{115
return hast[Key].ToString();116
}117
else118
{119
return "";120
}121
}122
set123
{124
if(hast.ContainsKey(Key))125
{126
hast[Key] = value;127
}128
}129
}130

131
public void Add(string Key, string Value)132
{133
hast.Add(Key, Value);134
}135

136
public void Clear()137
{138
hast.Clear();139
}140

141
public void Remove(string Key)142
{143
hast.Remove(Key);144
}145
}146
}二、ResManager类
此类实现了资源文件结构的序列化保存与读取,并语言化WinForm控件。
1
using System;
2
using System.Collections;
3
using System.Runtime.Serialization;
4
using System.Runtime.Serialization.Formatters;
5
using System.Runtime.Serialization.Formatters.Binary;
6
using System.Windows.Forms;
7
using System.IO;
8
9
namespace FaibClass.Language
10
{
11
public class ResManager
12
{
13
private ValueList vl = new ValueList();
14
private ValueList basevl = new ValueList();
15
16
public ResManager(Form Target, string FileName, string Section)
17
{
18
BinaryFormatter binf = new BinaryFormatter();
19
Stream str = File.Open(FileName, FileMode.Open);
20
ResCollection resc = binf.Deserialize(str) as ResCollection;
21
str.Close();
22
basevl = resc["Base"];
23
vl = resc[Section];
24
25
if(Target == null)return;
26
if(vl == null)return;
27
string strText = vl["Text"];
28
if(strText != "")
29
{
30
Target.Text = strText;
31
}
32
SearchChildControl(Target);
33
if(Target.Menu != null)
34
{
35
SearchMenuItem(Target.Menu);
36
}
37
}
38
39
public ValueList ValueList
40
{
41
get{return vl;}
42
}
43
44
public ValueList BaseValueList
45
{
46
get{return basevl;}
47
}
48
49
//语言化字控件
50
private void SearchChildControl(Control Owner)
51
{
52
foreach(Control ctl in Owner.Controls)
53
{
54
string strText = vl[ctl.Name];
55
if(strText != "")
56
{
57
ctl.Text = strText;
58
}
59
switch(ctl.GetType().Name)
60
{
61
case "ToolBar":
62
SearchToolbarButton(ctl as ToolBar);
63
break;
64
case "StatusBar":
65
SearchStatusBarPanel(ctl as StatusBar);
66
break;
67
case "TabControl":
68
SearchTabPage(ctl as TabControl);
69
break;
70
case "ListView":
71
SearchColumnHeader(ctl as ListView);
72
break;
73
}
74
if(ctl.HasChildren)
75
{
76
SearchChildControl(ctl);
77
}
78
}
79
}
80
81
//语言化菜单
82
private void SearchMenuItem(Menu Owner)
83
{
84
foreach(MenuItem mnu in Owner.MenuItems)
85
{
86
string strText = vl[mnu.Text];
87
if(strText != "")
88
{
89
mnu.Text = strText;
90
}
91
SearchMenuItem(mnu);
92
}
93
}
94
//语言化工具栏
95
private void SearchToolbarButton(ToolBar Owner)
96
{
97
foreach(ToolBarButton tlbbtn in Owner.Buttons)
98
{
99
string strText = vl[tlbbtn.ToolTipText];
100
if(strText != "")
101
{
102
tlbbtn.ToolTipText = strText;
103
}
104
}
105
}
106
//语言化状态栏
107
private void SearchStatusBarPanel(StatusBar Owner)
108
{
109
foreach(StatusBarPanel stapnl in Owner.Panels)
110
{
111
string strText = vl[stapnl.Text];
112
if(strText != "")
113
{
114
stapnl.Text = strText;
115
}
116
}
117
}
118
//语言化分页
119
private void SearchTabPage(TabControl Owner)
120
{
121
foreach(TabPage tab in Owner.TabPages)
122
{
123
string strText = vl[tab.Text];
124
if(strText != "")
125
{
126
tab.Text = strText;
127
}
128
SearchChildControl(tab);
129
}
130
}
131
//语言化列表
132
private void SearchColumnHeader(ListView Owner)
133
{
134
foreach(ColumnHeader colhdr in Owner.Columns)
135
{
136
string strText = vl[colhdr.Text];
137
if(strText != "")
138
{
139
colhdr.Text = strText;
140
}
141
}
142
}
143
144
public static ResCollection Open(string FileName)
145
{
146
BinaryFormatter binf = new BinaryFormatter();
147
Stream str = File.Open(FileName, FileMode.Open);
148
ResCollection resc = binf.Deserialize(str) as ResCollection;
149
str.Close();
150
return resc;
151
}
152
153
public static void Save(string FileName, ResCollection resc)
154
{
155
BinaryFormatter binf = new BinaryFormatter();
156
Stream str = File.Open(FileName, FileMode.Create);
157
binf.AssemblyFormat = FormatterAssemblyStyle.Simple;
158
binf.TypeFormat = FormatterTypeStyle.TypesWhenNeeded;
159
binf.Serialize(str, resc);
160
str.Close();
161
}
162
}
163
}
164
using System;2
using System.Collections;3
using System.Runtime.Serialization;4
using System.Runtime.Serialization.Formatters;5
using System.Runtime.Serialization.Formatters.Binary;6
using System.Windows.Forms;7
using System.IO;8

9
namespace FaibClass.Language10
{11
public class ResManager12
{13
private ValueList vl = new ValueList();14
private ValueList basevl = new ValueList();15

16
public ResManager(Form Target, string FileName, string Section)17
{18
BinaryFormatter binf = new BinaryFormatter();19
Stream str = File.Open(FileName, FileMode.Open);20
ResCollection resc = binf.Deserialize(str) as ResCollection;21
str.Close();22
basevl = resc["Base"];23
vl = resc[Section];24

25
if(Target == null)return;26
if(vl == null)return;27
string strText = vl["Text"];28
if(strText != "")29
{30
Target.Text = strText;31
}32
SearchChildControl(Target);33
if(Target.Menu != null)34
{35
SearchMenuItem(Target.Menu);36
}37
}38

39
public ValueList ValueList40
{41
get{return vl;}42
}43

44
public ValueList BaseValueList45
{46
get{return basevl;}47
}48

49
//语言化字控件50
private void SearchChildControl(Control Owner)51
{52
foreach(Control ctl in Owner.Controls)53
{54
string strText = vl[ctl.Name];55
if(strText != "")56
{57
ctl.Text = strText;58
}59
switch(ctl.GetType().Name)60
{61
case "ToolBar":62
SearchToolbarButton(ctl as ToolBar);63
break;64
case "StatusBar":65
SearchStatusBarPanel(ctl as StatusBar);66
break;67
case "TabControl":68
SearchTabPage(ctl as TabControl);69
break;70
case "ListView":71
SearchColumnHeader(ctl as ListView);72
break;73
}74
if(ctl.HasChildren)75
{76
SearchChildControl(ctl);77
}78
}79
}80

81
//语言化菜单82
private void SearchMenuItem(Menu Owner)83
{84
foreach(MenuItem mnu in Owner.MenuItems)85
{86
string strText = vl[mnu.Text];87
if(strText != "")88
{89
mnu.Text = strText;90
}91
SearchMenuItem(mnu);92
}93
}94
//语言化工具栏95
private void SearchToolbarButton(ToolBar Owner)96
{97
foreach(ToolBarButton tlbbtn in Owner.Buttons)98
{99
string strText = vl[tlbbtn.ToolTipText];100
if(strText != "")101
{102
tlbbtn.ToolTipText = strText;103
}104
}105
}106
//语言化状态栏107
private void SearchStatusBarPanel(StatusBar Owner)108
{109
foreach(StatusBarPanel stapnl in Owner.Panels)110
{111
string strText = vl[stapnl.Text];112
if(strText != "")113
{114
stapnl.Text = strText;115
}116
}117
}118
//语言化分页119
private void SearchTabPage(TabControl Owner)120
{121
foreach(TabPage tab in Owner.TabPages)122
{123
string strText = vl[tab.Text];124
if(strText != "")125
{126
tab.Text = strText;127
}128
SearchChildControl(tab);129
}130
}131
//语言化列表132
private void SearchColumnHeader(ListView Owner)133
{134
foreach(ColumnHeader colhdr in Owner.Columns)135
{136
string strText = vl[colhdr.Text];137
if(strText != "")138
{139
colhdr.Text = strText;140
}141
}142
}143

144
public static ResCollection Open(string FileName)145
{146
BinaryFormatter binf = new BinaryFormatter();147
Stream str = File.Open(FileName, FileMode.Open);148
ResCollection resc = binf.Deserialize(str) as ResCollection;149
str.Close();150
return resc;151
}152

153
public static void Save(string FileName, ResCollection resc)154
{155
BinaryFormatter binf = new BinaryFormatter();156
Stream str = File.Open(FileName, FileMode.Create);157
binf.AssemblyFormat = FormatterAssemblyStyle.Simple;158
binf.TypeFormat = FormatterTypeStyle.TypesWhenNeeded;159
binf.Serialize(str, resc);160
str.Close();161
}162
}163
}164

Menu、Toolbar、StatusBar、ListView、TabPage是以Text来命名资源名的,其余控件使用控件的Name来命名。
三、继承类BaseForm
1
using System;
2
using System.Windows.Forms;
3
using System.ComponentModel;
4
using FaibClass.Language;
5
6
namespace FaibSoft.CheaterMember
7
{
8
public class BaseForm: Form
9
{
10
private ResManager resm;
11
public ValueList _ValueList;
12
public ValueList _BaseValueList;
13
14
[Browsable(false)]
15
public ValueList BaseValueList
16
{
17
get
18
{
19
return _BaseValueList;
20
}
21
}
22
[Browsable(false)]
23
public ValueList ValueList
24
{
25
get
26
{
27
return _ValueList;
28
}
29
}
30
31
public BaseForm()
32
{
33
}
34
35
protected override void OnLoad(EventArgs e)
36
{
37
try
38
{
39
resm = new ResManager(this, Common.LanguageFile, this.GetType().Name);
40
_BaseValueList = resm.BaseValueList;
41
_ValueList = resm.ValueList;
42
}
43
catch{}
44
base.OnLoad (e);
45
}
46
47
}
48
}
49
using System;2
using System.Windows.Forms;3
using System.ComponentModel;4
using FaibClass.Language;5

6
namespace FaibSoft.CheaterMember7
{8
public class BaseForm: Form9
{10
private ResManager resm;11
public ValueList _ValueList;12
public ValueList _BaseValueList;13

14
[Browsable(false)]15
public ValueList BaseValueList16
{17
get18
{19
return _BaseValueList;20
}21
}22
[Browsable(false)]23
public ValueList ValueList24
{25
get26
{27
return _ValueList;28
}29
}30

31
public BaseForm()32
{33
}34

35
protected override void OnLoad(EventArgs e)36
{37
try38
{39
resm = new ResManager(this, Common.LanguageFile, this.GetType().Name);40
_BaseValueList = resm.BaseValueList;41
_ValueList = resm.ValueList;42
}43
catch{}44
base.OnLoad (e);45
}46

47
}48
}49

使用本窗体资源直接使用ValueList["资源名"],使用公共资源使用BaseValueList["资源名"]
相关下载资源编辑器 、示例


浙公网安备 33010602011771号