注入式的界面多语言方案
2008-09-07 12:14
134 查看
添加一个如下的配置表:
在PageBase类中,添加如下一个方法来实现页面元素的多语化:
protected coid Localize(string cultureNo)
重写OnPreRender方法,在OnPreRender方法中调用Localize方法,Localize遍历配置表中属于当前页面的控件,为每个控件都取出资源值并赋给相应属性,示例代码如下:
protected virtual void Localize(string cultureNo)
{
string fileName = System.IO.Path.GetFileName(this.Request.Path);
string pathName = MapPath(fileName + ".xml"); //配置文件
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(pathName);
XmlNode rootNode = xmlDoc.SelectSingleNode("Controls");
XmlNodeList controls = rootNode.SelectNodes("Control");
foreach (XmlNode node in controls)
{
string id = node.SelectSingleNode("ID").InnerText;
string property = node.SelectSingleNode("Property").InnerText;
string resId = node.SelectSingleNode("ResourceID").InnerText;
string resText = GetResText(cultureNo, resId); //读取资源
//通过反射赋值
Control ctrl = this.FindControl(id);
Type type = ctrl.GetType();
PropertyInfo propertyInfo = type.GetProperty(property);
propertyInfo.SetValue(ctrl, resText, null);
}
}
配置表的格式:
<?xml version="1.0" encoding="utf-8"?>
<Controls>
<Control>
<ID>btnOK</ID>
<Type>Button</Type>
<Property>Text</Property>
<ResourceID>10000001</ResourceID>
</Control>
<Control>
<ID>Literal1</ID>
<Type>Literal</Type>
<Property>Text</Property>
<ResourceID>10000002</ResourceID>
</Control>
<Control>
<ID>Label1</ID>
<Type>Label</Type>
<Property>Text</Property>
<ResourceID>10000003</ResourceID>
</Control>
<Control>
<ID>btnOK</ID>
<Type>Button</Type>
<Property>ToolTip</Property>
<ResourceID>10000001</ResourceID>
</Control>
</Controls>
优点:开发的时候不需要做任何操作,甚至不需要象方案一一样设置资源ID,只需要添加一张配置表即可让基类完成95%的情况,其余5%的情况通过重写Localize方法可以实现。
缺点:对于DataGrid等控件中的子控件,不能通过FindControls来找到。
控件类型 | 控件ID | 控件属性 | 资源ID |
Literal | ltUserName | Text | 10000001 |
Button | btnSave | Text | 10000002 |
Button | btnSave | ToolTip | 10000003 |
protected coid Localize(string cultureNo)
重写OnPreRender方法,在OnPreRender方法中调用Localize方法,Localize遍历配置表中属于当前页面的控件,为每个控件都取出资源值并赋给相应属性,示例代码如下:
protected virtual void Localize(string cultureNo)
{
string fileName = System.IO.Path.GetFileName(this.Request.Path);
string pathName = MapPath(fileName + ".xml"); //配置文件
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(pathName);
XmlNode rootNode = xmlDoc.SelectSingleNode("Controls");
XmlNodeList controls = rootNode.SelectNodes("Control");
foreach (XmlNode node in controls)
{
string id = node.SelectSingleNode("ID").InnerText;
string property = node.SelectSingleNode("Property").InnerText;
string resId = node.SelectSingleNode("ResourceID").InnerText;
string resText = GetResText(cultureNo, resId); //读取资源
//通过反射赋值
Control ctrl = this.FindControl(id);
Type type = ctrl.GetType();
PropertyInfo propertyInfo = type.GetProperty(property);
propertyInfo.SetValue(ctrl, resText, null);
}
}
配置表的格式:
<?xml version="1.0" encoding="utf-8"?>
<Controls>
<Control>
<ID>btnOK</ID>
<Type>Button</Type>
<Property>Text</Property>
<ResourceID>10000001</ResourceID>
</Control>
<Control>
<ID>Literal1</ID>
<Type>Literal</Type>
<Property>Text</Property>
<ResourceID>10000002</ResourceID>
</Control>
<Control>
<ID>Label1</ID>
<Type>Label</Type>
<Property>Text</Property>
<ResourceID>10000003</ResourceID>
</Control>
<Control>
<ID>btnOK</ID>
<Type>Button</Type>
<Property>ToolTip</Property>
<ResourceID>10000001</ResourceID>
</Control>
</Controls>
优点:开发的时候不需要做任何操作,甚至不需要象方案一一样设置资源ID,只需要添加一张配置表即可让基类完成95%的情况,其余5%的情况通过重写Localize方法可以实现。
缺点:对于DataGrid等控件中的子控件,不能通过FindControls来找到。
相关文章推荐
- MFC多国语言界面的实现
- 界面的语言——图标与文案的二重奏
- VMware vSphere client 中英文语言界面设置
- 使用纯资源DLL文件实现多语言菜单、界面文字、Tooltips等[转]
- Android 微信分享操作后 在当前界面提示方案 解决
- 易语言之编译后图标模糊的处理方案
- Android切换系统语言,自动更新应用界面显示语言
- Exchange 2010 多语言环境界面设置~下篇
- VMware vSphere client 中英文语言界面设置方法
- 在桌面Linux环境下开发图形界面程序的方案对比
- CRuby作为嵌入式脚本语言fclose()错误的妥协方案
- go语言获取本地IP地址(图形界面)
- 【易语言界面开发系列教程之(EX_UI使用系列教程--EX组件(一键换肤))】
- MFC的多国语言界面的实现
- MFC的多国语言界面的实现 dialog multilanguage 基于对话框
- android多分辨率多密度下界面适配方案
- 1.Strut国际化完成语言切换:界面
- C# Winform软件多语言(汉语、英语。。。)界面的切换,低耦合
- NetBeans语言界面切换方法
- C#实现多国语言的界面切换