A.MessageSource的体系结构:
【HierarchicalMessageSource接口】
添加了两个方法,建立父子层级的MessageSource结构。该接口的setParentMessageSource (..)方法用于设置父MessageSource,而getParentMessageSource()方法用于返回父MessageSource。
【ResourceBundleMessageSource和ReloadableResourceBundleMessageSource】
它们基于Java的ResourceBundle基础类实现,可以通过资源名加载国际化资源。ReloadableResourceBundleMessageSource提供了定时刷新功能,允许在不重启系统的情况下,更新资源的信息。StaticMessageSource主要用于程序测试,它允许通过编程的方式提供国际化信息。而DelegatingMessageSource是为方便操作父MessageSource而提供的代理类。
使用示例
ResourceBundleMessageSource,结合了JDK中ResourceBundle和MessageFormat的功能
示例:
国际化文件:msg_en_us.properties
# 国际化文件 msg_en_us.properties
description=He is {0},He has {1,number,currency}
controller代码示例:
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
// 国际化文件地址
source.setBasename("msg");
String result=source.getMessage("description", new Object[]{19, 12.34}, Locale.US);
System.out.println(result);
// ====输出===
He is 19,He has $12.34
B.MessageSource接口定义:
public interface MessageSource {
//code表示国际化资源中的属性名;args用于传递格式化串占位符所用的运行期参数;
//当在资源找不到对应属性名时,返回defaultMessage参数所指定的默认信息;
//locale表示本地化对象;
String getMessage(String code, Object[] args, String defaultMessage, Locale locale);
//与上面的方法类似,只不过在找不到资源中对应的属性名时,
//直接抛出NoSuchMessageException异常;
String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException;
//将属性名、参数数组以及默认信息封装起来,它的功能和第一个接口方法相同。
String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;
}
C.封装工具类方法
import org.springframework.context.support.ResourceBundleMessageSource;
import java.util.Locale;
/**
* 用户信息相关工具类
*
* @author Weijuer
* @create 2018-01-15 11:02
*/
public class MessageSourceUtils {
// 日志
private static final String tag = MessageSourceUtils.class.getName();
/**
* 获取国际化文件中国际化字段信息
* @param key
* @param args
* @return
*/
public static String getMessageByKey(String key, Object[] args) {
// 读取国际化文件
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
// 国际化文件位置
messageSource.setBasename("messages");
String result = "";
try {
// 获取默认国际化标识
Locale locale = LocaleContextHolder.getLocale();
System.out.println("locale:===>" + locale);
LogUtil.i(tag, "MessageSourceUtils #getMessageByKey ~getMessage @start $key:===>" + key);
LogUtil.i(tag, "MessageSourceUtils #getMessageByKey ~getMessage @start $locale:===>" + locale);
// 获取国际化key-value
result = messageSource.getMessage(key, args, "暂无国际化", locale);
LogUtil.i(tag, "MessageSourceUtils #getMessageByKey ~getMessage @end $result:===>" + result);
} catch (Exception e) {
e.printStackTrace();
LogUtil.i(tag, "MessageSourceUtils #getMessageByKey ~getMessage @error $error:===>" + e.getMessage());
}
return result;
}
}