ASP.NET 实践:本地化网站地图的数据

开发者可以本地化网站地图中的下列属性:

  • Title

  • Description

  • 包含在 Attributes 集合中的自定义属性。

可以将这些属性值设置成显式表达式或隐式表达式以实现本地化。

使用显式表达式本地化网站地图节点的 TitleDescription 属性

  1. 设置网站地图的 EnableLocalization 属性的值为 true。比如,将 Web.sitemap 文件中的 <siteMap> 节点更改成这样:

    
    <siteMap enableLocalization="true">
    
    
  2. 在网站地图中更改需要本地化成资源串的属性值,如下例对大小写敏感的代码:

    
    $resources:ClassName,KeyName,DefaultValue
    
    

    比如,Web.sitemap 文件的节点可能是这样。

    
    <siteMapNode 
    
      url="~/Home.aspx" 
    
      title="$resources:SiteMapLocalizations,HomePageTitle"
    
      description="$resources:SiteMapLocalizations,HomePageDescription,Default description"
    
      myCustomAttribute="$resources: CustomLocalizations,MyCustomAttribute"
    
    />
    
    

    使用 HomePageTitleHomePageDescription 资源关键字从 SiteMapLocalizations.resx 文件中获取已被本地化的 titledescription。并从另一个名为 CustomLocalizations.resx 的资源文件中获取已被本地化的其他自定义参数。

  3. 在应用程序根目录下的 App_GlobalResources 目录中创建自定义 .resx 文件。在 .resx 文件中,部分属性值会使用关键字的 name 参数值作为索引。上例中的 SiteMapLocalizations.resx 文件可能是这样。

    
    <?xml version="1.0" encoding="utf-8"?>
    
    <root>
    
      <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    
        <xsd:element name="root" msdata:IsDataSet="true">
    
          <xsd:complexType>
    
            <xsd:choice maxOccurs="unbounded">
    
              <xsd:element name="metadata">
    
                <xsd:complexType>
    
                  <xsd:sequence>
    
                    <xsd:element name="value" type="xsd:string" minOccurs="0" />
    
                  </xsd:sequence>
    
                  <xsd:attribute name="name" type="xsd:string" />
    
                  <xsd:attribute name="type" type="xsd:string" />
    
                  <xsd:attribute name="mimetype" type="xsd:string" />
    
                </xsd:complexType>
    
              </xsd:element>
    
              <xsd:element name="assembly">
    
                <xsd:complexType>
    
                  <xsd:attribute name="alias" type="xsd:string" />
    
                  <xsd:attribute name="name" type="xsd:string" />
    
                </xsd:complexType>
    
              </xsd:element>
    
              <xsd:element name="data">
    
                <xsd:complexType>
    
                  <xsd:sequence>
    
                    <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
    
                    <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
    
                  </xsd:sequence>
    
                  <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
    
                  <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
    
                  <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
    
                </xsd:complexType>
    
              </xsd:element>
    
              <xsd:element name="resheader">
    
                <xsd:complexType>
    
                  <xsd:sequence>
    
                    <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
    
                  </xsd:sequence>
    
                  <xsd:attribute name="name" type="xsd:string" use="required" />
    
                </xsd:complexType>
    
              </xsd:element>
    
            </xsd:choice>
    
          </xsd:complexType>
    
        </xsd:element>
    
      </xsd:schema>
    
      <resheader name="resmimetype">
    
        <value>text/microsoft-resx</value>
    
      </resheader>
    
      <resheader name="version">
    
        <value>2.0</value>
    
      </resheader>
    
      <resheader name="reader">
    
        <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
    
      </resheader>
    
      <resheader name="writer">
    
        <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
    
      </resheader>
    
      <data name="HomePageTitle">
    
        <value xml:space="preserve">Home Page</value>
    
      </data>
    
      <data name="HomePageDescription">
    
        <value xml:space="preserve">Home page of site</value>
    
      </data>
    
    </root>
    
    
  4. 如果需要实现多种语言的本地化,就需要创建更多包含本地化信息的 .resx 文件。比如,资源文件的法语版本可能被命名为 SiteMapLocalizations.fr.resx。

