您的位置:首页 > 其它

注入式的界面多语言方案

2008-09-07 12:14 134 查看
添加一个如下的配置表:

控件类型

控件ID

控件属性

资源ID

Literal

ltUserName

Text

10000001

Button

btnSave

Text

10000002

Button

btnSave

ToolTip

10000003

在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来找到。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: