源代码及样例下载地址:
http://download.csdn.net/detail/u014569459/7169385
一、功能说明:
1. 支持语言国际化
2. 支持图片文件、JS文件国际化
(未加入java代码中获取资源串信息功能,后期可以扩展补充)
二、使用说明:
1. 将jm_localization.jar(JDK 1.6编译)文件拷贝到WEB-INF目录下lib目录下
2. 将localization.tld文件拷贝到WEB-INF目录下tld目录下
3. 页面头部要包含
<%@ taglib uri="/WEB-INF/tld/localization.tld" prefix="fmt"%>
4. 资源文件的字符集为UTF-8
5. 需要在web.xml文件中配置如下servlet
<servlet>
<servlet-name>ResServlet</servlet-name>
<servlet-class>cn.jerry.mouse.ResServlet</servlet-class>
<init-param>
<param-name>resource</param-name>
<param-value>/WEB-INF/classes/resources/res</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
6. 资源文件放到src目录下的resource目录中,命令为res.properties、res_zh_CN.properties等,如果要改变目录或者文件名,则相应修改web.xml中路径配置即可。
7. 图片名称后缀要跟上语言识别,如button_login_zh_CN.gif
<input type="image"src=<fmt:file path="images/button_login.gif"/> border="0"οnclick=doLogin();>
8. js文件名称要跟上语言识别,如validation_en_US.js
样例:
<script language="JavaScript" src=<fmt:file path="js/validation.js"/>></script>
9. 使用文本标签:
样例:<fmt:message key="login.name" />
主要代码:
package cn.jerry.mouse;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpSession;
import cn.jerry.mouse.jsptag.Resource;
public class ResServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected HttpSession session;
protected ServletContext sc;
public void init(ServletConfig _config) throws ServletException {
super.init(_config);
Resource.init(_config.getServletContext()
.getRealPath("/")
+ _config.getInitParameter("resource"));
this.sc = _config.getServletContext();
}
}
package cn.jerry.mouse.jsptag;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public class Resource {
private final String PROPERTIES = ".properties";
private final String FILE_CHARACTER_SET = "UTF-8";
private static String configFile;
private String language;
public static final String SYSTEM_LANGUAGE = "system_lanuage";
private Map
propsMap = new HashMap
();
public Resource() {
}
public Resource(String _language) {
this.language = _language;
}
public Resource(Locale _locale) {
this.language = getLanguage(_locale);
}
public Resource(HttpServletRequest request) {
this.language = getLanguage(request);
}
public static void init(String _configFile) {
configFile = _configFile.replace('\\', '/');
}
public void refreshLoacle(HttpServletRequest _request) {
String localeStr = getLanguage(_request.getLocale());
if (propsMap.get(localeStr) == null) {
try {
propsMap.put(localeStr, getPropeties(localeStr));
} catch (Exception e) {
}
}
}
public String getLanguage(Locale _locale) {
if (_locale == null)
return "";
String localeString = "";
String country = _locale.getCountry();
String language = _locale.getLanguage();
if (country == null || "".equals(country))
localeString = language;
else
localeString = language + "_" + country;
return localeString;
}
/**
* 获取语言属性。 先检查session中是否有语言属性设置,再request变量中带有locale属性。
* @param request
* @return 用户选定的语言属性
*/
public String getLanguage(HttpServletRequest request) {
HttpSession session = request.getSession();
Locale locale = request.getLocale();
return getLanguage(session, locale);
}
public String getLanguage(HttpSession session, Locale locale) {
if (session.getAttribute(SYSTEM_LANGUAGE) != null)
return (String) session.getAttribute(SYSTEM_LANGUAGE);
else {
return getLanguage(locale);
}
}
public Properties getPropeties(String _language) throws Exception {
Properties props = new Properties();
File file = new File(LocalFile.getFile(configFile + PROPERTIES,
_language));
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(file), FILE_CHARACTER_SET));
String line;
while ((line = br.readLine()) != null) {
if (line.trim() != "" && line.indexOf("=") != -1) {
String key = line.split("=")[0].trim();
String value = line.split("=")[1].trim();
props.put(key, value);
}
}
br.close();
return props;
}
public String get(String _key, String _language) {
String value = "";
if (propsMap.get(_language) == null) {
try {
propsMap.put(_language, getPropeties(_language));
} catch (Exception e) {
}
}
if (propsMap.get(_language) != null) {
Properties props = propsMap.get(_language);
if (props.get(_key) != null) {
value = (String) props.get(_key);
}
}
return value;
}
public String get(String _key) {
return get(_key, language);
}
public String get(String _key, String[] _params) {
return get(_key, language, _params);
}
public String get(String _key, Locale _locale) {
String language = getLanguage(_locale);
return get(_key, language);
}
public String get(String _key, Locale _locale, String[] _params) {
String language = getLanguage(_locale);
return get(_key, language, _params);
}
/**
* @param _key 要去字符串的key
* @param _params 要替代的相关参数
* @return 资源文件对应的字符串,并且其中的{0},{1}之类用制定_params替代
*/
public String get(String _key, String _language, String[] _params) {
String value = get(_key, _language);
List
list = new ArrayList
();
char c1value; // 匹配是否为'{'
char c2value; // 匹配是否为'}'
char c3value; // 匹配是否为数字
String toReplace = null; // 存放要替换的字符串
int parameterIndex = 0; // 存放要替换字符串的数组值的索引
String[] params = _params;
if (params == null || _params.length == 0) {
return value;
}
for (int i = 0; i < value.length() - 2; i++) {
c1value = value.charAt(i);
if (c1value == '{') {
c2value = value.charAt(i + 2);
if (c2value == '}') {
c3value = value.charAt(i + 1);
if (c3value >= '0' && c3value <= '9') {
// 在{和}之前需要添加转义字符,否则在下面调用String的replaceFirst函数时会出错
// 但是如果使用jdk1.5中String的replace(String,String)方法就不用转义处理
toReplace = "\\{" + c3value + "\\}";
list.add(toReplace);
}
}
}
}
for (int i = 0; i < list.size(); i++) {
toReplace = list.get(i);
parameterIndex = toReplace.charAt(2) - '0';
if (parameterIndex <= params.length) {
value = value.replaceFirst(toReplace, params[parameterIndex]);
}
}
return value;
}
public String getLanguage() {
return language;
}
public void setLanguage(String _language) {
this.language = _language;
}
}
package cn.jerry.mouse.jsptag;
import java.io.File;
import java.util.Locale;
public class LocalFile {
/**
* 搜索文件, 搜索顺序为:
* 1.文件名+语言代码+"_"+国家代码+后缀
* 2.文件名+语言代码+后缀
* 3.文件名后缀
* @param path
* @param languageName
* @return 文件完整路径
*/
public static String getFile(String path, String languageName) {
String originalPath = path;
int dotIndex = path.lastIndexOf(".");
String pathPrefix = path.substring(0, dotIndex);
String suffix = path.substring(dotIndex);
String filePath = pathPrefix + "_" + languageName + suffix;
File file = new File(filePath);
if (!file.exists()) {
if (languageName.indexOf("_") != -1) {
filePath = pathPrefix + "_"
+ languageName.substring(0, languageName.indexOf("_")) + suffix;
file = new File(filePath);
}
if (!file.exists()) {
filePath = originalPath;
file = new File(filePath);
}
}
return file.getAbsolutePath();
}
/**
* 搜索文件, 搜索顺序为:
* 1.文件名+语言代码+"_"+国家代码+后缀
* 2.文件名+语言代码+后缀
* 3.文件名后缀
* @param path
* @param locale
* @return 文件完整路径
*/
public static String getFile(String path, Locale locale) {
return getFile(path, getLocaleString(locale));
}
public static String getLocaleString(Locale locale) {
String localeString;
String country;
String language;
if (locale == null)
return "";
else {
country = locale.getCountry();
language = locale.getLanguage();
if (country == null || "".equals(country))
localeString = language;
else
localeString = language + "_" + country;
}
return localeString;
}
}
package cn.jerry.mouse.jsptag;
import java.io.Serializable;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;
public class MessageTag implements Tag, Serializable {
private static final long serialVersionUID = 1L;
private PageContext pc = null;
private Tag parent = null;
private String key = null;
private static Resource resource = new Resource();
public void setPageContext(PageContext p) {
pc = p;
}
public void setParent(Tag t) {
parent = t;
}
public Tag getParent() {
return parent;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public int doStartTag() throws JspException {
try {
String value, language;
try {
if (pc.getSession().getAttribute(Resource.SYSTEM_LANGUAGE) != null) {
language = (String) pc.getSession().getAttribute(
Resource.SYSTEM_LANGUAGE);
value = resource.get(key, language);
} else
value = resource.get(key, pc.getRequest().getLocale());
} catch (Exception e) {
value = resource.get(key, pc.getRequest().getLocale());
}
pc.getOut().write(value);
} catch (Exception e) {
e.printStackTrace();
throw new JspTagException(e.getMessage());
}
return SKIP_BODY;
}
public int doEndTag() throws JspException {
return EVAL_PAGE;
}
public void release() {
pc = null;
parent = null;
key = null;
}
}
package cn.jerry.mouse.jsptag;
import java.io.Serializable;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;
public class SetLocaleTag implements Tag, Serializable {
private static final long serialVersionUID = 1L;
private PageContext pc = null;
private Tag parent = null;
public String language = null;
public void setPageContext(PageContext p) {
pc = p;
}
public void setParent(Tag t) {
parent = t;
}
public Tag getParent() {
return parent;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public int doStartTag() throws JspException {
pc.getSession().setAttribute(Resource.SYSTEM_LANGUAGE, language);
return SKIP_BODY;
}
public int doEndTag() throws JspException {
return EVAL_PAGE;
}
public void release() {
pc = null;
parent = null;
language = null;
}
}
package cn.jerry.mouse.jsptag;
import java.io.Serializable;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;
public class SetLocaleTag implements Tag, Serializable {
private static final long serialVersionUID = 1L;
private PageContext pc = null;
private Tag parent = null;
public String language = null;
public void setPageContext(PageContext p) {
pc = p;
}
public void setParent(Tag t) {
parent = t;
}
public Tag getParent() {
return parent;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public int doStartTag() throws JspException {
pc.getSession().setAttribute(Resource.SYSTEM_LANGUAGE, language);
return SKIP_BODY;
}
public int doEndTag() throws JspException {
return EVAL_PAGE;
}
public void release() {
pc = null;
parent = null;
language = null;
}
}