实现本地化多语言我做的一些思想,希望大家共同探讨一些.
2007-09-10 10:02
387 查看
public class BasePage : System.Web.UI.Page
{
#region 多语言信息
/*
语言种类
*/
enum CultureInfoEnum
{
ZH_CN = 0x0804,//中文
ZH_TW = 0x0404,//繁体
EN_US = 0x0409,//英文
JA_JP = 0x0411 //日文
}
protected override void Page_Load(object sender, EventArgs e)
{
this.setControlinfo();
}
private ResourceManager rm;
private Assembly asm;
protected void setControlInfo()
{
string strWebPath = Server.MapPath("../");
string strNameSpace = string.Empty;
if (Session["Language"] == null)
Session["Language"] = "ZH_CN";
switch (this.Session["Language"].ToString())
{
case "EN_US":
Thread.CurrentThread.CurrentCulture = new CultureInfo((int)CultureInfoEnum.EN_US, false);
strNameSpace = string.Format("EN_US.{0}", this.GetType().BaseType.Name);
asm = Assembly.LoadFrom(string.Format("{0}Language//EN_US.dll", strWebPath));
this.rm = new ResourceManager(strNameSpace, asm);
break;
case "ZH_CN":
Thread.CurrentThread.CurrentCulture = new CultureInfo((int)CultureInfoEnum.ZH_CN, false);
strNameSpace = string.Format("ZH_CN.{0}", this.GetType().BaseType.Name);
asm = Assembly.LoadFrom(string.Format("{0}Language//ZH_CN.dll", strWebPath));
this.rm = new ResourceManager(strNameSpace, asm);
break;
}
this.CultureInfoControlLangage(this.Page.Controls);
}
private void CultureInfoControlLangage(ControlCollection controls)
{
foreach (Control control in controls)
{
switch (control.GetType().Name)
{
case "Label":
Label label = control as Label;
label.Text = this.getControlValue(label.ID);
break;
case "HyperLink":
HyperLink hyperlink = control as HyperLink;
hyperlink.Text = this.getControlValue(hyperlink.ID);
break;
case "Button":
Button button = control as Button;
button.Text = this.getControlValue(button.ID);
break;
case "RadioButton":
RadioButton radiobutton = control as RadioButton;
radiobutton.Text = this.getControlValue(radiobutton.ID);
break;
case "RequiredFieldValidator":
RequiredFieldValidator requiredfieldvalidator = control as RequiredFieldValidator;
requiredfieldvalidator.ErrorMessage = this.getControlValue(requiredfieldvalidator.ID);
break;
case "CustomValidator":
CustomValidator customvalidator = control as CustomValidator;
customvalidator.ErrorMessage = this.getControlValue(customvalidator.ID);
break;
case "CompareValidator":
CompareValidator comparevalidator = control as CompareValidator;
comparevalidator.ErrorMessage = this.getControlValue(comparevalidator.ID);
break;
case "RegularExpressionValidator":
RegularExpressionValidator regularexpressionvalidator = control as RegularExpressionValidator;
regularexpressionvalidator.ErrorMessage = this.getControlValue(regularexpressionvalidator.ID);
break;
case "Image":
Image image = control as Image;
string strUrl = this.getControlValue(image.ID);
if (!strUrl.Equals(image.ID))
image.ImageUrl = strUrl;
break;
case "ImageButton":
ImageButton imagebutton = control as ImageButton;
string strImageUrl = this.getControlValue(imagebutton.ID);
if (!strImageUrl.Equals(imagebutton.ID))
imagebutton.ImageUrl = strImageUrl;
break;
case "LinkButton":
LinkButton linkButton = control as LinkButton;
string strLinkText = this.getControlValue(linkButton.ID);
if (!strLinkText.Equals(linkButton.ID))
linkButton.Text = strLinkText;
break;
case "CheckBox":
CheckBox checkbox = control as CheckBox;
checkbox.Text = this.getControlValue(checkbox.ID);
break;
}
this.CultureInfoControlLangage(control.Controls);
}
}
public void ShowMessage(string strMessageNo)
{
try
{
string strMessage = this.rm.GetString(strMessageNo);
this.Response.Write(string.Format("<script languange=/"javascript/"> alert(/"{0}/")</script>",strMessage));
}
catch (Exception ex)
{
this.Response.Write(ex.Message);
}
}
public string getControlValue(string controlID)
{
try
{
string strMessage = this.rm.GetString(controlID);
return strMessage == null ? controlID: strMessage;
}
catch (Exception ex)
{
this.Response.Write(ex.Message);
return ex.Message;
}
}
#endregion
}
一直想做个好的本地化语言的东西,但是技术太差了,做也做不好,借此发布我的一些东西,共同探讨一下.
一般用资源文件都会以dll的形式加载到内存中,但是如果是多语言的话,会造成dll过大,而程序需要加载的时间太
长,所以用Assembly.LoadFrom方法你URL的形式动态加载Dll,把一种语言做一个dll.减少dll加载的时间.但是这样也有很个问题就是每次打开页面都要Assembly.LoadFrom,重新加载dll造成程序太慢了。由此我想到了单件模式去做,
声明private Assembly asm;改asm为static变量,如果asm!=null就不加载,但是static变量是在编译是分配,浏览器关闭时,GC才回收.又不能随意做语言切换.欢迎有兴趣的一起探讨.
{
#region 多语言信息
/*
语言种类
*/
enum CultureInfoEnum
{
ZH_CN = 0x0804,//中文
ZH_TW = 0x0404,//繁体
EN_US = 0x0409,//英文
JA_JP = 0x0411 //日文
}
protected override void Page_Load(object sender, EventArgs e)
{
this.setControlinfo();
}
private ResourceManager rm;
private Assembly asm;
protected void setControlInfo()
{
string strWebPath = Server.MapPath("../");
string strNameSpace = string.Empty;
if (Session["Language"] == null)
Session["Language"] = "ZH_CN";
switch (this.Session["Language"].ToString())
{
case "EN_US":
Thread.CurrentThread.CurrentCulture = new CultureInfo((int)CultureInfoEnum.EN_US, false);
strNameSpace = string.Format("EN_US.{0}", this.GetType().BaseType.Name);
asm = Assembly.LoadFrom(string.Format("{0}Language//EN_US.dll", strWebPath));
this.rm = new ResourceManager(strNameSpace, asm);
break;
case "ZH_CN":
Thread.CurrentThread.CurrentCulture = new CultureInfo((int)CultureInfoEnum.ZH_CN, false);
strNameSpace = string.Format("ZH_CN.{0}", this.GetType().BaseType.Name);
asm = Assembly.LoadFrom(string.Format("{0}Language//ZH_CN.dll", strWebPath));
this.rm = new ResourceManager(strNameSpace, asm);
break;
}
this.CultureInfoControlLangage(this.Page.Controls);
}
private void CultureInfoControlLangage(ControlCollection controls)
{
foreach (Control control in controls)
{
switch (control.GetType().Name)
{
case "Label":
Label label = control as Label;
label.Text = this.getControlValue(label.ID);
break;
case "HyperLink":
HyperLink hyperlink = control as HyperLink;
hyperlink.Text = this.getControlValue(hyperlink.ID);
break;
case "Button":
Button button = control as Button;
button.Text = this.getControlValue(button.ID);
break;
case "RadioButton":
RadioButton radiobutton = control as RadioButton;
radiobutton.Text = this.getControlValue(radiobutton.ID);
break;
case "RequiredFieldValidator":
RequiredFieldValidator requiredfieldvalidator = control as RequiredFieldValidator;
requiredfieldvalidator.ErrorMessage = this.getControlValue(requiredfieldvalidator.ID);
break;
case "CustomValidator":
CustomValidator customvalidator = control as CustomValidator;
customvalidator.ErrorMessage = this.getControlValue(customvalidator.ID);
break;
case "CompareValidator":
CompareValidator comparevalidator = control as CompareValidator;
comparevalidator.ErrorMessage = this.getControlValue(comparevalidator.ID);
break;
case "RegularExpressionValidator":
RegularExpressionValidator regularexpressionvalidator = control as RegularExpressionValidator;
regularexpressionvalidator.ErrorMessage = this.getControlValue(regularexpressionvalidator.ID);
break;
case "Image":
Image image = control as Image;
string strUrl = this.getControlValue(image.ID);
if (!strUrl.Equals(image.ID))
image.ImageUrl = strUrl;
break;
case "ImageButton":
ImageButton imagebutton = control as ImageButton;
string strImageUrl = this.getControlValue(imagebutton.ID);
if (!strImageUrl.Equals(imagebutton.ID))
imagebutton.ImageUrl = strImageUrl;
break;
case "LinkButton":
LinkButton linkButton = control as LinkButton;
string strLinkText = this.getControlValue(linkButton.ID);
if (!strLinkText.Equals(linkButton.ID))
linkButton.Text = strLinkText;
break;
case "CheckBox":
CheckBox checkbox = control as CheckBox;
checkbox.Text = this.getControlValue(checkbox.ID);
break;
}
this.CultureInfoControlLangage(control.Controls);
}
}
public void ShowMessage(string strMessageNo)
{
try
{
string strMessage = this.rm.GetString(strMessageNo);
this.Response.Write(string.Format("<script languange=/"javascript/"> alert(/"{0}/")</script>",strMessage));
}
catch (Exception ex)
{
this.Response.Write(ex.Message);
}
}
public string getControlValue(string controlID)
{
try
{
string strMessage = this.rm.GetString(controlID);
return strMessage == null ? controlID: strMessage;
}
catch (Exception ex)
{
this.Response.Write(ex.Message);
return ex.Message;
}
}
#endregion
}
一直想做个好的本地化语言的东西,但是技术太差了,做也做不好,借此发布我的一些东西,共同探讨一下.
一般用资源文件都会以dll的形式加载到内存中,但是如果是多语言的话,会造成dll过大,而程序需要加载的时间太
长,所以用Assembly.LoadFrom方法你URL的形式动态加载Dll,把一种语言做一个dll.减少dll加载的时间.但是这样也有很个问题就是每次打开页面都要Assembly.LoadFrom,重新加载dll造成程序太慢了。由此我想到了单件模式去做,
声明private Assembly asm;改asm为static变量,如果asm!=null就不加载,但是static变量是在编译是分配,浏览器关闭时,GC才回收.又不能随意做语言切换.欢迎有兴趣的一起探讨.
相关文章推荐
- [转]在项目开发总的一些感受,希望大家共同来探讨项目管理中的一些看法
- 在项目开发总的一些感受,希望大家共同来探讨项目管理中的一些看法
- 在项目开发总的一些感受,希望大家共同来探讨项目管理中的一些看法
- 在项目开发总的一些感受,希望大家共同来探讨项目管理中的一些看法
- Qt Qtableview 的一些用法 希望共同学习探讨
- 如何实现网间互访(没有网络服务器权限) 大家提提建议 共同探讨一下
- 现在正在搞博士的东西,导师要求将一个二维的图片转换成现实生活中的三维图片,实现仿真,这个课题真有点难度,现在还莫不着头绪,查了相关的一些知识,可就是没有一个系统的,希望大家各抒己见,提一些好的建议,好的文章
- Eclipse开发工具的一些小知识,Eclipse切换工作空间的办法!(记录下来,希望与大家一起分享,共同学习吧!)
- C语言数据结构之单向链表(已经调试可以实现相应的功能了,可是还是有几个问题现在还是不大理解,希望大家能够一起探讨)
- Flex开发的一些经验总结——本地化(多语言)实现
- 把遇到过的对.Net线程的一些问题和误解集中起来和大家分享,也希望大家能一起补充,热烈欢迎讨论(引)
- 总结分享下日常生活中用到的一些功能,很好很强大,功能很多有20个,希望大家喜欢
- 通过对PHP语言的学习,应该知道它是基于函数的一款HTML脚本语言。庞大的函数库支持着PHP语言功能的实现。下面我们为大家介绍有关PHP函数isset()与empty()的相关用法。
- 我自己整理的一些常用SQL语句,希望对大家有用啊
- 公布一些常用的WebServices,希望对大家的应用有帮助
- 3分钟实现iOS语言本地化/国际化(图文详解)
- 端口占用问题,今天学习的时候又出现了这个问题,找了度娘,特此记录以下。第一次写博客,希望自己能坚持下来。大家共同进步
- 新的一周,希望大家共同进步
- swift单节点配置遇到的一些问题和解决办法,希望大家补充
- 关系数据库的查询优化策略----总结了一些查询优化的方法,希望可以对大家有所帮助