一、国际化的概念
1、不同国家的人访问同一个网站,显示的语言不同。
2、对JSP页面进行国际化
属性(properties)文件命名规则:基名---语言--国家如, message_zh_CN.properties
>>>使用标签获取相对应的值,如:
<s:textfield key="login.username" name="username"/> <s:submit key="login.submit"/>
login.username与属性(properties)文件中的key值相对应。
>>>给{0},{1}等占位符动态赋值
<s:text name="属性中的key">
<s:param>属性值</s:param>
二、实例1
1、需求:访问同一个页面,不同语言的访问者,显示不同语言的页面
1)英文访问者访问页面
2)中文访问者访问页面
2、代码分析
login_i18n.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>login</title>
</head>
<body>
<s:form action="LoginAction" method="POST">
<s:textfield key="login.username" name="username"/>
<s:submit key="login.submit"/>
</s:form>
</body>
</html>
message_en_US.properties
login.username=USERNAME
login.submit=LOGIN
message_zh_CN.properties
login.username=\u7528\u6237\u540D
login.submit=\u767B\u5F55
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!--<include file="config/upload.xml"></include>-->
<!-- 加载其他配置文件 -->
<!-- <include file="config/upload-interceptor.xml"></include> -->
<constant name="struts.custom.i18n.resources" value="message"></constant>
</struts>
struts2的拦截器在项目启动时就已经加载到内存中了,主要通过struts.xml,这里只是测验国际化,所以将其他都注释掉了,在常量中配置i18n的拦截器的值,这里值就为基值,不需要将语言和国家带上;然后当jsp页面调用值时,使用struts2自带的标签将用户对应语言的值加载进来。
拦截器的作用就是将配置文件加载到内存中,标签的作用就是将对应语言的值加载到页面中去。
三、实例2
1、需求:
2、代码分析
在实例1的基础上增加动态参数注入。
message_en_US.propertiest和message_zh_CN.properties中增加两个参数如下所示:
login.hello=hello {0},I am {1}
在login_i18n.jsp页面中新增加如下代码:
<hr> <s:text name="login.hello"> <s:param>tom</s:param> <s:param>amos</s:param> </s:text>
使用<s:text>标签来调用带参数的属性值,同时使用<s:param>标签来给参数赋值,其中顺序就与参数的顺序对应。
3.综合运用
能不能将参数值不写入到jsp页面中,因为这样很不方便,可不可以直接配置到properties属性文件中?
将login_i18n.jsp页面中的参数内容改为如下:
<s:text name="login.hello"> <s:param><s:text name="login.tom"></s:text></s:param> <s:param><s:text name="login.amos"></s:text></s:param> </s:text>
在properties文件中分别配置如下:
login.tom=TOM login.amos=AMOS /*******us上面,cn下面********/ login.tom=\u6C64\u59C6 login.amos=\u963F\u83AB\u65AF
这样将参数配置到properties中使用<s:text >标签再获取属性(properties)文件中的值,再根据不同语言进行显示,如下所示:
1)中方显示
2)英文显示:
本文只是讲了简单的配置,具体实现可参考I18nInterceptor拦截器的实现。