如果我們想製作一個多語系網站,當然我們可以採用 ASP.NET 2.0 所提供的內建功能,讓客戶能夠藉由在瀏覽器設定中選擇語系的方法自動套用。可是,如果你希望客戶可以直接在網頁上選擇語系而不是從瀏覽器中設定,你又該如何做呢...
如果我們想製作一個多語系網站,當然我們可以採用 ASP.NET 2.0 所提供的內建功能,讓客戶能夠藉由在瀏覽器設定中選擇語系的方法自動套用(請參考[Globalization] 多語系網站建置計畫、[Globalization] 取出網頁優先使用語系和[Globalization] 在 .aspx 畫面中嵌入多語系文字等文章)。
可是,如果你希望客戶可以直接在網頁上選擇語系而不是從瀏覽器中設定,你又該如何做呢?
這個答案並不是太容易,但也不太難。你只需在 Global.asax 中撰寫如下的程式碼即可:
Protected Sub Application_BeginRequest(ByVal sender As Object, ByVal e As System.EventArgs)
If Request.Cookies(cookieToken) IsNot Nothing Then
Dim lang As String = Request.Cookies(cookieToken).Value
Select Case lang
Case "zh-CHT"
System.Threading.Thread.CurrentThread.CurrentUICulture = New System.Globalization.CultureInfo("zh-CHT")
Case "zh-CHS"
System.Threading.Thread.CurrentThread.CurrentUICulture = New System.Globalization.CultureInfo("zh-CHS")
...
End Select
End If
End Sub
程式的重點就在 System.Threading.Thread.CurrentThread.CurrentUICulture = New System.Globalization.CultureInfo("zh-CHT") 這一段指令。不過請記得,你必須寫在 Global.asax 檔案中,而不能寫在網頁中(你如果勇於嘗試的話,也不妨自己試試看。不過我個人已經試過多種方法都無法成功)。
除了寫在 Global.asax 之外,你也可以寫在每個網頁的 InitializeCulture 事件裡面,並使用和上面相同的指令。InitializeCulture 事件比較少人知道,因為在 VS2005 中你必須手動輸入 Protected Overrides Sub ... 之後 Intelligence 才會出現這個事件。不幸的是,在 Master Page 中並沒有這個事件可用,所以你如果要使用這個方式,你就必須在每一個單獨的網頁都撰寫程式,實在非常麻煩。所以我選擇使用 Global.asax。
還有一點必須注意一下。如果你在網頁上讓客戶選擇語系,在 Application_BeginRequest 事件中觸發程式後,它會在下一個 Page Request 中才生效而不是馬上生效。所以或許你應該在選擇按鈕(或 RadioButtonList 等)觸發時以 Response.Write 重新載入該頁,會比較保險。以下程式可以達到這個功能(寫在 RationButtonList 事件中):
Protected Sub rblLanguage_SelectedIndexChanged(...) Handles rblLanguage.SelectedIndexChanged
Dim currentPage As String = Page.Request.Path
Select Case rblLanguage.SelectedValue
Case "CHT"
setCookie("CHT")
Response.Redirect(currentPage)
Case "CHS"
setCookie("CHS")
Response.Redirect(currentPage)
...
End Select
End Sub
Protected Sub setCookie(ByVal lang As String)
If Not String.IsNullOrEmpty(lang) Then
Response.Cookies(cookieToken).Value = lang
Response.Cookies(cookieToken).Expires = "12/31/2999"
End If
End Sub
在範例程式中我使用 Cookies 物件來記錄使用者選定的語系。你可以改用 Session 物件、Request 字串或 Profile 來記錄,視需要而定。此外,cookieToken 只是一個常式字串;我想這種細節就不用再仔細說明了。
還有一點,就是這個技巧同樣可以運用在 Master Page 中;你可以在 Master Page 裡面加上語言選單,讓使用者選取以變更 Cookie 的內容。
最後再提醒一下,你必須確定每一個網頁(.aspx 頁,不是 .master)的 Page Directive(就是 <%@ Page Language="VB" MasterPageFile="~/abc.master" ... %>)裡面如果有UICulture="auto" 或 Culture="auto" 鈙述,那麼必須拿掉。如果這兩個鈙述沒有拿掉,網頁將一律以瀏覽器的語言設定為準,那麼以上動態變更語言的功能就會失效了。