目标:
在页面上只需要单独的语句<lt:Label res="res.common" key="pvg_invalid"/>,不需要用户设置,自动根据用户当前的语言环境显示不同的字符串。如简体中文环境下显示字符串“对不起,您无法访问该页面!”;在繁体中文环境下显示字符串“對不起,您無法訪問該頁面!”;在日文环境下显示“残念に思う、この機能を使用する許可を持っていない”(google来的,不知道对不对^_^)……
原理:
使用JAVA自带类java.util.ResourceBundle
资源包包含特定于语言环境的对象。当程序需要一个特定于语言环境的资源时(如 String),程序可以从适合当前用户语言环境的资源包中装入它。以这种方式可以编写很大程度上独立于用户语言环境的程序代码,它将资源包中特定于语言环境的信息隔离开来。这就使您所编写的程序可以:
· 轻松地本地化或翻译成不同的语言
· 一次处理多个语言环境
· 以后可以轻松地进行修改,支持更多的语言环境……
更详细内容参考JAVA_API文档
然后通过使用Taglib自定义标签可以封装该实现方法,从而简化页面代码。
过程:
一、在项目下新建类。
package com.ronghz.mytest;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.servlet.jsp.tagext.TagSupport;
import org.apache.log4j.Logger;
public class LabelTag extends TagSupport
{
public LabelTag()
{
logger = Logger.getLogger((com.ronghz.mytest.LabelTag.class).getName());
res = "";
key = "";
}
public void setRes(String res)
{
this.res = res;
}
public void setKey(String key)
{
this.key = key;
}
public int doEndTag()
{
try
{
String str = "";
Locale locale = Locale.getDefault();
try{
//关键代码
ResourceBundle rb = ResourceBundle.getBundle(res, locale);
str = rb.getString(key);
//如果资源文件的编码与JSP页面的编码不一致,需要进行转码
str = new String(str.getBytes("ISO8859-1"), "utf-8");
}catch(Exception e){
logger.error("LoadString: resource=" + res + " key=" + key + " " + e.getMessage());
e.printStackTrace();
}
//��页面上输出字符串
pageContext.getOut().print(str);
}
catch(Exception e)
{
logger.error(e.getMessage());
}
return EVAL_PAGE;
}
Logger logger;
String res;
String key;
}
其中变量“res”,“key”是标签里定义的属性。res表示资源文件的路径和文件文件名,key是res所指定的资源文件里的其中一个值。
该函数返回值是 EVAL_PAGE . EVAL_PAGE是一个预定义的整型常量,它指示容器处理页面的剩下部分。另一种选项就是使用 SKIP_PAGE,它将中止对页面剩下部分的处理。如果您要将控制转移到另一个页面,例如您要前进(forward)或者重定向(redirect)用户,那么只需要使用 SKIP_PAGE。
二、创建TLD文件
路径:WebContent\WEB-INF\tlds\
文件名:LabelTag.tld
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<!-- a tag library descriptor -->
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>LabelTag</shortname>
<uri></uri>
<info>LabelTag</info>
<tag>
<name>Label</name>
<tagclass>com.ronghz.mytest.LabelTag</tagclass>
<bodycontent>JSP</bodycontent>
<info>LabelTag</info>
<attribute>
<name>res</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>key</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
三、创建语言资源
路径:\WebContent\WEB-INF\classes\res\
文件名:文件名_国家_语言.properties
如common_zh_CN.properties,common_ja_JP.properties
更详细说明参考:http://www.leftworld.net/online/j2sedoc/javaref/java.util.resourcebundle_dsc.htm
文件内容:
key=value
如:pvg_invalid=对不起,您无法访问该页面!
pvg_invalid=残念に思う、この機能を使用する許可を持っていない
pvg_invalid=<strong>对不起,您无法访问该页面!<strong>
……
四、使用自定义标签
页面开头加入
<%@ taglib uri="/WEB-INF/tlds/LabelTag.tld" prefix="lt"%>
在需要显示文字的地方加入
<lt:Label res="res.common" key="pvg_invalid"/>
“lt”是在该页面定义的“前缀”。
“Label”是在TLD文件中定义的“name”属性。在同一个TLD文件中,可以类可以定义多个不同的<name>。
“res”资源文件相对于\WebContent\WEB-INF\classes\的相对路径和文件名,文件名不包括国家和语言部分。
如果所指定的res或key不存在,会报Can't find resource for bundle java.util.PropertyResourceBundle的错