实现 resolveLocale(HttpServletRequest request) 方法,从请求中解析出 java.util.Locale 对象,方法如下:
@Override public Locale resolveLocale(HttpServletRequest request) { // <1> 获取默认的语言环境 Locale defaultLocale = getDefaultLocale(); // <2> 如果请求头 'Accept-Language' 为空,且默认语言环境不为空,则返回默认的 if (defaultLocale != null && request.getHeader("Accept-Language") == null) { return defaultLocale; } // <3> 从请求中获取 Locale 对象 `requestLocale` Locale requestLocale = request.getLocale(); // <4> 获取当前支持的 `supportedLocales` 集合 List<Locale> supportedLocales = getSupportedLocales(); // <5> 如果支持的 `supportedLocales` 集合为空,或者包含请求中的 `requestLocale` ,则返回请求中的语言环境 if (supportedLocales.isEmpty() || supportedLocales.contains(requestLocale)) { return requestLocale; } // <6> 从请求中的 Locale 们和支持的 Locale 集合进行匹配 Locale supportedLocale = findSupportedLocale(request, supportedLocales); // <7> 如果匹配到了则直接返回匹配结果 if (supportedLocale != null) { return supportedLocale; } // <8> 默认的 `defaultLocale` 不为空则直接返回,否则返回请求中获取到的 `requestLocale` 对象 return (defaultLocale != null ? defaultLocale : requestLocale); }
获取默认的语言环境
如果请求头 Accept-Language 为空,且默认语言环境不为空,则返回默认对象 defaultLocale
从请求中获取 Locale 对象 requestLocale
调用 getSupportedLocales 方法,获取当前支持的 supportedLocales 集合,默认为空
如果支持的 supportedLocales 集合为空,或者包含请求中的 requestLocale ,则返回请求中的语言环境
调用 findSupportedLocale(HttpServletRequest request, List<Locale> supportedLocales) 方法,从请求中的 Locale 们和支持的 Locale 集合进行匹配,如下:
@Nullable private Locale findSupportedLocale(HttpServletRequest request, List<Locale> supportedLocales) { Enumeration<Locale> requestLocales = request.getLocales(); Locale languageMatch = null; while (requestLocales.hasMoreElements()) { Locale locale = requestLocales.nextElement(); if (supportedLocales.contains(locale)) { if (languageMatch == null || languageMatch.getLanguage().equals(locale.getLanguage())) { // Full match: language + country, possibly narrowed from earlier language-only match return locale; } } else if (languageMatch == null) { // Let's try to find a language-only match as a fallback for (Locale candidate : supportedLocales) { if (!StringUtils.hasLength(candidate.getCountry()) && candidate.getLanguage().equals(locale.getLanguage())) { languageMatch = candidate; break; } } } } return languageMatch; }
如果匹配到了则直接返回匹配结果
默认的 defaultLocale 不为空则直接返回,否则返回请求中获取到的 requestLocale 对象
默认情况下,supportedLocales 与defaultLocale 属性都是空的,所以 AcceptHeaderLocaleResolver 使用Accept-Language 请求头来构造 Locale 对象
例如请求的请求头中会有zh-CN,zh;q=0.9数据,那么这里解析出来 Locale 对象就对应language="zh" region="CN"数据
总结本文分析了 LocaleResolver 组件,本地化(国际化)解析器,提供国际化支持。笔者实际上没有接触过该组件,因为目前的项目大多数都已经前后端分离了,这里只是浅显的介绍了该接口,感兴趣的可以去 Google 一下