程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> ASP編程 >> ASP技巧 >> ASP實現多語言支持

ASP實現多語言支持

編輯:ASP技巧

綱 要 :
讓 我 們 設 想 你 使 用 Active Server Pages 設 計 了 一 個 成 功 的 站
點 , 而 你 的 客 戶 紛 紛 要 求 將 此 站 點 國 際 化 以 提 供 多 種 語
言 版 本 。這 時 候 你 該 怎 麼 辦?請 看 本 文。

正 文 :
    一 、 介 紹

    讓 我 們 設 想 你 使 用 Active Server Pages 設 計 了 一 個 成 功
的 站 點 , 而 你 的 客 戶 紛 紛 要 求 將 此 站 點 國 際 化 以 提 供 多
種 語 言 版 本 。 該 問 題 的 關 鍵 在 於 , 你 必 須 使 用 某 種 方 法
實 現 快 速 的 頁 面 內 容 轉 換 。 可 以 將 此 問 題 看 成 是 從 數 據
庫 提 取 適 當 數 據 並 用 ASP 動 態 顯 示 。 在 本 文 中 我 們 將 討 論
如 何 使 用 Active Server Pages 的 字 典 對 象 以 及 一 個 後 台 數 據
庫 實 現 國 際 化 支 持 。

    具 體 實 現 過 程 分 以 下 三 個 步 驟 :
    ◇ 設 計 數 據 庫 並 存 儲 文 本 和 文 件 路 徑 。
    ◇ 從 數 據 庫 讀 取 數 據 到 字 典 對 象 。
    ◇ 在 ASP 頁 面 引 用 文 本 和 文 件 路 徑 。

    二 、 步 驟 1 - 設 計 數 據 庫 並 存 儲 文 本 和 文 件 路 徑

    我 們 需 要 在 數 據 庫 設 計 上 花 些 時 間 。 使 用 此 數 據
庫 , 我 們 希 望 能 夠 把 所 有 要 用 到 的 文 本 和 圖 片 適 當 編
目 , 並 且 這 些 文 本 和 圖 片 不 能 重 復 ; 如 果 要 在 應 用 中 把
“ 是 ” 改 成 “ 確 定 ” , 希 望 只 在 一 個 地 方 作 改 動 ; Web 維
護 者 在 更 改 內 容 時 應 能 夠 快 速 找 到 目 標 文 本 。 基 於 以 上
要 求 , 讓 我 們 開 始 設 計 數 據 庫 。

    首 先 創 建 兩 個 表 來 放 置 文 本 。 其 中 一 個 表 為
CommonStrings , 用 於 存 放 在 整 個 站 點 重 復 使 用 的 單 詞 和 短
語 。 另 外 一 個 表 為 SpecializedStrings , 用 於 存 放 只 在 特 定
頁 面 使 用 的 單 詞 和 短 語 。 把 公 用 和 限 於 特 定 頁 面 使 用 的
文 本 分 別 存 放 有 利 於 簡 化 站 點 維 護 。

    兩 個 表 都 使 用 StringKey 字 段 來 標 記 紀 錄 , 使 用
StringLanguage 來 說 明 所 用 語 言 , 聯 合 StringKey 和
StringLanguage 創 建 一 個 主 鍵 。 字 段 StringHolder 用 來 保 存 單
詞 、 短 語 或 語 句 。 這 個 字 段 必 須 創 建 唯 一 索 引 以 保 證 不
會 輸 入 重 復 的 單 詞 、 短 語 或 語 句 。

    對 於 SpecializedStrings 表 , 還 需 要 一 個 額 外 的 字 段
ASPPage 來 標 記 文 本 所 在 的 ASP 頁 面 。

    對 於 圖 片 文 件 , 我 們 可 以 使 用 相 同 的 步 驟 創 建 表 來
存 儲 指 向 這 些 文 件 的 路 徑 。 只 需 要 在 CommonImage 表 和
SpecializedImage 表 中 用 FileName 字 段 替 換 對 應 的 StringHolder
就 可 以 了 。

    在 新 創 建 的 表 中 裝 入 數 據 時 , StringKey 的 內 容 應 該 給
