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.propertiesdescription=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; }}