在 ASP.NET 2.0 中要建置多語系的網站,比過去實在簡單多了!以下就以建置一個同時可以辨視正體中文、簡體中文和英文三種文化的網站做為範例...
在 ASP.NET 2.0 中要建置多語系的網站,比過去實在簡單多了!以下就以建置一個同時可以辨視正體中文、簡體中文和英文三種文化的網站做為範例。
首先,請在網站中加入一個 ASP.NET 資料夾 > App_GlobalResources,然後在這個資料夾裡面加入一個資源檔,命名為 AppResource.resx。在這個資源檔中加入一個項目,名稱為 Greeting,值為 Hello。
現在將這個資源檔在原地複製兩份,並分別改名為 AppResource.zh-CHT.resx 和 AppResource.zh-CHS.resx。請注意,你的資源檔並不一定要取名為 AppResource.resx,但是不管取名做什麼,例如叫做 abc.resx 好了,這後面兩個檔案一定要取名做 abc.zh-CHT.resx 和 abc.zh-CHS.resx。這裡的 zh-CHT 和 zh-CHS 是對應到電腦裡面正體中文和簡體中文的文化名稱(Culture Name),如果取錯名字,就看不到效果了。關於如何取出電腦中有什麼 Culture 設定,可以參考「條列 CultureInfo 以及 Region 等資訊」這一篇文章。
由於台灣、香港和澳門都使用繁體中文,而中國和新加坡使用簡體中文,所以也請你現在不要自作聰明的使用像 zh-TW 或 zh-CN 這種指定特定文化(Specific Culture)的 Culture Name,那只會讓你發生預期外的結果而已。zh-CHT 和 zh-CHS 是 Neutral Culture,應該使用這一種。
請把上面 AppResource.zh-CHT.resx 資源檔的內容修改一下,將它的值從 Hello 改成「您好」。再把 AppResource.zh-CHS.resx 的值改成「Ni Hao」。
到這裡為止,多語系資源檔已經建立好了。現在請建立一個新的網頁,並從工具箱拉一個 Label 控制項到網頁裡面。
指換到原始檔畫面,把 Label 控制項改成如下:
<asp:Label ID="Label1" runat="server" Text="<%$ Resources:AppResource, Greeting %>"></asp:Label>
OK,如果有人使用英文語系進來瀏覽這個網頁的話,網頁會去抓 AppResource.resx 這個資源檔裡面的 Greeting 字串的值,丟給 Label 去顯示。對於使用正體中文的使用者,則會抓 Appresource.zh-CHT.resx 的值,依此類推。
對於其它的語系,也都使用相同的做法。
以上是使用明確(Explicit)套用某一資源項目的做法,另外有使用隱含(Implicit)套用的做法,我會另找機會介紹。
以下我要來示範如何使用 Menu 控制項或 TreeView 控制項如何達到多語系的效果。
其實無論是 TreeView 或是 Menu,甚至是 Navigation,它們都依賴 Web.Sitemap。所以答案很簡單,改這個檔案就對了。不過也不是那麼簡單。
首先,請在 App_GlobalResources 資料夾中建立一個資源檔案,取名為 Web.Sitemap.resx。然後加入一個項目,其名稱為 Home.title,值為 Home。接著,複製成 Web.Sitemap.zh-CHT.rsx 和 Web.Sitemap.zh-CHS.resx,分別將值改為「首頁」和「ShoYe」。
(我知道簡體字的您好和首頁不是長那個樣子,我這麼打只是不想破壞本文的編碼,並增加可讀性而已)
還沒完。請修改 Web.Sitemap 成如下的樣子:
<?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" enableLocalization="true" > <siteMapNode> <siteMapNode url="~/Default.aspx" resourceKey="Home" /> </siteMapNode> </siteMap>
一定要記得將 enableLocalization 為 True,否則不會生效。此外,由於 resourceKey 的值設為 Home,所以它會到對應的資源檔抓到 Home.title 做為該 siteMapNote 的 title 的值和 Home.description 等。可惜 url 並不能比照辦理,但是有變通的方法 - 你可以試試在某一特定源檔將例如 Home.title 的值設為空白,那麼在那個語言中,就不會出現該項目。