站 點 維 護 者 盡 可 能 多 的 提 示 以 表 明 頁 面 上 將 顯 示 的 文
本 。 例 如 , 對 於 一 個 在 線 銷 售 站 點 來 說 有 關 拒 絕 承 諾 的
聲 明 語 句 使 用 OrderDisclaimer 是 一 個 不 錯 的 選 擇 , 站 點 維
護 者 由 此 可 以 非 常 清 楚 地 了 解 使 用 該 記 錄 將 在 Web 頁 面 上
顯 示 的 內 容 。

    把 那 些 公 用 的 單 詞 和 短 語 放 在 CommonStrings 表 。 這
樣 , 維 護 者 就 知 道 如 果 他 們 修 改 CommonStrings 表 中 的 一 個
記 錄 , 將 影 響 到 站 點 內 的 許 多 頁 面 。

    對 於 大 的 站 點 , 可 以 設 計 一 個 易 於 使 用 的 界 面 來 輸
入 和 修 改 數 據 庫 中 的 文 本 。 准 備 這 些 資 料 是 一 項 冗 長 乏
味 的 任 務 , 越 簡 單 就 越 少 出 錯 。

    三 、 步 驟 2 - 從 數 據 庫 讀 取 數 據 到 字 典 對 象

    字 典 對 象 ( Dictionary Object ) 是 一 個 多 用 途 的 服 務 器
端 對 象 , 它 相 當 於 二 維 數 組 , 保 存 了 鍵 以 及 與 鍵 相 關 聯
的 數 據 。 提 取 數 據 的 唯 一 途 徑 在 於 取 得 鍵 值 或 索 引 。 可
以 把 字 典 對 象 的 作 用 范 圍 配 置 為 整 個 應 用 范 圍 或 對 話 范
圍 , 而 不 必 擔 心 損 失 性 能 。 賦 予 應 用 層 作 用 范 圍 意 味 著
對 象 只 被 實 例 化 一 次 , 且 所 有 會 話 均 使 用 同 一 個 字 典 對
象 。 以 下 代 碼 創 建 兩 個 字 典 對 象 實 例 , 分 別 和 兩 個 文 本
表 關 聯 。 記 住 , 我 們 希 望 對 象 只 被 初 始 化 一 次 , 所 以 把
這 些 代 碼 放 在 application_OnStart 事 件 中 :

< Script RUNAT=SERVER Language=VBScript>
Sub Application_OnStart()
Dim DictCommonStrings
Dim DictSpecializedStrings

Dim Conn
Dim rsCommonStrings
Dim rsspecializedStrings

Set DictCommonStrings = Server.CreateObject("Scripting.Dictionary")
Set DictSpecializedStrings = Server.CreateObject
("Scripting.Dictionary")

    接 下 來 的 任 務 是 把 數 據 裝 入 字 典 對 象 。 我 們 將 遍 歷
表 , 連 接 StringKey 和 StringLanguage , 並 把 連 接 後 的 值 作 為
字 典 的 鍵 值 , 把 StringHolder 放 在 對 應 的 字 典 數 據 區 。 由
此 我 們 獲 得 了 使 用 數 據 庫 存 儲 數 據 的 彈 性 , 並 避 免 了 持
久 的 數 據 庫 連 接 而 導 致 的 性 能 影 響 。 事 實 上 , 數 據 庫 只
在 應 用 啟 動 時 被 訪 問 一 次 , 其 後 ASP 頁 面 將 從 速 度 更 快 的
字 典 對 象 讀 取 所 需 數 據 。

'建立數據庫連接
Set Conn = Server. CreateObject("ADODB.Connection")<BR>
Conn.ConnectionString = "Some Connection String"<BR>
Conn.open

