Fork me on GitHub

Programming Design Notes

利用 JavaServer Pages Standard Tag Library (JSTL) 切換網頁語言 (I18n)

| Comments

利用 JSTL 的 Internationalization Tag Library 可以輕鬆的做出支援多國語言的網頁。

先增加一個 Package: com.blogspot.lawpronotes.language。
在 com.blogspot.lawpronotes.language 內新增 3 個 .properties ,命名為 form.properties 、form_en.properties 和 form_zh.properties。因為 .properties 檔案必須使用 ISO 8859-1 編碼,所以是不能直接輸入中文的,要轉換成 Unicode 才可以。

使用 Eclipse 的可以參考這篇去安裝 Properties Editor: http://lawpronotes.blogspot.com/2010/02/eclipse-plugin-properties-editor.html

使用 Properties Editor 可以直接將以下文字複製。

form.properties
userName=用戶名稱
password=密碼

form_en.properties
userName=User Name
password=Password

form_zh.properties
userName=用戶名稱
password=密碼

非使用 Properties Editor 請複製以下內容。

form.properties
userName=\u7528\u6236\u540d\u7a31
password=\u5bc6\u78bc

form_en.properties
userName=User Name
password=Password

form_zh.properties
userName=\u7528\u6236\u540d\u7a31
password=\u5bc6\u78bc

現在新增一個 JSP 檔案,將以下內容複製到 JSP 檔案內。
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>GlassFish JSP Page</title>
</head>
<body>
<fmt:setLocale value="en" />
<fmt:setBundle basename="com/blogspot/lawpronotes/language/form" var="formBundle" />
<form>
<label><fmt:message key="userName" bundle="${formBundle}" />: </label>
<input type="text" /><br />
<label><fmt:message key="password" bundle="${formBundle}" />: </label>
<input type="text" /><br />
</form>
</body>
</html>

使用瀏覽器去看一看會看見以下畫面。

現在將
<fmt:setLocale value="en" />

改成
<fmt:setLocale value="zh" />

使用瀏覽器去看一看會變成以下畫面。

現在解釋一下。
這句是宣告此 JSP 使用 Internationalization Tag Library。
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

這句是將宣告此頁面是那種語言。value 是根據你設定的語言而找出相對應的語言檔,即是 _en 和 _zh。
<fmt:setLocale value="en" />

這句是找出指定的語言檔,因為利用了 <fmt:setLocale value=”en” /> 來設定語言,所以不必將 form 換成 form_en 或 form_zh。其中的 var=”formBundle” 是將語言檔放進變數內,這意味著同一個頁面可以引入多個語言檔。如果找不到語言檔就會使用預設語言檔,即是 form.properties。
<fmt:setBundle basename="com/blogspot/lawpronotes/language/form" var="formBundle" />

這句是在 formBundle 這個變數內找出關鍵字再顯示出來。因為已經將語言檔放進變數內。
<fmt:message key="userName" bundle="${formBundle}" />

最後大家當然使用自己的創作力去令切換語言更有彈性。

相關書籍: JSTL in ActionCore JSTL: Mastering the JSP Standard Tag LibraryJSTL: Practical Guide for JSP Programmers (The Practical Guides)