使用隐式表达式本地化网站地图节点的 TitleDescription 属性

  1. 在网站地图中设置 EnableLocalization 属性的值为 true。比如,将 Web.sitemap 文件中的 <siteMap> 节点更改成这样:

    
    <siteMap enableLocalization="true">
    
    
  2. 在网站地图中为需要使用下例对大小写敏感的代码进行本地化的网站地图节点添加属性 resourceKey

    
    resourceKey="HomePage"
    
    

    比如,Web.sitemap 文件中的 <siteMap> 节点可能是这样:

    
    <siteMapNode 
    
      url="~/Home.aspx" 
    
      resourceKey="HomePage"
    
      title = "Default Title"   
    
      description = "Default Description" 
    
     />
    
    

    使用 HomePage.titleHomePage.description 资源关键字从文件中获取已被本地化的 titledescription

  3. 在应用程序根目录下的 App_GlobalResources 目录中创建自定义的 .resx 文件。在 .resx 文件中,不同的属性值分别由 name 参数进行索引。

    提示:全局资源文件中的关键字名称不能够包含句号(.)。但是,句号的使用在全局资源文件中使用隐式表达式引用网站地图文件的时候却是必不可必的。原因就是这是 resourceKey 参数的标准语法。比如,在某些代码编辑环境中(如 Visual Web Developer),开发者在 关键字名称中使用句号时会产生一个设计时错误。但是,这个错误能够被忽略,也不会影响到文件的编辑或保存。

    
    <?xml version="1.0" encoding="utf-8"?>
    
    <root>
    
      <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    
        <xsd:element name="root" msdata:IsDataSet="true">
    
          <xsd:complexType>
    
            <xsd:choice maxOccurs="unbounded">
    
              <xsd:element name="metadata">
    
                <xsd:complexType>
    
                  <xsd:sequence>
    
                    <xsd:element name="value" type="xsd:string" minOccurs="0" />
    
                  </xsd:sequence>
    
                  <xsd:attribute name="name" type="xsd:string" />
    
                  <xsd:attribute name="type" type="xsd:string" />
    
                  <xsd:attribute name="mimetype" type="xsd:string" />
    
                </xsd:complexType>
    
              </xsd:element>
    
              <xsd:element name="assembly">
    
                <xsd:complexType>
    
                  <xsd:attribute name="alias" type="xsd:string" />
    
                  <xsd:attribute name="name" type="xsd:string" />
    
                </xsd:complexType>
    
              </xsd:element>
    
              <xsd:element name="data">
    
                <xsd:complexType>
    
                  <xsd:sequence>
    
                    <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
    
                    <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
    
                  </xsd:sequence>
    
                  <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
    
                  <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
    
                  <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
    
                </xsd:complexType>
    
              </xsd:element>
    
              <xsd:element name="resheader">
    
                <xsd:complexType>
    
                  <xsd:sequence>
    
                    <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
    
                  </xsd:sequence>
    
                  <xsd:attribute name="name" type="xsd:string" use="required" />
    
                </xsd:complexType>
    
              </xsd:element>
    
            </xsd:choice>
    
          </xsd:complexType>
    
        </xsd:element>
    
      </xsd:schema>
    
      <resheader name="resmimetype">
    
        <value>text/microsoft-resx</value>
    
      </resheader>
    
      <resheader name="version">
    
        <value>2.0</value>
    
      </resheader>
    
      <resheader name="reader">
    
        <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
    
      </resheader>
    
      <resheader name="writer">
    
        <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
    
      </resheader>
    
      <data name="HomePage.description">
    
        <value xml:space="preserve">Home Page Description</value>
    
      </data>
    
      <data name="HomePage.Text">
    
        <value xml:space="preserve">Home Page Text from Resource File</value>
    
      </data>
    
      <data name="HomePage.title">
    
        <value xml:space="preserve">Home Page Title from Resource File</value>
    
      </data>
    
      <assembly alias="mscorlib" name="mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    
      <data name="LabelResource1.Visible" type="System.Boolean, mscorlib">
    
        <value>True</value>
    
      </data>
    
    </root>
    
    
  4. 如果需要实现多种语言的本地化,就需要创建更多包含本地化信息的 .resx 文件。比如,资源文件的法语版本可能被命名为 Web.sitemap.fr.resx。

本地化网站地图中的 URL 属性

Url 属性与 TitleDescription 属性不一样,因为它无法在网站地图中进行本地化。

根据用户所在的位置来定义不同版本的导航结构
  1. 为不同的地区定义不同的网站地图文件。

  2. 在 Web.config 文件中引用各种语言版本的网站地图文件。

  3. 在运行时通过编程可以根据需要进行 Provider 的切换。可以通过将 SiteMapDataSource 对象的 SitemapProvider 属性或 SiteMapPath 对象的 SiteMapProvider 属性值设置成提供者的名称来完成该操作。

编写健壮的代码

显式表达式和隐式表达式不能同时使用在同一个网站地图文件中。

你可能感兴趣的:(asp.net)