package message.config;
import message.base.utils.ApplicationContextUtil;
import message.base.utils.ApplicationHelper;
import message.config.exception.ConfigException;
import message.config.i18n.DefaultResourceBundleMessageSource;
import message.utils.StringUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.DelegatingMessageSource;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
/**
* 国际化资源文件工具类
*
* @author sunhao(sunhao.java@gmail.com)
* @version V1.0
* @createTime 2012-3-14 下午07:59:37
*/
public class MessageUtils {
//国际化资源文件处理类在spring上下文中的key
private static final String DEFAULT_MESSAGE_SOURCE = "messageSource";
private static DefaultResourceBundleMessageSource bundleMessageSource = null;
private static final Object lockObject = new Object();
private static Map<Locale, Map<String, String>> allMessagesMap = new HashMap<Locale, Map<String, String>>();
static {
synchronized (lockObject) {
Object obj = ApplicationHelper.getInstance().getBean(DEFAULT_MESSAGE_SOURCE);
if (obj instanceof DefaultResourceBundleMessageSource)
bundleMessageSource = (DefaultResourceBundleMessageSource) obj;
else if (obj instanceof DelegatingMessageSource) {
DelegatingMessageSource delegatingMessageSource = (DelegatingMessageSource) obj;
Object obj2 = delegatingMessageSource.getParentMessageSource();
if (obj2 instanceof DefaultResourceBundleMessageSource)
bundleMessageSource = (DefaultResourceBundleMessageSource) obj2;
else
throw new ConfigException(10007, "can not find any messageSource what is DefaultResourceBundleMessageSource!");
}
}
}
/**
* get message by locale, and format with args
*
* @param code 键
* @param locale 语言
* @param defaultMessage String to return if the lookup fails
* @param args 参数
* @return
*/
public static String getMessage(String code, Locale locale, String defaultMessage, String... args) {
ApplicationContext conetnt = ApplicationContextUtil.getContext();
return conetnt.getMessage(code, args, defaultMessage, locale);
}
/**
* get message by locale, and format with args
*
* @param code 键
* @param locale 语言
* @param args 参数
* @return
*/
public static String getMessage(String code, Locale locale, String... args) {
ApplicationContext conetnt = ApplicationContextUtil.getContext();
return conetnt.getMessage(code, args, StringUtils.EMPTY, locale);
}
/**
* get message by locale, and format with args
*
* @param code 键
* @param args 参数
* @return
*/
public static String getMessage(String code, String... args) {
ApplicationContext conetnt = ApplicationContextUtil.getContext();
return conetnt.getMessage(code, args, StringUtils.EMPTY, Locale.getDefault());
}
/**
* get message by locale, and format with args
*
* @param code 键
* @return
*/
public static String getMessage(String code) {
ApplicationContext conetnt = ApplicationContextUtil.getContext();
return conetnt.getMessage(code, Collections.emptyList().toArray(new String[0]), StringUtils.EMPTY, Locale.getDefault());
}
/**
* 获取locale语言下所有的message
*
* @param locale
* @return
*/
public static Map<String, String> getMessages(Locale locale) {
if (locale == null)
locale = Locale.getDefault();
Map<String, String> allMessages = allMessagesMap.get(locale);
if (allMessages != null)
return allMessages;
ResourceBundle bundle = bundleMessageSource.getResourceBundle(locale);
Enumeration<String> keys = bundle.getKeys();
Map<String, String> messages = new HashMap<String, String>();
for (; keys.hasMoreElements(); ) {
String key = keys.nextElement();
String message = bundle.getString(key);
messages.put(key, message);
}
allMessagesMap.put(locale, messages);
return messages;
}
}