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>
效果以下: