在實際的開發過程中,經常遇到這種情況:同一個網站,在不同的國家需要顯示不同的語言。在美國顯示英語,在中國顯示中文。下面就用幾個簡單的例子來說明ASP.NET提供的本地化支持。
楔子:
ASP.NET中的資源文件有兩種:一種是全局資源文件,放在App_GlobalResources目錄下,可以被站點中的任意頁面或者站點訪問;一種是局部資源文件,放在App_LocalResources目錄下,只能被一個特定的頁面訪問。 在下面的例子中會看到這兩種資源文件。
1. 對服務器控件應用本地化。
場景:
頁面上有一個按鈕,在美國讓它顯示"Read Me",在中國讓它顯示"讀我"
實施:
1.1. 拖一個按鈕到頁面上,設置它的Text屬性。
1.2. 選中按鈕,在菜單上選擇"Tools"->"Generate Local Resource".
(由於我用的是英文系統,如果你用的是中文系統,也在相應位置找到中文菜單)
點擊后,發現App_LocalResources文件夾和Default.aspx.resx被創建了。
這里創建的Default.aspx.resx就是一個局部資源文件,只能在Default.aspx的代碼中訪問,其他地方訪問不到。
打開Default.aspx.resx,可以看到里面已經自動創建了與我們這個按鈕相關的一些鍵值對。
將Default.aspx切換到代碼模式,發現與Resource相關的屬性已經被自動加上了。
1.3. 現在將Default.aspx.resx復制一份,重命名為Default.aspx.zh-CN.resx.
1.4. 打開Default.aspx.zh-CN.resx, 將里面Button1Resource1.Text的值改成中文。
運行結果:
在IE中瀏覽該頁面,由於我用的是英文系統,所以默認顯示是Read Me.
現在我來更改IE的語言,在IE菜單中,Tools->Internet Options->Languages, 將中文移動到第一位。
再次瀏覽這個網頁,發現按鈕的文字已經變成中文的了。
2. 本地化HTML內容。
場景:
在上面的例子中我們已經看到了如何對服務器控件進行本地化,那么如果有一段靜態的HTML內容,該如何對它進行本地化那?
比如,下面的一段HTML代碼,我點擊Tools->Generate Local Resource,沒有任何反應。
實施:
2.1. 將這段靜態HTML代碼用asp: Localize控件包起來,注意asp: Localize控件要有唯一的ID和runat="Server"屬性。
2.2. 現在在設計視圖中選擇該asp:Localize控件,然后點擊菜單中的Tools->Generate Local Resource. 就會發現代碼視圖中的標簽被改變了。
2.3 雙擊打開Default.aspx.resx, 發現對應的鍵值對已經對添加了。
2.4. 當然,對於Default.aspx.zh-CN.resx,我們需要手動添加一個同樣的鍵值對。
運行結果:
以下分別是IE語言設置為英文和中文時的執行結果:
3. 格式化Site Map.
場景:
網站有一個站點導航,用Site Map實現的,現在想要讓它也實現本地化。
以下是代碼結構:
實施:
3.1. 為Site Map創建兩個Resource文件。
由於Site Map是全局使用的,它對應的資源文件也是全局有效的,所以這兩個資源文件一定要放在App_GlobalResources文件夾下,而不是App_LocalResources,否則程序會報錯的。
3.2. 在兩個資源文件中分別添加英文和中文的鍵值對。
3.3. 為Web.sitemap添加本地化相關的屬性。
具體屬性有:
3.3.1. 為siteMap根節點添加enableLocalization="true"
3.3.2. 對於需要本地化輸出的字符串,用$resources:ClassName,KeyName,DefaultValue的形式指向資源文件。我們的例子中沒有指定默認值,如果想指定默認值,加個逗號,后面寫值就可以。
運行結果:
以下分別是英文和中文下的顯示結果:
4. 獲取資源文件鍵值對的幾種方式;
提問:
我創建了資源文件,在里面定義了一些鍵值對,有哪幾種方式可以獲取到資源文件里面的鍵值對那?
回答:
有如下的幾種方式:
4.1. 讀取全局資源
4.1.1.
4.1.2.
4.1.3.
4.2 讀取局部資源。
4.2.1.
4.2.2.
4.2.3.
5. 動態更改當前語言。
場景:
在上面的幾個例子中,當我們測試頁面的時候,都是手動更改IE的設置來選擇語言。那么通過程序怎么來做這件事情那?
實施:
下面通過一個例子來演示。
5.1. 首先創建一個ListBox和一個Button,用來向服務器端傳遞用戶選擇的語言。
5.2. 在服務器端重寫InitializeCulture方法,獲取用戶選擇,並且設置當前顯示語言。
運行結果:
選擇中文時:
選擇英文時: