Spring国际化原理浅析
最近在做Spring国际化,虽然之前知道Spring是支持国际化的,但是在配置的时候遇到了一些问题,所以看了一些源码,简单记录一下。
quick start
- 配置i18n的basename,例如
spring.messages.basename=i18n/message
注意这个basename并不是路径,而是路径+i18n文件的前缀,所以这样配置会匹配到i18n/message_en_US.properties
,i18n/message_zh_CN.properties
等等。 - 配置locale的解析类和interceptor,用来获取要转换的locale.
localeResolver有三种,cookie,session,fixed,根据需求配置/** * localResolver */ @Bean public LocaleResolver localeResolver() { SessionLocaleResolver slr = new SessionLocaleResolver(); slr.setDefaultLocale(Locale.US); return slr; } /** * local change的拦截器 */ @Bean public LocaleChangeInterceptor localeChangeInterceptor() { LocaleChangeInterceptor lci = new LocaleChangeInterceptor(); lci.setParamName("lang"); return lci; }
- 在对应的模板中使用相应的方式去获取。
比如velocity中就是#springMessage('xxx')
, 在thymleaf中就是<h1 th:text="#{greeting}"></h1>
原理
根本原理是根据国际化获取对应的ResourceBundle,如果为空,则默认去message.properties.