1.一、國際化簡介html
國際化是指應用程序在運行的時候,根據客戶端請求來自的國家地區、語言的不一樣而顯示不一樣的界面(簡單說就是根據你的地區顯示相關地區的語言,若是你如今在英國,那麼顯示的語言就是英語),國際化的存在價值就是:當一個應用須要在全球使用。java
國際化(Internationalization),國際化也被存在I18N,由於頭字母是I,尾字母是N,中間有18爲字母,這個你瞭解就好。web
本地化(Localization),首字母是L,尾字母是N,中間有10個字母,因此也成爲L10N。(本地化:根據不一樣區域顯示本地語言)瀏覽器
1.二、國際化實現思路框架
將程序中的信息等放在資源文件中,程序在運行過程當中,會根據本地語言和國家代碼自動到相關的資源文件中提取信息。jsp
1.三、Java的國際化代碼實現ide
新建一個java項目工具
package com.i18n.resource; import java.util.Locale; import java.util.ResourceBundle; import javax.ejb.Local; public class I18NTest { public static void main(String[] args) { //資源包基包(包名+myproperties) String basename = "com.i18n.resource.myproperties"; //設置語言環境 Locale cn = Locale.CHINA; //中文 Locale en = Locale.ENGLISH; //英文 //根據基名和語言環境加載對應的語言資源文件 ResourceBundle mycn = ResourceBundle.getBundle(basename,cn);//加載myproperties_cn ResourceBundle myen = ResourceBundle.getBundle(basename,en);//加載myproperties_en //加載資源文件後, 程序就能夠調用ResourceBundle實例對象的 getString方法獲取指定的資源信息名稱所對應的值。 //String value = myResources.getString(「key"); String usernamecn = mycn.getString("username"); String passwordcn = mycn.getString("password"); String usernameen = myen.getString("username"); String passworden = myen.getString("password"); //顯示中文的編碼 System.out.println(usernamecn+"----"+passwordcn); //顯示英文的編碼 System.out.println(usernameen+"----"+passworden); } } /*輸出結果爲: * 用戶----密碼 username----password * */
注意:使用國際化必須創建資源文件纔可以使用post
en:表示英語,zh:表示中文測試
myproperties_en.properties文件代碼爲:
username=username password=password submit=submit
myproperties_zh.properties代碼爲:(注意:中文被編譯爲ASCLL格式)
username=\u7528\u6237 password=\u5BC6\u7801 submit=\u63D0\u4EA4
咱們能夠新建jsp頁面,根據不一樣的地區顯示不一樣的語言。
<%@page import="java.util.ResourceBundle"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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>測試i18n</title> </head> <% //加載i18n資源文件,request.getLocale()獲取用戶所在的國家地區 ResourceBundle my = ResourceBundle.getBundle("com.i18n.resource.myproperties",request.getLocale()); %> <body> <form action="" method="post"> <%=my.getString("username") %>:<input type="text" name="username"><br/> <%=my.getString("password") %>:<input type="text" name="password"><br/> <input type="submit" value="<%=my.getString("submit")%>"> </form> </body> </html>
選擇IE瀏覽器——工具——語言——可添加英語語言,將其移動到頂層,保存的時候,則當前的語言爲英語。
jsp界面爲:
若是是中文在頂層的話,則顯示爲中文。
2.一、Struts2的國際化通常是創建在java基礎上的,同樣也是經過不一樣國家/語言環境的資源文件,而後經過ResourceBundle加載指定的Locale對應的資源文件,再取得該資源文件中指定Key對應的消息——整個過程與java程序的國際化徹底相同,只是Struts2框架對Java程序國際化作了進一步的封裝,從而簡化了應用程序的國際化。
Struts2應用程序的國際化主要包括:輸入校驗提示信息國際化,類型轉換提供國際化,Action信息國際化和JSP頁面國際化等組成。這裏主要介紹如何在Action中取得國際化消息,如何在JSP頁面上輸出國際化消息,如何進行輸入校驗提示信息的國際化。
2.二、國際化的類型
一、Application級別的國際化
二、Package級別的國際化
三、Action級別的國際化
2.三、案例分析
Struts2中提供了不少加載國際化資源文件的方式,最簡單最經常使用的就是加載全局的國際化資源文件,加載全局的國際化資源文件一般使用配置常量來實現的。不論是Web.xml文件配置常量,仍是struts.properties文件中配置常量,以及在struts.xml中配置常量,只須要配置struts.custom.i18n.resources常量便可。該常量的值爲全局國際化資源文件的名字。
1、配置常量
如:
該資源文件的名字爲:messageResource,後面的en_US表示美國英語,zh_CN表示中文。
加載全局國際化配置文件有三種方法
一、咱們能夠新建struts.properties,將其放在同級目錄下。
內容爲:struts.custom.i18n.resources=messageResource
二、也能夠在struts.xml中配置常量
三、web.xml(沒試過)
Struts2訪問國際化資源文件有如下4種方式:
一、在jsp頁面使用struts2的<s:text>,該標籤指定一個name屬性,該屬性指定國際化資源文件中的key
二、action類中訪問國際化消息,使用ActionSupport類中的getText(),該方法接受一個name屬性,該屬性指定國際化資源文件中的key
三、在表單元素的label輸出國際化消息,能夠爲其指定一個key屬性,該屬性指定國際化資源文件中的key
四、在jsp頁面還可使用<s:property value="getText('name')">,實際上是調用了getText方法。
2、新建資源文件(messageResource_en_US.properties和messageResource_zh_CN.properties,將其放在classes文件夾下。)
messageResource_en_US.properties文件內容:
loginPage=Login Page errorPage=Error Page succPage=Welcome Page failTip={0},Sorry,you can,t login! succTip={0},Welcome,you has logged in! user=User Name pass=User Pass login=Login welcomeMsg={0},Hello!Now is {1}!
messageResource_zh_CN.properties文件內容:
loginPage=\u767B\u5F55\u9875\u9762 errorPage=\u9519\u8BEF\u9875\u9762 succPage=\u6210\u529F\u9875\u9762 failTip={0}\uFF0C\u5BF9\u4E0D\u8D77\uFF0C\u4F60\u4E0D\u80FD\u767B\u5F55 succTip={0}\uFF0C\u6B22\u8FCE\uFF0C\u4F60\u5DF2\u7ECF\u767B\u5F55\uFF01 user=\u7528\u6237\u540D pass=\u5BC6\u7801 login=\u767B\u5F55 welcomeMsg={0}\uFF0C\u60A8\u597D\uFF01\u73B0\u5728\u65F6\u95F4\u662F{1}\uFF01
在國際化資源文件中,中文是以ASCLL的格式保存的。
注意:這裏的資源文件有使用到通配符的。
3、新建login.jsp登陸界面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!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><s:text name="loginPage"></s:text></title> </head> <body> <!--經過動態語言切換,實現語言切換功能。request_locale是系統默認的參數,改變值可以切換語言 --> <a href="lang.action?request_locale=zh_CN">中文</a> <a href="lang.action?request_locale=en_US">English</a> <s:form action="login" method="post"> <s:textfield name="username" key="user"></s:textfield> <s:textfield name="password" key="pass"></s:textfield> <s:submit key="login"></s:submit> </s:form> </body> </html>
在此jsp頁面中,有使用到動態語言切換。該jsp頁面中使用到<s:textfield>標籤來直接輸出國際化信息,這裏的key對應國際化的key(注意:這裏聲明一點,國際化資源文件的信息使key-value)
4、新建兩個類,分別繼承ActionSupport,一個做爲動態語言切換,一個做爲業務邏輯處理。
新建lang類繼承ActionSupport(這裏僅僅做爲語言切換)
package com.Struts2.I18n; import com.opensymphony.xwork2.ActionSupport; //該action只是單純的切換顯示的語言而已 public class lang extends ActionSupport { public String execute(){ System.out.println("why"); return SUCCESS; } }
新建LoginAction繼承ActionSupport,這裏做爲業務邏輯處理
package com.Struts2.I18n; import java.util.HashMap; import java.util.Map; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String execute(){ ActionContext ctx = ActionContext.getContext(); Map<String, Object> m = new HashMap<String,Object>(); //用戶登陸成功 if("admin".equals(getUsername())&&"123".equals(getPassword())){ System.out.println(getUsername()); if(ctx.getSession()!=null){ System.out.println(ctx.getSession()); ctx.getSession().put("user", this.getUsername()); } //調用getText方法取出國際化信息(沒使用通配符的狀況下使用) //ctx.put("tip", getText("succTip")); //使用通用符 ctx.put("tip", getText("succTip",new String[]{getUsername()})); return SUCCESS; }else{ //調用getText方法取出國際化信息(沒使用通配符的狀況下使用) //ctx.put("tip", getText("failTip")); ctx.put("tip", getText("failTip",new String[]{getUsername()})); return ERROR; } } }
struts.xml配置
5、新建登陸成功的界面和登陸失敗的界面
新建 Hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!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><s:text name="scuuPage"></s:text></title> </head> <body> <jsp:useBean id="d" class="java.util.Date" scope="page"></jsp:useBean> <%-- <!--不使用通配符,僅僅輸出國際化信息的標籤 --> <s:property value="#tip"/><br/> <!--輸出用戶的名稱 --> <s:property value="#attr.user"/> <!--輸出當前的時間 --> ${pageScope.d } --%> <!--使用通配符 : 經過s:text和s:param來填充佔位符,注意:順序必須一致!--> <s:property value="#tip"/><br/><!--#tip是獲取國際化的信息 --> <!--使用s:text可以給properties文件裏面的通配符賦值,注意:順序必須同樣 --> <s:text name="welcomeMsg"> <s:param><s:property value="username"/></s:param> <s:param>${pageScope.d }</s:param> </s:text> <!--跳轉到登陸界面 --> <a href="/login.jsp"> <s:text name="back"></s:text> </a> </body> </html>
注意:這裏的標籤有使用非通配符和通配符的標籤,筆者這個案例是使用到通配符,你能夠將其註釋掉,而且在資源文件中吧{0},這些換成你想要顯示的信息,而後將第一層註釋去掉,就能看到你想要顯示的信息了。使用通配符必須注意順序問題。
新建error.jsp頁面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!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>Insert title here</title> </head> <body> Error:<s:fielderror/> </body> </html>
效果以下: