[Globalization] 動態指定網頁語系

如果我們想製作一個多語系網站,當然我們可以採用 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" 鈙述,那麼必須拿掉。如果這兩個鈙述沒有拿掉,網頁將一律以瀏覽器的語言設定為準,那麼以上動態變更語言的功能就會失效了。


Dev 2Share @ 點部落