Struts2在地化和國際化


Struts 2的國際化(I18N)和在地化(i10n)或多語言的例子,來說明如何使用資源包來顯示不同語言的訊息。在這個例子中,您將建立一個簡單的登入螢幕,通過Struts 2的UI元件顯示來自資源包的訊息, 並更改基於所選的語言選項的語言環境。


1. 工程結構

專案結構,如下圖片顯示:

2. Properties檔案

確保屬性檔案命名為國家指定的程式碼。
在一些「非歐洲」或「非英語」之類的字元,應該始終編碼的內容 native2ascii屬性

global.properties

#Global messages
global.username = Username
global.password = Password
global.submit = Submit

global_zh_CN.properties

#Global messages
global.username = \u7528\u6237\u540d
global.password = \u5bc6\u7801
global.submit=\u63d0\u4ea4

global_fr.properties

#Global messages
global.username = Nom d'utilisateur
global.password = Mot de passe
global.submit = Soumettre

global_de.properties

#Global messages
global.username = Benutzername
global.password = Kennwort
global.submit = Einreichen 
請仔細閱讀Struts2資源包的例子來了解Struts 2的自動搜尋屬性檔案。

3. 動作類

兩個動作類,LocaleAction基本上是什麼都不做, 而 LoginAction 會做一個簡單的驗證和通過gettext()顯示來自資源包錯誤資訊。

LocaleAction.java

package com.tw511.common.action;

import com.opensymphony.xwork2.ActionSupport;

public class LocaleAction extends ActionSupport{

	//business logic
	public String execute() {
		return "SUCCESS";
	}
}

LoginAction.java

package com.yiibai.user.action;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport{

	private String username;
	private String password;
	 
	//...getter and setter methods

	//business logic
	public String execute() {
		return "SUCCESS";
	}

	//simple validation
	public void validate(){
		if("".equals(getUsername())){
			addFieldError("username", getText("username.required"));
		}
		if("".equals(getPassword())){
			addFieldError("password", getText("password.required"));
		}
	}
}

4. 檢視頁面

一個登入頁面帶有一個文字框,密碼和提交UI元件。
為了支援Struts2 在地化,必須宣告 <%@ page contentType=」text/html;charset=UTF-8″ %>在您的檢視頁面,否則能將有問題的「UTF-8資料」正確顯示,尤其是中國漢字。閱讀這篇文章,關於Struts2中國本土化問題

login.jsp

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>

<body>
<h1>Struts 2 localization example</h1>

<s:form action="validateUser" namespace="/user">

	<s:textfield key="global.username" name="username" />
	<s:password key="global.password" name="password"/>	
	<s:submit key="global.submit" name="submit" />
	
</s:form>

<s:url id="localeEN" namespace="/" action="locale" >
   <s:param name="request_locale" >en</s:param>
</s:url>
<s:url id="localezhCN" namespace="/" action="locale" >
   <s:param name="request_locale" >zh_CN</s:param>
</s:url>
<s:url id="localeDE" namespace="/" action="locale" >
   <s:param name="request_locale" >de</s:param>
</s:url>
<s:url id="localeFR" namespace="/" action="locale" >
   <s:param name="request_locale" >fr</s:param>
</s:url>

<s:a href="%{localeEN}" >English</s:a>
<s:a href="%{localezhCN}" >Chinese</s:a>
<s:a href="%{localeDE}" >German</s:a>
<s:a href="%{localeFR}" >France</s:a>
 
</body>
</html> 
要更改預設的語言環境,只需要宣告「request_locale」引數,設定你喜歡的語言程式碼,並傳遞給一個Action類。在 Struts2中,com.opensymphony.xwork2.interceptor.I18nInterceptor 攔截器, 在 struts-default.xml中宣告將攔截Action類,並相應地處理語言環境。

5. 顯示資源包的訊息?

在Struts2,有很多的方式來顯示所選擇的語言或語言環境的資源包的資訊。有關範例,
<s:textfield key="global.username" name="username" />
<s:text name="global.username" />	
<s:property value="getText('global.username')" />
<s:text name="global.password" /> 
在Struts1,有一個標準的 bean:message 來顯示資源包的訊息。但是在Struts 2中,有這麼多相當於顯示資源包的訊息(甚至內部的工作不同)方式,基本上,無論選擇的是什麼,在 Struts2 也將顯示正確的資源包的訊息。

6. struts.xml

Struts2 的組態檔案,連結一起。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
 
<struts>

	<constant name="struts.custom.i18n.resources" value="global" />
 	<constant name="struts.devMode" value="true" />
 	
	<package name="user" namespace="/user" extends="struts-default">
	   <action name="login">
		<result>/pages/login.jsp</result>
	   </action>
	   <action name="validateUser" class="com.yiibai.user.action.LoginAction">
		<result name="SUCCESS">/pages/welcome.jsp</result>
		<result name="input">/pages/login.jsp</result>
	   </action>
	</package>
	
	<package name="default" namespace="/" extends="struts-default">
	   <action name="locale" class="com.tw511.common.action.LocaleAction">
		<result name="SUCCESS">/user/pages/login.jsp</result>
	   </action>
	</package>
	
</struts>

7. 範例

http://localhost:8080/i18nlocalization/user/login.action

http://localhost:8080/i18nlocalization/locale.action?request_locale=en


http://localhost:8080/i18nlocalization/locale.action?request_locale=zh_CN

http://localhost:8080/i18nlocalization/locale.action?request_locale=de

http://localhost:8080/i18nlocalization/locale.action?request_locale=fr

參考

  1. http://struts.apache.org/2.1.8/docs/localization.html
  2. h/
  3. h/
  4. https://www.tw511.com/struts/struts-internationalizing-or-localization-example/

程式碼下載 - http://pan.baidu.com/s/1jGCUaJ8