您的位置:首页 > 其它

实现本地化多语言我做的一些思想,希望大家共同探讨一些.

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才回收.又不能随意做语言切换.欢迎有兴趣的一起探讨.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