1. 程式人生 > >四、Struts2之國際化

四、Struts2之國際化

一、國際化介紹

Struts2國際化的目的和Java國際化一致,對於瀏覽器支援的語言顯示不同的文字,如果瀏覽器支援中文,則顯示中文,如果瀏覽器支援英文,則顯示英文;

國際化的目的:

很多人剛開始學國際化覺得國際化沒有用,因為我們通常都只需要顯示中文即可;但是比如google,全世界的人都在訪問此網站,這時如果只顯示中文網頁肯定是不合理的。因此需要國際化;

Eclipse for JavaEE和MyEclipse在國際化的優劣:

一般來說,資原始檔的中文都需要通過native2ascii.exe進行轉換;

Eclipse for JavaEE需要手動轉換;

而MyEclipse可以自動轉換,只需要輸入中文即可;

二、瀏覽器中修改語言

 

三、資原始檔介紹

國際化資原始檔都是通過Xxx_language_Country.properties 形式;

比如: message_zh_CN.properties、message_en_US.properties;

如果瀏覽器支援中文,則會載入第一個資原始檔;

注意:在資原始檔中不支援中文,因此需要通過JDK\bin中的native2ascii.exe進行轉換;

在資原始檔中內容是以key=value的形式存放的,比如name=xiazdong;

四、Struts2國際化

在Struts2中,在JSP頁面和Action類中都可以使用國際化;

國際化檔案分為:

1.全域性國際化資原始檔:對於所有Action、JSP都有效,放在WEB-INF\classes下;

2.包範圍國際化資原始檔:對於在此包中的Action都有效,放在包路徑下;

3.Action範圍國際化資原始檔:對於特定的Action有效,放在Action類的同目錄下;

4.臨時指定國際化資原始檔:需要特定語法進行指定才有效,放在WEB-INF\classes下; 

1.全域性國際化資原始檔

此檔案適用於Action和JSP;

如果需要使用全域性資原始檔,則需要在struts.xml中新增常量:

<constant name="struts.custom.i18n.resources

" value="basename" />

basename是指資原始檔的基礎名,比如message_zh_CN.properties的basename是message;

message_zh_CN.properties

title=\u9875\u9762\u6807\u9898
body=\u9875\u9762\u5934
button=\u70b9\u51fb
name=\u590f\u6b63\u51ac

message_en_US.properties

title=Page title
body=Page body
button=click
name=xiazdong

1.1在JSP中使用國際化

1.1.1一般文字國際化

通過<s:text name="title"/> 可以根據瀏覽器支援的語言取出全域性國際化檔案的key為title對應的value;

1.1.2表單控制元件的國際化

對於表單中的控制元件,比如按鈕中的文字、textfield前的描述文字,通過指定key屬性進行國際化;

比如<s:textfield key="username"/> 可以在文字域前面的描述中填入username對應的value;

示例程式碼:

<%@ page language="java" contentType="text/html; charset=GBK"
    pageEncoding="GBK"%>
   <%@taglib prefix="s" uri="/struts-tags"%>
<!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=GBK">
<title><s:text name="title"/></title>
</head>
<body>
	<s:text name="body"/>
	<s:form action="aaaa">
		<s:textfield name="name" key="name"></s:textfield>
	</s:form>
</body>
</html>

由於本人的瀏覽器預設為中文,因此顯示的是中文的資原始檔;

1.2在Action中使用國際化

在Action中可以使用 getText(String key);這個函式返回國際化檔案中key對應的value;

示例程式碼:

package org.locale.action;

import com.opensymphony.xwork2.ActionSupport;

public class Demo01Action extends ActionSupport{
	public String execute()throws Exception{
		System.out.println(getText("title"));
		System.out.println(getText("body"));
		System.out.println(getText("button"));
		return SUCCESS;
	}
}


1.3 佔位符

在資原始檔中可以使用佔位符,佔位符是指在資原始檔中留出一個位置,在使用時動態插入一個任意值;比如在登陸介面時,如果登陸的使用者名稱是xiazdong,則歡迎介面就會出現xiazdong,歡迎你! 在資原始檔中通過 {0},歡迎你!!! 實現;

message_zh_CN.properties

title=\u9875\u9762\u6807\u9898
body={0}\u9875\u9762\u5934{1}
button=\u70b9\u51fb
name=\u590f\u6b63\u51ac

1.3.1在JSP中填充佔位符

在JSP中通過在<s:text>中新增<s:param>進行填充;

<%@ page language="java" contentType="text/html; charset=GBK"
    pageEncoding="GBK"%>
   <%@taglib prefix="s" uri="/struts-tags"%>
<!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=GBK">
<title><s:text name="title"/></title>
</head>
<body>
	<s:text name="body">
		<s:param>xiazdong</s:param>
		<s:param>xiazdong</s:param>
	</s:text>
</body>
</html>

1.3.2在Action中填充佔位符

在Action中通過 getText(String key, String[] params); 第二個引數進行填充;

package org.locale.action;

import com.opensymphony.xwork2.ActionSupport;

public class Demo02Action extends ActionSupport{
	public String execute()throws Exception{
		System.out.println(getText("body",new String[]{"xiazdong","xiazdong"}));
		return SUCCESS;
	}
}


2.包範圍資原始檔

如果一個工程全部的資原始檔都在全域性國際化資原始檔中配置,會很凌亂,因此我們需要進行模組化,包範圍的資原始檔是在包下平進行配置,對於包中所有Action都有效;

包範圍的資原始檔只對Action有效,而JSP不能突顯;

包範圍的資原始檔的名稱形式為: package_language_country.properties, 注意 package是常量,比如 package_zh_CN.properties, package_en_US.properties;

如果在包下放置 包範圍資原始檔,並且配置全域性資原始檔,在Action類程式碼不變的情況下,則Action類優先載入包範圍的資原始檔;

比如目錄結構如圖所示:

則在 org.locale.action包下的Action都優先載入package_****.properties;

3.Action範圍資原始檔

Action範圍的資原始檔是針對某個特定的Action的,

Action範圍的資原始檔的形式: ActionName_language_country.properties; 比如 LoginAction類的資原始檔為:LoginAction_zh_CN.properties;

Action範圍的資原始檔優先順序比包範圍的資原始檔優先順序高。

比如目錄結構如圖所示:

則Demo04Action優先載入Demo04Action_****.properties;

4.利用標籤指定資原始檔

此種方式針對JSP載入指定的資原始檔,即可以載入任意範圍的資原始檔;

<s:i18n>是指定資原始檔的標籤;

在<s:text>等載入資原始檔的外面加上<s:i18n name="filename">標籤; filename指定載入的資原始檔的名稱;

比如:

	<s:i18n name="message">
	<s:text name="body"/>
	
	<s:form action="aaaa">
		<s:textfield name="name" key="name"></s:textfield>
	</s:form>
	</s:i18n>


就可以載入message_**_**.properties 全域性資原始檔;

目錄結構如下:

接下去將分別在JSP中載入全域性範圍、包範圍、Action範圍的資原始檔;

4.1 載入全域性範圍的資原始檔

<%@ page language="java" contentType="text/html; charset=GBK"
    pageEncoding="GBK"%>
   <%@taglib prefix="s" uri="/struts-tags"%>
<!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=GBK">
<title><s:text name="title"/></title>
</head>
<body>
	<s:i18n name="message">
	<s:text name="body"/>
	
	<s:form action="aaaa">
		<s:textfield name="name" key="name"></s:textfield>
	</s:form>
	</s:i18n>
</body>
</html>


4.2 載入包範圍的資原始檔

載入包範圍的資原始檔是,<s:i18n>的name屬性的值為 包1/包2/package的形式,比如上圖包層次為 org.locale.action,則為 org/locale/action/package ;

<%@ page language="java" contentType="text/html; charset=GBK"
    pageEncoding="GBK"%>
   <%@taglib prefix="s" uri="/struts-tags"%>
<!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=GBK">
<title><s:text name="title"/></title>
</head>
<body>
	<s:i18n name="org/locale/action/package">
	<s:text name="body"/>
	
	<s:form action="aaaa">
		<s:textfield name="name" key="name"></s:textfield>
	</s:form>
	</s:i18n>
</body>
</html>


4.3載入action範圍的資原始檔

載入Action範圍的資原始檔時,<s:i18n>的name屬性值的形式為: 包層次/ActionName,比如 org/locale/action/Demo04Action 則載入Demo04Action的資原始檔;

<%@ page language="java" contentType="text/html; charset=GBK"
    pageEncoding="GBK"%>
   <%@taglib prefix="s" uri="/struts-tags"%>
<!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=GBK">
<title><s:text name="title"/></title>
</head>
<body>
	<s:i18n name="org/locale/action/Demo04Action">
	<s:text name="body"/>
	
	<s:form action="aaaa">
		<s:textfield name="name" key="name"></s:textfield>
	</s:form>
	</s:i18n>
</body>
</html>