写在开头:  我只是一只小鸟, 孤陋又寡闻, 文中观点尽代表个人意见, 与51CTO无关, 若有错误之处, 鸡蛋番茄的不要
 
那么, 列举一下我见过的几种国际化的方式:
1. 语言INI配置文件   这可能是最常用的一种, 为每种语言单独配置一个文件, 文件结构类似与 dictionary   Key=value. 
例如:
 
一个按钮:
InBlock.gifButton b = new Button();
InBlock.gifb.Name = "myButton";
InBlock.gifb.Text = getString(b.Name);
注:getString(key) 为自定义函数
配置文件可能如下:
myButton = 测试按钮
 
然后由 getString(key) 获取值(此处 key = myButton, value = 测试按钮)
软件中所有的控件, 都需要一个getString(key)获取Text属性, 并且, 每次切换语言, 必须再次全部获取一次.  如有10个控件, 必须写10句getString(key)
好处是, 修改语言包的时候, 可以不必重新编译软件.
 
2. Resource 文件. 用的不知多不多
类似INI配置文件, 只是内容存在了Resource资源文件中, 也需要一个getString(key), 并且, 每次切换语言, 必须再次全部获取一次. 
修改语言包的时候, 需要重新编译软件.
 
3. 设置窗体的Language之后, 逐个修改控件的Text属性, 会在Form下生成对于的资源文件, 但是, 资源文件将由IDE维护, 切换语言时, 也需要针对每个控件, 重新获取一次.
 
4. 下面是我的方法.  利用Setting文件结合Resource文件.
大家知道, Setting的 好处是可以绑定, 这样就可以省去每个控件的获取过程(也可以省不少代码啊), 缺点是, 你需要多维护一份语言文件(即Setting文件)
切换语言时, 只要这样转换一下就好了:
InBlock.gif private static void ChangeLanugate()
InBlock.gif                {
InBlock.gif                         foreach (SettingsPropertyValue s in yourNamespace.Properties.Settings.Default.PropertyValues)
InBlock.gif                                s.PropertyValue = GetString(s.Name, s.Property.DefaultValue.ToString());
InBlock.gif
InBlock.gif                        yourNamespace.Properties.Settings.Default.Save();
InBlock.gif                        yourNamespace.Properties.Settings.Default.Upgrade();
InBlock.gif                }
InBlock.gif
InBlock.gif
InBlock.gif static string GetString( string strID, string defaultStr)
InBlock.gif                {
InBlock.gif                     string s = new ResourceManager( "yourNamespace.Resources.Resource1", System.Reflection.Assembly.GetExecutingAssembly()).GetString(strID, Thread.CurrentThread.CurrentCulture);
InBlock.gif return string.IsNullOrEmpty(s) ?defaultStr : s;
InBlock.gif                }
注:你需要先了解第2种方法, 才能使用此种方法.
 
5.  看到这里, 或许有的看官已经注意到,  我们何不将第1种和第4种的优点结合一下呢?
只要将第4种方法的转换函数改一下,  改成从INI文件获取就行了, 虽然有多大的好处不好说,  但至少可以修改(或者说改进)语言包的时候,  可以免去重编译的过程了
 
 
文章写到这,  说好的, 鸡蛋番茄的不要~~