'打開 CommonStrings 表, 遍歷所有記錄並裝入數據
Set rsCommonStrings = Conn.Execute("Select StringKey, StringHolder
from CommonStrings")
Do until rsCommonStrings.EOF
DictCommonStrings.Add rsCommonStrings("StringLanguage") &
rsCommonStrings("StringKey")  _
,rsCommonStrings("StringHolder")
rsCommonStrings.MoveNext
Loop

'打開SpecializedStrings表, 遍歷所有記錄並裝入數據
Set rsSpecializedStrings = Conn.Execute("Select StringKey,
StringHolder from SpecializedStrings")
Do until rsSpecializedStrings.EOF
DictSpecializedStrings.Add rsSpecializedStrings ("StringLanguage") & 
_
rsSpecializedStrings ("StringKey")  , rsSpecializedStrings
("StringHolder")
rsSpecializedStrings.MoveNext
Loop

rsSpecializedStrings.Close
rsCommonStrings.Close
Conn.Close
Set rsSpecializedStrings = Nothing
Set rsCommonStrings = Nothing
Set Conn = Nothing
End Sub

< /Script>

    四 、 步 驟 3-在 ASP 頁 面 引 用 文 本 和 文 件 路 徑

    接 下 來 的 工 作 是 在 ASP 頁 面 引 用 已 經 實 例 化 的 字 典 對
象 中 的 文 本 ( 以 及 文 件 路 徑 ) 。 首 先 我 們 需 要 知 道 當 前
用 戶 所 使 用 的 語 言 , 其 中 一 個 辦 法 是 從
Request.Server.Variables 取 得 該 值 。 請 把 下 列 代 碼 放 入
session_Onstart 事 件 處 理 過 程 :


< Script Language=VBScript>
Sub Session_OnStart()
Session("Lang") = Request.Server.Variables("HTTP_ACCEPT_LANGUAGE")
End Sub
< /Script>

     通 過 鍵 值 可 以 從 字 典 對 象 取 得 對 應 的 文 本 ( 或 圖 片
文 件 路 徑 ) , 鍵 值 由 語 言 前 綴 加 名 字 組 成 。 以 下 為 示 例
代 碼 :
< Html>
< P Align=center>
< h1>< %= DictSpecializedStrings.Item(Session("Lang") 
& "Confirmation")%>< /h1>
< /P><BR>
< P Align=center>
< h5>< %= DictSpecializedStrings.Item(Session("Lang") 
& "OrderDisclaimer")%>< /h5>
< /P>
< /Html>

    對 於 中 文 浏 覽 器 , 該 頁 面 的 提 示 類 如 :
    感 謝 您 的 購 買 。 請 進 入 下 一 頁 付 款 。
    而 對 於 一 個 缺 省 語 言 為 英 文 的 的 浏 覽 器 , 則 提 示
為 :
Thank you for your order. Continue to the Next Page to make your
payment.

    根 據 我 的 經 驗 , 從 字 典 對 象 引 用 文 本 ( 以 及 圖 片 路
徑 ) 和 直 接 在 ASP 代 碼 中 輸 入 數 據 相 比 , 沒 有 性 能 上 的 不
利 影 響 。 這 是 由 於 文 本 ( 和 圖 片 路 徑 ) 字 典 被 放 在 內 存
中 , 因 而 可 以 快 速 地 提 取 。

    五 、 討 論

    當 然 , 實 現 多 語 言 支 持 還 有 其 它 的 因 素 需 要 考 慮 。
使 站 點 內 容 的 變 化 和 應 用 開 發 者 隔 離 是 本 文 試 圖 說 明 的
實 質 內 容 。 本 方 案 不 僅 對 於 實 現 站 點 內 容 國 際 化 非 常 有
用 , 而 且 對 於 站 點 內 容 頻 繁 改 變 而 布 局 基 本 不 變 的 情
形 , 本 方 案 同 樣 能 起 作 用 。 後 台 數 據 庫 、 集 合 對 象 ( 字
典 對 象 ) 以 及 ASP 技 術 提 供 了 一 個 極 好 的 方 案 來 實 現 站 點
內 容 從 源 語 言 到 其 它 語 言 的 擴 展 。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved