<% Register TagPrefix="Acme" TagName="SourceRef" Src="/quickstart/aspplus/util/SrcRef.ascx"%>

<!-- #in">

资源文件说明:resourcefiles

80酷酷网    80kuku.com

  <% 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" font-size:8pt;"> <b> <img align="middle" src="http://edu.cnzz.cn/quickstart/images/bullet.gif">  </b><a class="toc2" 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-->
<a name="satellite">
<span class="subhead">使用附属程序集</span>
<p>

查看前一节示例中的目录结构,可以发现示例的资源不是从 DLL 加载的,而是从 .resource 文件加载。 尽管这确实是一种解决方案,但还可以将代码编译为附属程序集。 根据定义,附属程序集是仅包含资源、不包含可执行代码的程序集。 有关附属程序集的更多信息,请参阅<A <% 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-->
<a name="satellitecont">
<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" -->
 


分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: