需要這個功能,但是卻發現gnu提供的,還是sun的ResourceBundle都不是怎么好用,所以根據需要在resourceBundle的基礎上封裝了一下。
import static com.csair.hunan.common.I18NUtils._;
//
System.out.println(_("msgId"));
不過還欠缺一點功能:對于翻譯文本中數字參數等的支持,需要加強
package com.csair.hunan.common;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
/**
* gettext支持類
* 主要功能:可以自動獲取調用者信息,從而自動的根據local尋找resource
* (1) 查找和類名相同的properties文件
* (2) 如果(1)失敗,則默認查找調用者包中的message.properties文件
* 如果找不到相應的key,不拋出異常,而是返回msgId
* 另外它支持msgId帶空格,但是在properties文件中,必須把空格全部替換成下劃線
* @author Alva
*
*/
public class I18NUtils {
/* A static instance holding the message */
//multi-thread safety?
public static final ThreadLocal resPool = new ThreadLocal();
public static final ThreadLocal callerPool = new ThreadLocal();
@SuppressWarnings("unchecked")
public static String _(String s) {
//get the direct caller class - FIXME how to deal with extend?
Class caller = sun.reflect.Reflection.getCallerClass(2);
ResourceBundle resourceBundle = (ResourceBundle)resPool.get();
//if no resourcebundle or the caller changed
//initial a new resource bundle
if(resourceBundle == null || !caller.equals(callerPool.get())) {
try {
// first try the property file who with the same name with the caller class
resourceBundle = ResourceBundle.getBundle(caller.getCanonicalName());
} catch(MissingResourceException missingresourceexception) {
try {
//find the default: package
resourceBundle = ResourceBundle.getBundle(caller.getPackage().getName() + ".message");
} catch (MissingResourceException e) {
//do nothing, just suppress the exception, omit the missed resource
}
}
resPool.set(resourceBundle);
//record the new caller
callerPool.set(caller);
}
try
{
// replace key's blank
String s1 = (String)resourceBundle.getObject(s.trim().replaceAll("\\p{Blank}+", "_"));
if(s1 != null)
return s1;
}
catch(MissingResourceException missingresourceexception) { }
return s;
}
}
使用起來很方便,在需要使用的類中import java.util.MissingResourceException;
import java.util.ResourceBundle;
/**
* gettext支持類
* 主要功能:可以自動獲取調用者信息,從而自動的根據local尋找resource
* (1) 查找和類名相同的properties文件
* (2) 如果(1)失敗,則默認查找調用者包中的message.properties文件
* 如果找不到相應的key,不拋出異常,而是返回msgId
* 另外它支持msgId帶空格,但是在properties文件中,必須把空格全部替換成下劃線
* @author Alva
*
*/
public class I18NUtils {
/* A static instance holding the message */
//multi-thread safety?
public static final ThreadLocal resPool = new ThreadLocal();
public static final ThreadLocal callerPool = new ThreadLocal();
@SuppressWarnings("unchecked")
public static String _(String s) {
//get the direct caller class - FIXME how to deal with extend?
Class caller = sun.reflect.Reflection.getCallerClass(2);
ResourceBundle resourceBundle = (ResourceBundle)resPool.get();
//if no resourcebundle or the caller changed
//initial a new resource bundle
if(resourceBundle == null || !caller.equals(callerPool.get())) {
try {
// first try the property file who with the same name with the caller class
resourceBundle = ResourceBundle.getBundle(caller.getCanonicalName());
} catch(MissingResourceException missingresourceexception) {
try {
//find the default: package
resourceBundle = ResourceBundle.getBundle(caller.getPackage().getName() + ".message");
} catch (MissingResourceException e) {
//do nothing, just suppress the exception, omit the missed resource
}
}
resPool.set(resourceBundle);
//record the new caller
callerPool.set(caller);
}
try
{
// replace key's blank
String s1 = (String)resourceBundle.getObject(s.trim().replaceAll("\\p{Blank}+", "_"));
if(s1 != null)
return s1;
}
catch(MissingResourceException missingresourceexception) { }
return s;
}
}
import static com.csair.hunan.common.I18NUtils._;
//
System.out.println(_("msgId"));
不過還欠缺一點功能:對于翻譯文本中數字參數等的支持,需要加強