应用程序国际化
资源文件和资源包
要用Struts实现国际化和本地化,首先要定义资源文件的名称,这个文件会包含用默认语言编写的会在程序中出现的所有消息。这些消息以”键-值“对的形式存储,如下:
error.validation.localtion = The entered
location is invalid
当对一个应用程序进行国际化处理时,所要用的各种语言版本的”标签“信息应该存放在不同的属性文件中,每一个这样的文件对应一种语言版本。所有属性文件合在一起称为资源包(Resource Bundle)。
属性文件的命名格式可分为以下两种:
a)文件名前缀.properties
b)文件名前缀_语言种类.properties
文件名后缀必须是properties,前缀可自由书写,其中语言种类字段必须是有效的ISO语言代码。文件名前缀.properties默认的形式,当其他属性文件找不到时,会默认的寻找此属性文件
如何实现应用程序国际化
配置全局资源与输出国际化信息
1、 准备资源文件
2 、在struts.xml中使用struts.custom.i18n.resources常量即可加载全局资源文件
1 <constant name="struts.custom.i18n.resources" value="cn.itcast.i18n.resource" />
resource为资源文件的基本名。
3、在jsp页面获取国际化的资源文件的信息
使用text标签: 用来显示一条国际化消息的数据标签. 相当于从property标签调用 getText 方法. 该标签包含如下属性:
* name: 用来检索消息的键
* var:用来引用压入 ContextMap 栈的值的变量名
* 可以通过 param 子标签向 text 标签传递参数
1 <s:text name="item.username"/>
全局资源文件中含有占位符
使用text标签传递参数:
资源文件的信息
item.test={0},欢迎,{1}
jsp页面
<s:text name="item.test">
<s:param>用户名</s:param> {0}
<s:param>密码</s:param> {1}
</s:text>
输出结果:
用户名,欢迎,密码
在action中获取资源文件的信息
ActionSupport 类实现了 TextProvider 接口, 该接口负责提供对各种资源包和它们的底层文本消息的访问机制.
当调用 getText() 方法时, 它将按以下顺序搜索相关的属性文件.
1 <%@ page language="java" pageEncoding="UTF-8"%> 2 <%@ taglib uri="/struts-tags" prefix="s" %> 3 <html> 4 <head> 5 <title>My JSP 'login.jsp' starting page</title> 6 </head> 7 <body> 8 <br> 9 <s:text name="item.username"/><br> 10 11 <!-- item.test={0} 是 {1} --> 12 <s:text name="item.test"> 13 <s:param>用户名0</s:param> 14 <s:param>密码1</s:param> 15 </s:text> 16 </body> 17 </html>
国际化—JSP中直接访问某个资源文件
i18n 标签: 用来加载一个自定义的 ResourceBundle.不用做任何配置,不用在struts.xml配
name: 将被加载的资源集的 java 完全限定名
1 <s:i18n name=“resource"> 2 <s:text name=“item.username”/> 3 </s:i18n> 4 resource为类路径下资源文件的基本名。
如果要访问的资源文件在类路径的某个包下,可以这样访问:
1 <s:i18n name=“cn.itcast.i18n.resource"> 2 <s:text name=“item.test"> 3 <s:param>小张</s:param> 4 </s:text> 5 </s:i18n> 6 上面访问cn.itcast.i18n包下基本名为resource的资源文件。
i18n.jsp
1 <%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=utf-8"%> 2 <%@ taglib uri="/struts-tags" prefix="s" %> 3 <html> 4 <head> 5 <title>My JSP 'login.jsp' starting page</title> 6 </head> 7 <body> 8 <s:i18n name="cn.itcast.i18n.resources"> 9 <form name="loginForm" method="post" 10 action="${pageContext.request.contextPath}/i18n/i18nAction_login.action"> 11 <table border="1"> 12 <tr> 13 <td><s:text name="items.username" /></td> 14 <td><input type="text" name="username"/></td> 15 </tr> 16 <tr> 17 <td><s:text name="items.psw" /></td> 18 <td><input type="password" name="psw"/></td> 19 </tr> 20 <tr> 21 <td> </td> 22 <td><input type="submit" value="<s:text name='items.login'/>"/></td> 23 </tr> 24 </table> 25 <form> 26 </s:i18n> 27 </body> 28 </html>
使用 native2ascii 程序转换字符编码
JDK 中提供了一个 native2ascii 工具程序,它可以将某种本地字符集编码的字符转换成 Unicode 转义序列的形式
DOS 下进入 test_cn_backup.properties文件所在目录,运行下面的命令后将在当前目录下生成一个名为 test_zh_CN.properites 文件:
1 native2ascii -encoding gb2312 源文件 目标文件.properites 2 native2ascii -encoding gb2312 test_cn_backup.txt test_zh_CN.properites
样例代码:
1、jsp
login.jsp
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=utf-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <html> <head> <title>My JSP 'login.jsp' starting page</title> </head> <body> <form name="loginForm" method="post" action="${pageContext.request.contextPath}/i18n/i18nAction_login.action"> <table border="1"> <tr> <td><s:text name="items.username" /></td> <td><input type="text" name="username"/></td> </tr> <tr> <td><s:text name="items.psw" /></td> <td><input type="password" name="psw"/></td> </tr> <tr> <td> </td> <td><input type="submit" value="<s:text name='items.login'/>"/></td> </tr> </table> <form> </body> </html>
success.jsp
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'login.jsp' starting page</title> </head> <body> <br> 成功!!!!!!!!!!!!!<br> <h1>xxxxxxxxxx</h1> </body> </html>
i18n.jsp
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=utf-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <html> <head> <title>My JSP 'login.jsp' starting page</title> </head> <body> <s:i18n name="cn.itcast.i18n.resources"> <form name="loginForm" method="post" action="${pageContext.request.contextPath}/i18n/i18nAction_login.action"> <table border="1"> <tr> <td><s:text name="items.username" /></td> <td><input type="text" name="username"/></td> </tr> <tr> <td><s:text name="items.psw" /></td> <td><input type="password" name="psw"/></td> </tr> <tr> <td> </td> <td><input type="submit" value="<s:text name='items.login'/>"/></td> </tr> </table> <form> </s:i18n> </body> </html>
testParam.jsp
<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <html> <head> <title>My JSP 'login.jsp' starting page</title> </head> <body> <br> <s:text name="item.username"/><br> <!-- item.test={0} 是 {1} --> <s:text name="item.test"> <s:param>用户名0</s:param> <s:param>密码1</s:param> </s:text> </body> </html>
2、java
I18nAction.java
import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") public class I18nAction extends ActionSupport { public String login(){ System.out.println("I18nAction ************* login()"); String username = this.getText("items.username"); System.out.println("username = "+username); String psw = this.getText("items.psw"); System.out.println("password = "+psw); return "success"; } }
3、xml
struts_i18n.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> <package name="i18n" namespace="/i18n" extends="struts-default"> <action name="i18nAction_login" class="cn.itcast.i18n.I18nAction" method="login"> <result name="success">/i18n/success.jsp</result> </action> </package> </struts>
struts.xml
<constant name="struts.custom.i18n.resources"value="cn.zengfansheng.i18n.resources</constant> <include file="cn/zengfansheng/struts/i18n/struts_i18n.xml"></include>
4、properties
resources.properties
items.username=username items.psw=password items.login=login item.test={0}hacket{1}
resources_zh_CN.properties
items.username=username_en items.psw=password_en items.login=login_en item.test={0}\u5C0F\u52DD{1}
resources_en_US.properties
items.username=\u7528\u6237\u540D items.psw=\u5BC6\u7801 items.login=\u767B\u5F55 item.test={0}xiaosheng_en{1}