1、配置国际化资源文件 四种方法
1、action范围资源文件:在action类所在路径建立 actionname_language_country.properties,适用于指定action类 如:TestAction_language_CN.properties
2、包范围资源文件:在包根路径下建立 package_language_country.properties,适用范围在properties所在包所有类,这里的package真的是直接下package,而不是包名 如:package_language_CN.properties
3、全局范围资源文件:在src下建立basename_language_country.properties,适用于整个项目 如:i18n.properties/i18n_en_US.properties/i18n_zh_CN.properties
4、临时资源文件(比较少用):在页面上使用s:i18n元素的name属性指定临时的国际化资源文件
2、需要在struts.xml中配置<constant name="struts.custom.i18n.resources" value="baseName"/>
,如果不适用全局范围资源文件的话,value可以为空,如果使用全局范围文件的话,value需要是资源文件名
3、读取优先顺序:
临时资源文件>action范围资源文件>包范围资源文件>全局范围文件
4、访问国际化资源文件步骤
(1)action类:
- 实现TextProvider接口
- 使用getText(” “)方法取值
(2)页面:
- 使用s:text标签,使用表单标签对应的key属性读取值
5、如果想要页面上直接点击按钮实现语言转换,请求action时,request_locale参数值赋值为语言简写就可以了,如:en_US
6、如果想要在标签元素的label里面读取国际化资源文件的value值,就需要用%{}进行强制的OGNL转换 如:<s:textfield name="name" label="%{getText('name')}"></s:textfield>
7、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>
<!-- 配置全局的国际化资源文件 -->
<!-- 这里的value里面的i18n是自定义的 可以是其他名字 -->
<constant name="struts.custom.i18n.resources" value="baseName"></constant>
<package name="default" namespace="/" extends="struts-default">
<action name="testAction" class="com.demo.sshtest.TestAction">
<result>/index1.jsp</result>
</action>
</package>
</struts>
这里的constant标签的value,如果不用全局资源文件来配置的话,value可以为空,也可以不为空
8、显示页面 index1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ 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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--
配置国际化资源文件 四种方法:
1、action范围资源文件:在action类所在路径建立 actionname_language_country.properties,适用于指定action类 如:TestAction_language_CN.properties
2、包范围资源文件:在包根路径下建立 package_language_country.properties,适用范围在properties所在包所有类 如:package_language_CN.properties
3、全局范围资源文件:在src下建立basename_language_country.properties,适用于整个项目 如:i18n.properties/i18n_en_US.properties
(1)文件名就叫basename_language_country.properties
(2)需要在struts.xml中配置<constant name="struts.custom.i18n.resources" value="baseName"/>
4、临时资源文件(比较少用):在页面上使用s:i18n元素的name属性指定临时的国际化资源文件
-->
<!--
资源文件加载顺序:离当前action越近,越优先打加载 即: 临时资源>基于action>基于包>基于全局
-->
<!--
在页面和action类中访问国际化资源文件步骤:
1、actino中实现TextProvider接口后,可以调用getText()方法取得值(可通过集成ActionSupport实现)
2、页面可以使用s:text标签,使用表单标签对应的key属性值实现
(1)如果由占位符,则可以使用s:text标签的s:param子标签填充占位符
(2)如果当前页面来自于action,可使用标签或OGNL直接访问action的属性值(访问值栈的属性值)
-->
<s:debug></s:debug>
<!-- 如果想在页面上直接点击按钮实现语言转换,只需要请求action时,在后面带上request_locale=语言,就可以了 -->
<a href="testAction?request_locale=en_US">English</a><br>
<a href="testAction?request_locale=zh_CN">中文</a><br>
<hr>
<br>
<!-- s:text的name属性写的是资源文件里面的属性key,s:param的value写的是action里面定义的时间参数date(即值栈里面的date对象) -->
<s:text name="datetime">
<s:param value="date"></s:param>
</s:text><br>
<!-- i18n的properties中,可以直接用\${}代替占位符,然后把值栈里面的date对象放到\${}里面,来获取对应的值 -->
<s:text name="datetime2"></s:text>
<hr>
<s:form action="">
form主题不为simple时,能用label<br>
<!-- label固定是name -->
<s:textfield name="name" label="name"></s:textfield><br>
<!--
使用OGNL强制解析
1、要label从资源文件中获取value值,就需要用 %{getText('')的方法
2、因为这时候的国际化值是对象栈中的DefaultTextProvider的一个实例,整个对象提供访问资源文件的getText()方法
3、struts2 框架label需要以 %{}包装着一个OGNL表达式getText(),强制进行OGNL解析
-->
<s:textfield name="name" label="%{getText('name')}"></s:textfield><br>
<!-- key动态从资源文件读取name值 -->
<s:textfield name="name" key="name"></s:textfield><br>
<s:password name="pswd" key="pswd"></s:password><br>
<s:submit key="submit"></s:submit>
</s:form>
<hr>
<br>
<s:form action="" theme="simple">
form主题为simple时这里label没用,所以要用s:text标签读取资源文件的值<br>
<s:text name="name"/>:<s:textfield name="name"></s:textfield><br>
<s:text name="pswd"/>:<s:password name="pswd"></s:password><br>
<!-- 遇到struts2标签 需要value里面拿值 就要用强制OGNL解析 -->
<s:submit value="%{getText('submit')}"></s:submit>
</s:form>
</body>
</html>
9、action类 TestAction.java
package com.demo.sshtest;
import java.util.Arrays;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport{
private static final long serialVersionUID = 1L;
public Date date = null;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String execute() throws Exception {
//这里定义一下date的格式 就能使前台或console输出的时候按照想要的时间格式输出
date = new Date();
//action中访问资源文件value
String name = getText("name");
String pswd = getText("pswd");
String submit = getText("submit");
//读取带占位符的值
String datetime = getText("datetime",Arrays.asList(date));
System.out.println("name:"+name);
System.out.println("pswd:"+pswd);
System.out.println("submit:"+submit);
System.out.println("datetime:"+datetime);
return "success";
}
}
10、英文资源文件 baseName_en_US.properties/package_en_US.properties/TestAction_en_US.properties
name=Username
pswd=Password
submit=submit
datetime=Time>>>{0}
datetime2=Time>>>${date}
这里为了区分三个properties文件的区别,所以会在value值的第一个字母加上数字来区分,而datetime2的date值,是直接读取值栈里面的date对象,来达到动态配置资源文件值的效果
11、中文资源文件
同上,只是value值为中文
12、项目目录
里面的index.jsp只是用来第一次打开index1.jsp的时候调用action初始化一下页面的语言值
13、运行效果
左边是eclipse的浏览器,页面默认显示语言是英文(即local值为en_US),右边是360浏览器,页面默认显示语言是中文(即local值为zh_CN)
这个是点击语言按钮后的运行结果,调用action时request_locale值为zh_CN,页面就会显示中文资源文件的对应值
14、项目demo
https://download.csdn.net/download/qq_22778717/10294774