首先,我們使用visual studio express beta 1,創建一個新的web站點,使用vb.net語言,接著往窗體添加如下控件,如下圖:
![]() |
其中分別添加如下控件:一個label標簽,一個日歷控件,一個dropdownlist控件,一個button控件,而對于dropdownlist控件的設置采用如下方式:
·Text Value 目的
·English En-US 用英文顯示網頁
·Chinese Zh-CN 用中文顯示網頁
·Auto Select Auto 根據IE瀏覽器中的語言設置自動選擇頁面顯示的語言
接下來,我們可以開始設置資源文件了。由于我們的這個應用是一個多語言顯示的頁面,所以要分別設置對應的英語,中文資源文件。在visual studio 2005中,選擇工具菜單中的Generate Local Resource(產生資源文件),如下圖所示,
![]() |
當資源文件產生后,你會發現在解決方案管理器中,當前工程目錄下,有一個新的目錄文件夾,叫localresources。其中,default.aspx.resx這個資源文件,是default.aspx這個首頁文件要用到的資源文件(我們默認default.aspx是用英文顯示)。接下來,右鍵選定default.aspx.resx文件,在彈出的菜單中,選擇復制,然后再在localresources目錄下,選擇粘貼,這樣,就會復制一個新的資源文件,將其改名為:default.aspx.zh-CN.resx,這個將作為我們要用到的中文資源文件。
接下來,我們對資源文件進行編輯。比如打開資源文件default.aspx.zh-CN.resx,這時會看到如下圖的資源文件,我們可以對其中的中文資源文件進行編輯。
在asp.net 2.0中,只需要簡單在頁面aspx頭部的@page頁增加兩個新的屬性"Culture"和"UICultrue", 則WEB應用程序會自動在運行時,根據預先設定好的資源文件,自動顯示相應語言的頁面,如下面程序段所示:
<%@ Page Language="VB" Culture="auto" UICulture="auto" AutoEventWireup="false" CompileWith="Default.aspx.vb" ClassName="Default_aspx" meta:resourcekey="PageResource1" %> |
為了測試程序,打開IE瀏覽器,將語言設置選定為中文,運行程序,則可以看到,程序自動調用了中文資源文件,顯示出來的頁面語言是中文,而不是默認的英文(因為我們默認的default.aspx是調用英文資源文件的),如下圖:
![]() |
上面的程序中,我們只是利用了資源文件的特性而已,下面,我們將實現讓程序"記住"用戶每次選擇語言,就象google那樣,記住用戶每次的選擇后,下次用戶在瀏覽頁面時,就會使用該語言的頁面了。
首先,要實現這樣的功能,我們必須使用asp.net 2.0中新提供的profile功能。Profile可以利用數據庫存儲關于用戶的個性化信息,有點象session對象,但session對象是有生存期的,在生存期后,session對象自動失效了。而profile不同,除非顯式移除它。要實現profile功能,必須先在web.config中進行定義,如下:
<system.web> <profile> <properties> <add name="language" type="string"/> <group name="Info"> <add name="DateSelected" type="System.DateTime"/> <add name="LastModified" type="System.DateTime"/> </group> </properties> </profile> |
要使用profile屬性,可以這樣:
Profile.language = "en-US" Profile.Info.LastModified = Now Profile.Info.DateSelected = Calendar1.SelectedDate |
在web.congfig中,將會定義一些屬性/值,分別存貯將要保存的變量和值,比如lastmodified屬性,定義其值是datatime類型,如此類推。而<group>標簽,則是將一些相同或類似功能的變量值放在一起。在beta 1中,profile是利用access數據庫來保存這些值的。
我們為了要讓用戶每次在下拉框中選擇要用的語言,并將其保存起來,所以在提交按鈕中,寫入如下代碼:
Sub btnSet_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Profile.language = ddlLanguage.SelectedItem.Value End Sub |
而為了記錄用戶每次選擇日歷中的日期,我們則利用profile.info.dateselected屬性來記錄,并且用Profile.Info.LastModified記錄下用戶每次選擇日歷中日期時的時間,如下代碼:
Sub Calendar1_SelectionChanged(ByVal sender As Object, _ ByVal e As System.EventArgs) Profile.Info.DateSelected = Calendar1.SelectedDate Profile.Info.LastModified = Now End Sub |
當頁面加載時,我們可以取出預先保存在profile對象中的值,然后再在日歷控件中顯示上次用戶顯示的日期,以及用戶上次選擇日期時的時間。
Sub Page_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load Calendar1.SelectedDate = Profile.Info.DateSelected Response.Write("Date set on " Profile.Info.LastModified) End Sub |
而為了在每次頁面加載時,能根據之前用戶保存在profile對象中的語言正確顯示網頁,必須在page_preinit()事件中寫入如下代碼:
Dim lang As System.Globalization.CultureInfo '讀取用戶在下拉框中選取的語言值 Dim selectedLang As String = Request("ddlLanguage") '如果用戶選擇auto,則在下拉框中顯示AUTO的選擇項 If selectedLang = "Auto" Then ddlLanguage.SelectedIndex = 2 Exit Sub End If ' 如果是POSTBACK,則讀取原來已經保存的語言信息 If selectedLang IsNot Nothing Then lang = New System.Globalization.CultureInfo(selectedLang) Else '如果是第一次調用頁面 If Profile.language <> "Auto" Then lang = New System.Globalization.CultureInfo(Profile.language) Select Case Profile.language Case "en-US" : ddlLanguage.SelectedIndex = 0 Case "zh-CN" : ddlLanguage.SelectedIndex = 1 Case "auto" : ddlLanguage.SelectedIndex = 2 End Select Else '---if language is auto, then exit ddlLanguage.SelectedIndex = 2 Exit Sub End If End If System.Threading.Thread.CurrentThread.CurrentCulture = lang System.Threading.Thread.CurrentThread.CurrentUICulture = lang lblWelcomeMessage.Text = Resources.Resource.WelcomeMsg.ToString Page.Title = Resources.Resource.PageTitle.ToString lblSelectLanguage.Text = Resources.Resource.SelectLanguage.ToString |
下面來解釋一下代碼。首先,聲明一個cultureinfo類型的變量,這個變量將保存用戶每次選擇語言后的信息。
接下來,首先檢查頁面是否postback了,如果postback了(發生在頁面刷新或者點擊了控件,激發頁面事件后,這時用戶可能重新選擇一種語言了),則用下拉框中用戶選擇的語言去初始化cultureinfo
lang = New System.Globalization.CultureInfo(selectedLang) |
而如果頁面是第一次調用,則讀取原來profile對象中的語言信息,并根據其是什么語言,自動設置好下拉框中的對應顯示(使用case語句)。
最后,我們設置系統的當然線程的本地化語言為設定好的lang,并設置各個控件的值為資源文件中的值(以resources.resource.xxxx形式調用)。程序運行后,當用戶選擇英文時,如下圖所示:
![]() |
當用戶選擇中文提交時,程序運行如下圖所示:
![]() |
而實際上,asp.net 2.0之所以能實現上面的功能,實際上是利用在工程下data目錄下的一個叫aspnetdb的ACCESS數據庫來記錄的,打開其中的aspnet_profile表,就會發現其中記錄著用戶每次提交的信息。
總結:
在本文中,介紹了利用asp.net 2.0的profile功能,如何去實現本地語言個性化網頁應用。Profile功能利用了數據庫,記錄用戶每次提交的本地語言化信息,可以輕松進行讀取,從而實現個性化網頁。我們期待在visual studio 2005正式版中,profile功能能進一步加強。
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/