步行者

--勿在浮沙筑高台
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

注入式的界面多语言方案

Posted on 2008-09-07 12:14  Niels  阅读(224)  评论(0)    收藏  举报
 

添加一个如下的配置表:

控件类型

控件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来找到。