MessageSource
由于ApplicationContext
继承了MessageSource
接口, 所以容器也具备了相应的功能.
所谓国际化, 就是根据不同的国家或地区, 用与之相对应的语言来输出消息.即在中国则输出汉字描述的信息, 在英国, 则输出英文描述的消息.
MessageSource接口中定义的方法
-
String getMessage(String code, Object[] args, String default, Locale loc)
: 从MessageSource
中获取消息,如果没有找到, 则使用默认值.传入的任何参数都将被标准库提供的MessageFormat的相应的值替换. -
String getMessage(String code, Object[] args, Locale loc)
: 与前者一样,不同的是它没有提供默认址,如果没有找到相应的值, 会抛出NoSuchMessageException
. -
String getMessage(MessageSourceResolvable resolvable, Locale loc)
: 前面方法中的所有属性都将被封装在MessageSourceResolvalbe
类中.
实现方式
a. 声明MessageSource bean
<beans>
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>format</value>
<value>exceptions</value>
<value>windows</value>
</list>
</property>
</bean>
</beans>
MessageSource配置说明:
- basenames接收的是一个可变的String数组
- basenames接收的值要包含相应文件的路径, 如文件定义在
resource/message
目录下, 则如上面的format
文件则应定义为message/format
. - Spring还提供了
ResourceBundleMessageSource
(示例中的比其更灵活)和StaticMessageSource
(常用于编程式).
b. 创建相应的properties文件
文件名要根据不同的地区添加相应的后缀, 如format文件, 对应中国(china), 则为format_zh_CN
, 对应英国(english), 则为format_en
.
文件中的key
即为getMessage
方法中的code
参数. 在value中可用{index}
(从0开始)引用getMessage
方法中的args
参数.
c. 使用
在用到的类中注入MessageSource
, 调用其getMessage
方法获取相应文件中定义的code对应的value.
网友评论