首页 > 开发 > 综合 > 正文

资源文件说明:resourcefiles

2024-07-21 02:28:04
字体:
来源:转载
供稿:网友
中国最大的web开发资源网站及技术社区,
<%@ register tagprefix="acme" namespace="acme" assembly="qstools" %>
<%@ register tagprefix="acme" tagname="sourceref" src="/quickstart/aspplus/util/srcref.ascx"%>

<!-- #include virtual="/quickstart/aspplus/include/header.inc" -->

<h4>使用资源文件</h4>


<div class="indent" > <b> <img align="middle" src="http://edu.cnzz.cn/quickstart/images/bullet.gif">  </b><a class="toc2" href="#create">创建资源</a><br> <b> <img align="middle" src="http://edu.cnzz.cn/quickstart/images/bullet.gif">  </b><a class="toc2" href="#useresource">使用页上的资源</a><br> <b> <img align="middle" src="http://edu.cnzz.cn/quickstart/images/bullet.gif">  </b><a class="toc2" href="#satellite">使用附属程序集</a><br> <b> <img align="middle" src="http://edu.cnzz.cn/quickstart/images/bullet.gif">  </b><a class="toc2" href="#satellitecont">对控件使用附属程序集</a><br> <b> <img align="middle" src="http://edu.cnzz.cn/quickstart/images/bullet.gif">  </b><a class="toc2" href="#summary">本节小结</a><br>
</div>
<p>
<hr>



<!--begin section--> <a name="create"> <span class="subhead">创建资源</span>
<p>

资源管理是 .net 框架类库的一个功能,可用于从源代码中提取可本地化的元素,并将它们与字符串键一起存储为资源。 运行时,可使用 <b>resourcemanager</b> 类的一个实例将键解析为原始资源或本地化版本。 资源可存储为独立(“松散”)文件,或程序集的一部分。
<p> asp.net 页可使用资源文件;另外,已编译的代码隐藏控件可以使用嵌入或链接到它们的程序集中的资源。
<p>

可使用 <b>resourcewriter</b> 类以编程方式创建资源,或使用工具 resgen.exe 创建资源。resgen.exe 可使用简单的“键=值”格式作为输入,或使用 .resx 格式的 xml 文件。
<div class="code"><xmp> ; ; lines beginning with a semicolon can be used for comments. ;

[strings] greeting=welcome ! more=read more ... ... </xmp></div>

<b>resourcewriter</b> 和 resgen.exe 创建一个 .resources 文件,该文件可单独使用,也可用作程序集的一部分。 若要在程序集中包括 .resources 文件,请使用相关的编译器开关或 al.exe 工具。 仅包含本地化资源、不包含代码的程序集称为附属程序集。



<!--begin section--> <br> <a name="useresource"> <br> <span class="subhead">使用页上的资源</span>
<p>

下面的示例仅实现一个 .aspx 页,该页为每个请求都被本地化。 支持的语言是英语、德语和日语。 确定语言的方法是检查 global.asax 文件中 http 标头的 <b>content-language</b> 字段。 该字段的内容可通过 <b>userlanguages</b> 集合访问:
<p>

<p><acme:tabcontrol runat="server">
<tab name="c#"> thread.currentthread.currentculture = new cultureinfo(request.userlanguages[0]);
</tab>

<tab name="vb"> thread.currentthread.currentculture = new cultureinfo(request.userlanguages(0))
</tab>

<tab name="jscript"> thread.currentthread.currentculture = new cultureinfo(request.userlanguages[0]);
</tab>

</acme:tabcontrol><p>

若要更改初始语言设置,可使用以不同的方式本地化的客户端,或更改浏览器上的语言设置。 例如,对于 internet explorer 5.x,从菜单中选择<b>工具</b>-><b>internet 选项</b>并单击底部的<b>语言</b>按钮。 在接下来的对话框中,可以添加其他语言,并定义它们的优先级。 为简单起见,示例总是选择第一项。
<p> 页第一次加载后,用户可在下拉列表控件 <b>myuiculture</b> 中选择其他区域性。 如果选定的区域性有效,此值将重写从 <b>userlanguages</b> 获得的设置:

<p><acme:tabcontrol runat="server">
<tab name="c#"> string selectedculture = myuiculture.selecteditem.text; if(! selectedculture.startswith("choose")) { // if another culture was selected, use that instead. thread.currentthread.currentculture = new cultureinfo(selectedculture); thread.currentthread.currentuiculture = new cultureinfo(selectedculture); }
</tab>

<tab name="vb"> dim selectedculture as string = myuiculture.selecteditem.text if not(selectedculture.startswith("choose")) then ' if another culture was selected, use that instead. thread.currentthread.currentculture = new cultureinfo(selectedculture) thread.currentthread.currentuiculture = new cultureinfo(selectedculture) end if
</tab>

<tab name="jscript"> var selectedculture:string = myuiculture.selecteditem.text; if(! selectedculture.startswith("choose")) { // if another culture was selected, use that instead. thread.currentthread.currentculture = new cultureinfo(selectedculture); thread.currentthread.currentuiculture = new cultureinfo(selectedculture); }
</tab>

</acme:tabcontrol><p>

<p> 同样,在 global.asax 文件中,将用应用程序范围初始化 <b>resourcemanager</b> 实例。 这样,资源对每个应用程序仅加载一次。 因为资源是只读的,因此不会发生锁争用。
<p><acme:tabcontrol runat="server">
<tab name="c#"> public void application_start() { application["rm"] = new resourcemanager("articles", server.mappath("resources") + environment.directoryseparatorchar, null); }
</tab>

<tab name="vb"> public sub application_start() application("rm") = new resourcemanager("articles", _ server.mappath("resources") + environment.directoryseparatorchar, _ nothing) end sub
</tab>

<tab name="jscript"> public function application_start() : void { application["rm"] = new resourcemanager("articles", server.mappath("resources") + environment.directoryseparatorchar, null); }
</tab>

</acme:tabcontrol><p>

<p>

于是就可以在页上轻松地使用资源管理器。 问候字符串仅本地化为:
<div class="code"><pre> <%=rm.getstring("greeting")%>
</pre></div>

<table><tr>
<td>
<acme:sourceref
  viewsource="/quickstart/aspplus/samples/localize/resources/news/global_asax.src"
  icon="/quickstart/images/genicon.gif"
  caption="global.asax"
  runat="server" />
</td>
<td>
<acme:langswitch runat="server">
  <cstemplate>
<acme:sourceref
  runsample="/quickstart/aspplus/samples/localize/resources/news/cs/news.aspx"
  viewsource="/quickstart/aspplus/samples/localize/resources/news/news.src"
  icon="/quickstart/aspplus/images/resources2.gif"
  caption="c# news.aspx"
  runat="server" />
  </cstemplate>
  <vbtemplate>
<acme:sourceref
  runsample="/quickstart/aspplus/samples/localize/resources/news/vb/news.aspx"
  viewsource="/quickstart/aspplus/samples/localize/resources/news/news.src"
  icon="/quickstart/aspplus/images/resources2.gif"
  caption="vb news.aspx"
  runat="server" />
  </vbtemplate>
  <jstemplate>
<acme:sourceref
  runsample="/quickstart/aspplus/samples/localize/resources/news/js/news.aspx"
  viewsource="/quickstart/aspplus/samples/localize/resources/news/news.src"
  icon="/quickstart/aspplus/images/resources2.gif"
  caption="jscript news.aspx"
  runat="server" />
  </jstemplate>
</acme:langswitch>
</td>
</tr></table>

<!--begin section--> <br> <a name="satellite"> <br> <span class="subhead">使用附属程序集</span>
<p>

查看前一节示例中的目录结构,可以发现示例的资源不是从 dll 加载的,而是从 .resource 文件加载。 尽管这确实是一种解决方案,但还可以将代码编译为附属程序集。 根据定义,附属程序集是仅包含资源、不包含可执行代码的程序集。 有关附属程序集的更多信息,请参阅<a href="/quickstart/howto/doc/createresources.aspx">如何... 创建资源? </a>一节。<p> .resources 文件由于不是 dll 而不是影像复制的,因此 web 站点在使用它们时可能会遇到锁定问题。认识到这一点,使用附属程序集的优点就变得十分明显了。 另一种方法是使用应用程序资源的并行主程序集。  主程序集包含可依靠的资源;附属程序集(每区域性一个)包含本地化资源。 主程序集安装在 /bin 目录中,而附属程序集存储在普通的 xx-xx 子目录下(请参阅<a href="/quickstart/howto/doc/createresources.aspx">如何... 创建资源? </a>)。作为程序集,它们是影像复制的,而且不会被锁定。 若要创建程序集识别的 .asp 应用程序:
<p>

<ol>
<li>创建资源 dll 并将其复制到 /bin 目录中。例如:<p> resgen qq.txt qq.resources<br> al /embed:qq.resources, qq.resources, y /out:qq.dll<p> “y”指示 blob 是否应对其他程序集可见。  由于 <b>resourcemanager</b> 位于 mscorlib 中而且是一个不同于“qq”的程序集,因此 .resources 文件必须是公共可见的。  “y”指示这是否应是公共的。<p>
<li>在页上包括以下语句。 注意,此处的程序集名称位于在 mscorlib 中定义的 <b>system.reflection</b> 命名空间中(编译时总要引用它):
<p><acme:tabcontrol runat="server">
<tab name="c#"> <% assembly a = assembly.load("qq"); resourcemanager rm = new resourcemanager("qq", a); response.write(rm.getstring("key")); %>
</tab>
<tab name="vb"> <% dim a as assembly = assembly.load("qq") dim rm as resourcemanager = new resourcemanager("qq", a) response.write(rm.getstring("key")) %>
</tab>
<tab name="jscript"> <% var a:assembly = assembly.load("qq"); var rm:resourcemanager = new resourcemanager("qq", a); response.write(rm.getstring("key")); %>
</tab>
</acme:tabcontrol>
<p>
<li>将每个附属资源编译到各自的程序集中,并将其放入 /bin 目录中所需的正确目录结构中:<p>

        al /embed:qq.en-us.resources,qq.en-us.resources, y /out:qq.resources.dll /c:en-us<p>

        将代码替换为正在将 <i>en-us</i> 本地化到的区域性。 记住,<b>/c:</b> 标记是区域性说明符。
</ol> 将 dll 放置到正确的位置(上例中的 /bin 和 /bin/en-us)后,即可适当地检索资源。 注意,一切都通过程序集缓存得到影像复制,因此是可替换的,从而避免了潜在的锁定情况。
<p>

<!--begin section--> <br> <a name="satellitecont"> <br> <span class="subhead">对控件使用附属程序集</span>
<p>

已编译的代码隐藏控件还可使用附属程序集提供本地化内容。 从部署的角度看,这尤其是一件好事,因为附属程序集对代码可以是与版本无关的。 因此,只需将附属程序集的模块复制到服务器,即可提供对附加语言的支持,而不需要进行代码更改。<p>

下面的示例包含程序集 <b>localizedcontrols</b>(模块 localizedcontrols.dll)中的 <b>localizedbutton</b> 控件。 编译控件在页 showcontrols.aspx 上注册并在稍后使用:

<div class="code"><pre> <%@register tagprefix="loc" namespace="localizedcontrols" %> ... <loc:localizedbutton runat="server" text="ok" />
</pre></div>

<p> <b>localizedbutton</b> 控件存储 <b>resourcemanager</b> 实例,该实例由 <b>localizedbutton</b> 的所有实例共享。 每当呈现一个控件时,<b>text</b> 属性的值便由本地化版本替换:

<p><acme:tabcontrol runat="server">
<tab name="c#"> _rm = new resourcemanager("localizedstrings", assembly.getexecutingassembly(), null, true ); ... override protected void render(htmltextwriter writer) { text = resourcefactory.rmanager.getstring(text); base.render(writer); }
</tab>

<tab name="vb"> _rm = new resourcemanager("localizedstrings", _ assembly.getexecutingassembly(), _ nothing, _ true ) ... overrides protected sub render (writer as htmltextwriter) text = resourcefactory.rmanager.getstring(text) base.render(writer) end sub
</tab>

<tab name="jscript"> _rm = new resourcemanager("localizedstrings", assembly.getexecutingassembly(), null, true ); ... override protected function render(writer:htmltextwriter) : void { text = resourcefactory.rmanager.getstring(text); base.render(writer); }
</tab>

</acme:tabcontrol><p>

<b>resourcemanager</b> 实例负责将键解析为本地化资源。 如果具有正确区域性的附属程序集不可用,并且找不到相关的区域性,则使用主程序集的非特定语言资源(“en-us”<nobr>-></nobr>“en”<nobr>-></nobr>“非特定语言”)。 只需将新附属程序集的模块文件复制到适当的位置,即可提供另一种语言支持。
<p>

<table><tr>
<td>
<acme:sourceref
  viewsource="/quickstart/aspplus/samples/localize/resources/controls/controls.src"
  icon="/quickstart/images/genicon.gif"
  caption="localized controls"
  runat="server" />
</td>
<td>
<acme:langswitch runat="server">
  <cstemplate>
<acme:sourceref
  runsample="/quickstart/aspplus/samples/localize/resources/showcontrols/cs/showcontrols.aspx"
  viewsource="/quickstart/aspplus/samples/localize/resources/showcontrols/showcontrols.src"
  icon="/quickstart/aspplus/images/resources1.gif"
  caption="c# using localized controls"
  runat="server" />
  </cstemplate>
  <vbtemplate>
<acme:sourceref
  runsample="/quickstart/aspplus/samples/localize/resources/showcontrols/vb/showcontrols.aspx"
  viewsource="/quickstart/aspplus/samples/localize/resources/showcontrols/showcontrols.src"
  icon="/quickstart/aspplus/images/resources1.gif"
  caption="vb using localized controls"
  runat="server" />
  </vbtemplate>
  <jstemplate>
<acme:sourceref
  runsample="/quickstart/aspplus/samples/localize/resources/showcontrols/js/showcontrols.aspx"
  viewsource="/quickstart/aspplus/samples/localize/resources/showcontrols/showcontrols.src"
  icon="/quickstart/aspplus/images/resources1.gif"
  caption="jscript using localized controls"
  runat="server" />
  </jstemplate>
</acme:langswitch>
</td>
</tr></table>

<p>


<h4><a name="summary">本节小结</a></h4>
<ol>
<li>asp.net 页可使用资源类将资源中可本地化的内容分离出来,这部分内容在运行时被选定。
<li>另一个好办法是使用附属程序集而不是中间的 .resources 文件加载资源,因为这样可避免锁定问题。
<li>已编译控件可包含它们自己的资源,并将根据宿主页的 <b>uiculture</b> 来选择正确的本地化内容。
</ol>


<!-- #include virtual="/quickstart/aspplus/include/footer.inc" -->
 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表