Struts從一開始就支援國際化(internationallization, i18n),我們可以使用訊息資源檔案來管理國際化的訊息,就如之前所提過的,您在struts-config.xml中設定訊息資源檔的名稱與位置:
<message-resources parameter="resources.application"/>


這樣的設定表示您將使用WEB-INF/resources目錄下以application開頭,副檔名為properties的訊息資源檔,在檔案名稱命名上您可以用語言與國別訊息來表明國際化時要使用的檔案,例如application_zh_TW.properties、application_zh_CN.properties、application_zh_HK.properties,儲存特定的字元之後,記得使用native2ascii工具程式進行轉換,轉換方法參考這邊:
http://www.caterpillar.onlyfun.net/phpBB2/viewtopic.php?t=1244

Struts預設會以所在伺服器的locale設定來決定要傳回哪一個訊息資源檔的內容給客戶端,如果客戶端是瀏覽器,則會根據所傳送的Header Accept-Language來選擇傳回的資源檔訊息,如果瀏覽器指定的Accept-Language沒有對應的資源檔案,且也沒有與伺服器的locale對應的資源檔案,則使用沒有任何的語言與國別訊息的訊息資源檔案名稱,也就是application.properties。

您可以提供application_zh_TW.properties、application_zh_CN.properties、application_zh_HK.properties、application.properties等等的檔案,依賴瀏覽器所提供的Header來選擇適當的國際化訊息,但這並不保險,例如若使用者要看中文,而它的瀏覽器預設語系是英文語系,則這個方法會使得使用者看到英文訊息。

要求使用者有能力自行更改瀏覽器的預設語系是不切實際的,並不是每個使用者都知道如何作這個設定,更好的方法是使用Struts的session中的Locale來控制,Struts預設會在每個用戶的session中放入一個Locale,預設是使用者瀏覽器所提供的語言訊息,您可以替換掉session中的這個Locale,方法之一是提供一個Action來進行轉換,例如在網頁上提供一個連結(像是「轉為簡體」,link至/ChangeLang.do這樣),按下後可進行以下的動作:
package onlyfun.caterpillar;

import java.util.*;
import javax.servlet.http.*;
import org.apache.struts.action.*;

public class AccountAction extends Action {
public ActionForward login(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
Locale locale = new Locale("zh", "CN");
HttpSession session = request.getSession(true);
session.setAttribute(Action.LOCALE_KEY, locale);

return mapping.findForward("welcome");
}
}


我們在Action中新增一個Locale物件來替換掉session中的Locale物件,之後Struts就使用這個物件來顯示指定的訊息資源,例如application_zh_CN.properties下的訊息。
posted on 2005-06-01 13:17  Johnny  阅读(572)  评论(1编辑  收藏  举报