现在的位置: 首页 > 综合 > 正文

App_GlobalResources:App_LocalResources

2013年05月19日 ⁄ 综合 ⁄ 共 4712字 ⁄ 字号 评论关闭

如果您创建的网页将由使用不同语言的用户阅读,则必须为这些读者提供用他们自己的语言查看网页的方法。一种方法是分别用各语言重新创建页面,但这种方法可能需要大量工作量、容易出错并且在更改原始页时很难维护。 ASP.NET 为您提供了一种方法,使用这种方法创建的页可以根据浏览器的首选语言设置或用户显式选择的语言获取内容和其他数据。内容和其他数据指的就是资源,此类数据可以存储在资源文件或其他源中。 

资源文件

在.net开发中资源文件是 XML 文件,其中包含要转换为不同语言或图像路径的字符串。资源文件包含键/值对,每一对都是一个单独的资源。键名不区分大小写。

 

 

NOTE: 虽然资源可以保护图片、音频等格式的文件,但需要注意的是在资源文件中只保存键/值对,由它指向特定的资源。

<data name="Image1" type="System.Resources.ResXFileRef, System.Windows.Forms">    <value>../Resources/Image1.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value></data>

<data name="URL" xml:space="preserve">    <value>www.cnbooku.com</value> </data>    

        ASP.NET 中的资源文件具有 .resx 扩展名。在运行时,.resx 文件将编译进一个程序集内,该程序集有时称为附属程序集。由于 .resx 文件是用与 ASP.NET 网页相同的方式动态编译的,因此不必创建资源程序集。编译过程将多个语言类似的资源文件压缩在同一程序集内。 您需要为每种语言(如英语和法语)或每种语言和区域性(如英语 [英国]、英语 [美国])分别创建一个资源文件。每个本地化资源文件都有相同的键/值对;

    本地化资源文件与默认资源文件的唯一区别就是前者所包含的资源可能少于后者。然后,语言回退处理非特定资源或默认资源的加载。 在创建资源文件时,首先开始创建基文件 .resx。对于要支持的每种语言,分别创建一个新文件,该文件具有同一基本文件名但包含语言或语言及区域性(区域性名称)。 

AppFolder_labels.resx 基资源文件。该文件是默认或后备资源文件,也就是说如果找不到指定的区域文件则默认加载基资源文件。

AppFolder_labels.en-us.resx 美国英语的资源文件。

AppFolder_labels.zh-cn.resx 简体中文的资源文件。

AppFolder_labels.de.resx 德语的资源文件。 

在运行时,ASP.NET 使用与 CurrentUICulture 属性的设置最为匹配的资源文件。线程的 UI 区域性根据页的 UI 区域性进行设置。例如,如果当前的 UI 区域性是德语,则 ASP.NET 使用 AppFolder_labels.de.resx 文件的已编译版本。如果当前的 UI 区域性没有匹配项,则 ASP.NET 会使用资源后备;首先用特定区域性的资源,接着用非特定区域性,最后用默认资源文件。在本例中,默认资源文件是 AppFolder_labels.resx

 

 

 为 ASP.NET 网站创建资源文件   

   在 ASP.NET 中,可以创建具有不同范围的资源文件。可以创建全局资源文件,这意味着可以从位于网站中的任意页或代码读取这些资源文件。也可以创建本地资源文件,这些文件存储单个 ASP.NET 网页(.aspx 文件)的资源。 

全局资源文件

    将资源文件放入应用程序根目录的保留文件夹 App_GlobalResources 中,即可创建全局资源文件。App_GlobalResources 文件夹中的任何 .resx 文件都具有全局范围。此外,ASP.NET 还生成了一个强类型对象,这为开发人员提供了一种以编程方式访问全局资源的简单方法。如果在上面的资源文件中创建字符资源 key = URL_BAODR 则在代码中可以如下法调用。

        Resources.AppFolder_labels.URL_BAODR 其中 Resources 是ASP.NET 资源文件的名称空间, AppFolder_labels 是 ASP.NET 自动根据资源文件创建的类, URL_BAODR 是key名表现为类中的属性。 

本地资源文件

    本地资源文件是只应用于一个 ASP.NET 页的文件(带有 .aspx、.ascx、.master 等扩展名的 ASP.NET 页)。本地资源文件所放入的文件夹具有 App_LocalResources 保留名称。App_LocalResources 文件夹可以存在于应用程序的任何文件夹中,这与 App_GlobalResources 根文件夹不同。通过资源文件名将一组资源文件与特定的网页相关联。  例如,如果在 App_LocalResources 文件夹中有一个名为 Default.aspx 的页,则可以创建下列文件: 

Default.aspx.resx 默认的本地资源文件,如果找不到语言匹配项,则该文件为后备资源文件。

Default.aspx.es.resx 西班牙语的资源文件,不包含区域性信息。

Default.aspx.es-mx.resx专用于西班牙语(墨西哥)的资源文件。

        文件的基名称与页文件名相同,后跟语言和区域性名称,最后以扩展名 .resx 结尾。 

在全局和本地资源文件之间选择

   在 Web 应用程序中,可以任意组合使用全局和本地资源文件。通常情况下,当您希望在各页之间共享资源时,应向全局资源文件添加这些资源。全局资源文件中的资源还是强类型的,用于以编程方式访问。

    缺点是:但如果将所有本地化资源都存储在全局资源文件中,则这些文件会变得很大。此外,如果多个开发人员要处理不同的页但在同一个资源文件中工作时,全局资源文件也会更难于管理。

     本地资源文件使得单个 ASP.NET 网页的资源比较容易管理,但您不能在各页之间共享资源。此外,如果有许多页必须本地化为多种语言,则可能会创建大量本地资源文件。如果站点是具有许多文件夹和使用多种语言的大型站点,则使用本地资源可能快速地在应用程序域中扩展程序集的数量。

    在对默认资源文件进行更改时,无论它是本地资源文件还是全局资源文件,ASP.NET 都重新编译资源并重新启动 ASP.NET 应用程序,这可能会影响站点的整体性能。添加附属资源文件将不会导致重新编译资源,但 ASP.NET 应用程序仍将重新启动。 

注意:只有全局资源文件支持链接资源。

 

Asp.net多语言中的App_GlobalResources和LocalResources文件夹区别

App_GlobalResources的文件是全局文件资源,可以在任何页面通过Resources直接使用这里面的资源文件。示例如下:

1、在App_GlobalResources中增加一个文件叫做ResourceTest.resx

2、在ResourceTest.resx中增加两个项 PageTitle 值为“中国加油!” LabelText 值为“奥运顺利!”

3、打开aspx页面的,然后在Page_Load方法中可以直接这样使用

protected void Page_Load(object sender, EventArgs e)
       {
           this.Title = Resources.ResourceTest.PageTitle;
           Label1.Text = Resources.ResourceTest.LabelText;
       }

这里的ResouceTest就是那个资源文件的文件名,在VS中,可以自动感知出ResourceTest。

直接在页面的控件中的使用方法是:

<asp:Label ID="Label1" runat="server" Text="<%$Resources:ResourceTest,LabelText %>" ></asp:Label>

如果使用这种方式绑定了App_GlobalResources,那么就不能再绑定App_LocalResources中的资源文件了

如果要支持英文,就在App_GlobalResources中增加一个文件,文件命名格式是:ResourcesTest.en-us.resx,在页面的使用方式不变。当你用浏览器访问时,系统会自动侦测出你的浏览器设置的默认语言,然后自动调用不同的资源包来呈现出来。

除了上面所谈到的方式可以直接使用资源包,还可以通过HttpContext.GetGlobalResourcesObject来获取资源包的内容。

HttpContext.GetGlobalResourceObject(resxFile, MyResName)

HttpContext.GetGlobalResourceObject(resxFile, MyResName,CurrentCulture)这个方法第一个参数是资源文件名,第二个参数是要检索的键值。调用例子为:

string GetGlobalResources(string resxFile,string resxKey)

{

string resxValue=(string)HttpContext.GetGlobalResourceObject(resxFile, resxKey)

if(string.IsNullOrEmpty(resxValue)

{

return string.Empty;

}

return resxValue;

}

App_LocalResources文件夹,这个文件夹中放的是页面的资源文件,这些资源文件和每个Aspx页面对应。比如我在网站项目下添加了一个Default.aspx文件,在设计VS的模式下,选择工具“生成本地资源” 就会自动在App_LocalResources中生成一个名字为Default.aspx.resx的资源文件。

编程访问的方式是:

HttpContext.GetLocalResourceObject("resxFile","resxKey")

直接在控件中的访问方式:

<asp:Label ID="Label1" runat="server" meta.:resourcekey="LabelText"></asp:Label>

 

怎样读取App_LocalResources里某一资源文件的所有key,value值?   

public static void Main()
{
// Create a ResourceReader for the file items.resources.
ResourceReader rr = new ResourceReader("items.resources");

// Create an IDictionaryEnumerator to iterate through the resources.
IDictionaryEnumerator id = rr.GetEnumerator();

// Iterate through the resources and display the contents to the console.
while(id.MoveNext())
Console.WriteLine("/n[{0}] /t{1}", id.Key, id.Value);

rr.Close();

}  

抱歉!评论已关闭.