您的位置:首页 > 其它

WinForm中多国语言的实现

2015-01-28 17:58 288 查看
1.改变程序中界面的语言

--1.先设定好默认情况下的界面.然后将localizable改为True,选择Language的某个语言,再设定该语言的界面.然后再改变 Language,设定相应的界面.此时,如果再将localizable改为False,将用当前选择的Language语言界面覆写默认界面资源文 件.

--2.程序开启进会自动选择当前系统的语言界面,如果没有该语言,则显示默认语言,如果在程序启动后还想改变语言,则可以参考使用下面的代码:

/// 取得操作系统的语言

public static string GetSystemLang()

{

InputLanguage currentLanguage = InputLanguage.DefaultInputLanguage;

CultureInfo cultureInfo = currentLanguage.Culture;

return cultureInfo.ToString();

}

/// 取得应用程序的界面语言

public static string GetLang()

{

return System.Threading.Thread.CurrentThread.CurrentUICulture.ToString();

}

/// 设定应用程序的界面语言

public static void SetLang(string lang)

{

System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);

}

/// <summary>

/// 设置窗体的界面资源

/// </summary>

/// <param name="lang">language:zh-CN, en-US</param>

/// <param name="form">窗体实例,不能为null</param>

/// <param name="formType">窗体类型</param>

public static void SetLang(string lang, Form form, Type formType)

{

//设定窗体form的语言,使form的设置立即生效

System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(formType);

resources.ApplyResources(form, "$this");

AppLang(form, resources);

}

/// <summary>

/// 遍历窗体所有控件,针对其设置当前界面资源

/// </summary>

/// <param name="control"></param>

/// <param name="resources"></param>

private static void AppLang(Control control, System.ComponentModel.ComponentResourceManager resources)

{

if (control is MenuStrip)

{

resources.ApplyResources(control, control.Name);

MenuStrip ms = (MenuStrip)control;

if (ms.Items.Count > 0)

{

foreach (ToolStripMenuItem c in ms.Items)

{

AppLang(c, resources);

}

}

}

foreach (Control c in control.Controls)

{

//只改了控件的Name属性

resources.ApplyResources(c, c.Name);

AppLang(c, resources);

}

}

/// <summary>

/// 遍历菜单

/// </summary>

/// <param name="item"></param>

/// <param name="resources"></param>

private static void AppLang(ToolStripMenuItem item, System.ComponentModel.ComponentResourceManager resources)

{

if (item is ToolStripMenuItem)

{

resources.ApplyResources(item, item.Name);

ToolStripMenuItem tsmi = (ToolStripMenuItem)item;

if (tsmi.DropDownItems.Count > 0)

{

foreach (ToolStripMenuItem c in tsmi.DropDownItems)

{

AppLang(c, resources);

}

}

}

}

--3.在需要的地方调用以下代码:

//设定应用程序的语言

SetLang("en-CHS");

//设定窗体的资源

SetLang( this, this.GetType());

--4.生产语言资源的工具

Resourcer.exe

下载页面:http://www.aisto.com/roeder/dotnet/

2.改变程序中数据的语言

程序中的数据一般存储在数据库中,为了支持多语言,数据库的设计有以下几个方案:

--1.在数据库级别支持多语言:为每种语言建立独立的数据库,不同语言的用户操作不同的数据库。

由于数据库中有大量的信息(如标志,编码,数字等)是用于内部处理使用的,与语言无关的,因此在数据库级别支持多语言会导致空间的极大浪费,这种方法一般 不使用.

--2.在表级别支持多语言:为每种语言建立独立的表,不同语言的用户操作不同的表,但是它们在同一个数据库中。

因为并不是所有的表都需要支持多语言,对于与语言无关的表,不同语言的用户共享一套,那些和语言相关的表根据支持语言的种类来建立,不同语言的用户存取访 问不同的表格。这样使得维护简单,节省了存储空间,即使是扩展起来也比较方便,只要把需要支持多语言的表,多建立一套即可。

注意:

问题1:有些表中某些字段是不同语言版本的表共享的(例如库存量),由于各种语言的表之间的相对独立性,使得数据共享有些困难。解决的方法有两个:

--(1)不同语言的表的共享字段同步:也就是说,只要修改了其中一个表的共享字段,其它语言表中该字段也作相应改变,实际上当不同语言的用户同时访问时 处理还是比较麻烦的,并且扩充新语言时修改工作比较大。

--(2)增加一个新的表:把所有语言共享的字段(例如货物编号,产地编码等)全部放在这个表,支持多语言的表只存放与各种语言相关的字段。不同语言的用 户在使用数据库时,需要操作两个数据表。

问题2:不同的语言可能会要求同时显示.这种情况一般只显示两种语言.如简体中文-英文,繁体中文-英文,简体中文-繁体中文,不知道有没有一次显示简- 繁-英三种语言的.

--3.在字段级别支持多语言:在同一个表中为每种语言建立独立的字段,不同语言的用户操作不同的字段,它们在同一个表中。

这种方法最大的问题是一旦需要支持新的语言,由于需要修改表结构,维护起来非常麻烦,可扩展性不好。

参考文献:1.http://blog.csdn.net/tjvictor/archive/2006/12/27/1464284.aspx

2.http://www.cnbruce.com/blog/showlog.asp?log_id=691&cat_id=0

3.http://blog.csdn.net/leomaya/archive/2007/01/12/1481437.aspx

4.http://hi.baidu.com/mops/blog/item/954095ece7d0433f26979198.html

5.http://faq.csdn.net/read/170926.html

转自:http://apps.hi.baidu.com/share/detail/18552608
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: