源代碼及樣例下載地址:
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;
}
}