四种语言解析器
AcceptHeaderLocaleResolver
它是SpringMVC默认的语言解析方式,它解析的是客户端请求头里的Accept-Language。
CookieLocaleResolver
它是把语言设定放到客户端的cookie中,每次请求时进行解析。 修改方式:
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
if (localeResolver instanceof CookieLocaleResolver) {
localeResolver.setLocale(request, response, locale);
}
SessionLocaleResolver
它把语言设定到服务器的session里,修改方式如下:
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, locale);
FixedLocaleResolver
这是一种固定语言的解析器.
一般工具类
@Component
public class LocaleMessageSourceService {
@Resource
private MessageSource messageSource;
public String getMessage(String code, String defaultMessage) {
return getMessage(code, null, defaultMessage);
}
public String getMessage(String code, String defaultMessage, Locale locale) {
return getMessage(code, null, defaultMessage, locale);
}
public String getMessage(String code, Locale locale) {
return getMessage(code, null, "", locale);
}
public String getMessage(String code) {
return getMessage(code, new Object[]{});
}
public String getMessage(String code, Object[] args) {
return getMessage(code, args, "");
}
public String getMessage(String code, Object[] args, Locale locale) {
return getMessage(code, args, "", locale);
}
public String getMessage(String code, Object[] args, String defaultMessage) {
Locale locale = LocaleContextHolder.getLocale();
return getMessage(code, args, defaultMessage, locale);
}
public String getMessage(String code, Object[] args, String defaultMessage, Locale locale) {
return messageSource.getMessage(code, args, defaultMessage, locale);
}
}
初始化基本流程
当我声明一个解析器 SessionLocaleResolver时,DispacherServlet在初始化LocaleResover设置到本地
在处理请求时,下面两步分别是获取LocalContex 和设置到LocaleContextHolder中
来看获取部分,这里使用前面从上下文得到的解析器处理,就是SessionLocaleResolver:
它就是SessionLocaleResolver,它的resolveLocale函数有两种方式
方式1是得到 SessionLocaleResolver.class.getName() + ".LOCALE"; 的对象
方式2是使用默认设定的语言
所以SessionLocaleResolver要改语言使用如下方式。
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, locale);