概述
本文假設讀者已具備 JSP、servlet、Html、XML 和 XSLT 的常識。 在本文中,我將介紹使用 XSLT 樣式表和 XML 字典所進行的 Web 內容的國際化解決方案。
為顯示提供信息的動態國際化是一個難題。 例如,HTML 頁面可能包含需要翻譯成目標語言的按鈕和標簽。 通過編碼、使用 servlet、JSP 或對每種語言使用不同的頁面,可以實現 Html 的翻譯。然而, 源可能是動態的,因而使這些種類的解決方案變得非常昂貴和復雜。
大多數 Web 應用程序處理格式為 XML(包括 Html 頁面)的數據。 結果,基於 XML 的標准轉換機制(例如,XSLT)可用於根據目標語言替換部分文本。 然而,如果僅僅使用 XSLT,那麼每對語言都需要一個 XSLT 樣式表。 該問題的解決方案是創建一個字典驅動的常規 XSLT 樣式表來控制文本可翻譯部分的動態替換。 因為用戶只通過提供新字典將常規 XSLT 樣式表應用於新情況, 所以這會減少用於顯示的國際化信息的費用和復雜程度。 它還允許重用字典,為要存儲的文本翻譯創建一個中央位置。
圖 1:使用常規 XSLT 樣式表
Web 內容的轉換有多種方法。可以在 servlet、JSP 或浏覽器中使用常規 XSLT 樣式表。 例如,Internet Explorer 5.0 可以處理 XSLT 轉換,讓您將一些處理推送到客戶機以獲得更好的性能。 然而,WAP 電話和 Palm Pilot 沒有這種能力,所以在這些情況下,轉換必須在 servlet 或 JSP 中發生。
常規 XSLT 樣式表
定義 XSLT 樣式表的關鍵是創建一個常規樣式表,這個樣式表可應用於許多種情況並且不直接依賴於某種 Web 語言( HTML、WML 或任何其它標記語言)。常規 XSLT 樣式表將基本功能添加到國際化信息,用於顯示。 然後,可以在其它 XSLT 樣式表中擴展或包括,以添加功能。 常規樣式表定義下列規則:需要國際化的 Html/XML 文檔中的每個元素――如按鈕、標簽或文本――必須定義屬性 nlsid 。 nlsid 的值用作 XML 字典的密鑰。 XSLT 樣式表為字典編制索引、查找與 nlsid 屬性值匹配的密鑰、與字典中的當前語言匹配並檢索已翻譯的文本。然後,它將替換元素主體中已翻譯的文本,或將已翻譯的文本插入元素主體。 如果樣式表在字典中找不到 nlsid 指定的密鑰, 那麼它只將元素的內容(如果該元素包含缺省內容)復制到新文檔。 清單 1顯示了實現這一規則的常規 XSLT 樣式表。 傳遞到 XSLT 樣式表的兩個參數用於定義將使用的 XML 字典以及翻譯的首選目標語言。
常規字典
XML 字典的格式如下所示。根元素是 locale。locale 的子代是可以根據 nlsid 屬性值索引的字典中的密鑰。 密鑰的子代是帶有文本部分譯文的支持的語言。 可以為 Web 應用程序的每個頁面和 Web 應用程序的每個部分定義字典, 也可以為整個 Web 應用使用一個字典。 可以在多個應用程序之間使用 XML 字典。 清單 2是登錄屏幕的字典示例;它包含兩種語言:英語和德語。
清單 2:登錄屏幕的字典
<?XML version='1.0'?>
<locale>
<userid>
<en-us>User Name</en-us>
<de>Benutzername</de>
</userid>
<passWord>
<en-us>PassWord</en-us>
<de>Passwort</de>
</passWord>
<logonbutton>
<en-us>Logon</en-us>
<de>Anmelden</de>
</logonbutton>
</locale>
Web 內容的外觀
上面提到過,要翻譯的任何元素都需要定義 nlsid 屬性。元素可能包含也可能不包含缺省語言。 清單 3a定義的是 帶有缺省語言的標簽元素的外觀, 清單 3b顯示了 沒有缺省語言是什麼樣子。 清單 3c顯示了當應用常規樣式表時下列元素的結果。 對於這個示例,從浏覽器接收到的首選語言是德語,它使用上面定義的“XML 字典”(請參閱 清單 2)。
清單 3a:在帶有缺省語言的 Html 文檔中定義的元素
<label id="useridLabel" nlsid="userid">User Name</label>
或
清單 3b:在不帶有缺省語言的 Html 文檔中定義的元素
<label id="useridLabel" nlsid="userid"/>
清單 3c:轉換結果
<label id="useridLabel" nlsid="userid">Benutzername</label>
servlet 轉換示例
Internet Explorer 和 Netscape Navigator 這樣的浏覽器允許設置首選語言。 servlet 或 JSP 可以通過 HTTP 請求的 "Accept-Language" 頭檢索用戶的首選語言。 可以從 Internet Explorer 內部使用 VBScript 來檢索首選語言。 要使 Web 應用程序國際化,只要將首選語言作為參數傳遞給 XSLT 樣式表、 將字典源作為參數設置成 XSLT 樣式表、對 Html/XML 文檔執行轉換並顯示國際化信息即可。
例如,servlet 可能包含下列要處理 Html 頁面翻譯的代碼(請參閱 清單 4)。
清單 4:Html 頁面的翻譯
public void doGet (HttpServletRequest req, HttpServletResponse res) throws
ServletException, IOException {
.......
XSLTProcessor processor =
org.apache.xalan.xslt.XSLTProcessorFactory.getProcessor();
Processor.setStylesheetParam("currentLocale",
req.getHeader("Accept-Language"));
processor.setStylesheetParam("dictionary-file","'nls.XML'");
Processor.process(new
org.apache.xalan.xslt.XSLTInputSource("HtmlToBeTranslated.XML"),
new
org.apache.xalan.xslt.XSLTInputSource("NLSStyleSheet.xsl"),
New
org.apache.xalan.xslt.XSLTResultTarget(OutputStreamForVIEw));
.......
}
總結
在本文中,我已經向您演示了如何使用 XSLT 和 XML 字典創建可擴展的解決方案,使 Web 內容國際化。 通過利用這種方法,將減少開發人員必須維護的代碼量並且防止硬編碼資源在您各個應用程序中分散。 這種方法還允許您擁有單一頁面源,而不是用 24 種不同語言編寫的同一頁面源。 您還可以在許多各種各樣的應用程序中重用字典。