資源檔說明:resourcefiles

來源:互聯網
上載者:User
<%@ 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" style="font-family:Verdana; font-size:8pt;"> <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" -->
 




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.