|
@@ -1,9 +1,10 @@
|
|
|
package com.citu.framework.i18n.config;
|
|
|
|
|
|
-import org.springframework.context.i18n.LocaleContextHolder;
|
|
|
import org.springframework.http.HttpHeaders;
|
|
|
import org.springframework.util.StringUtils;
|
|
|
import org.springframework.web.servlet.HandlerInterceptor;
|
|
|
+import org.springframework.web.servlet.LocaleResolver;
|
|
|
+import org.springframework.web.servlet.support.RequestContextUtils;
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
@@ -11,31 +12,86 @@ import java.util.Locale;
|
|
|
|
|
|
/**
|
|
|
* 国际化切换拦截
|
|
|
+ *
|
|
|
* @author rayson
|
|
|
**/
|
|
|
public class LocaleInterceptor implements HandlerInterceptor {
|
|
|
|
|
|
+// @Override
|
|
|
+// public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
|
|
|
+// String language = request.getHeader(HttpHeaders.ACCEPT_LANGUAGE);
|
|
|
+// Locale locale = Locale.getDefault();
|
|
|
+//
|
|
|
+// if (StringUtils.hasText(language)
|
|
|
+// && !language.trim().equals(Locale.SIMPLIFIED_CHINESE.toString())
|
|
|
+// ) {
|
|
|
+// String[] langParts = language.split("_");
|
|
|
+// if (langParts.length == 2) {
|
|
|
+// locale = new Locale(langParts[0], langParts[1]);
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// LocaleContextHolder.setLocale(locale);
|
|
|
+//
|
|
|
+// return true;
|
|
|
+// }
|
|
|
+//
|
|
|
+// @Override
|
|
|
+// public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
|
|
|
+// LocaleContextHolder.resetLocaleContext();
|
|
|
+// }
|
|
|
+
|
|
|
@Override
|
|
|
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
|
|
|
+ LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
|
|
|
+ if (localeResolver == null) {
|
|
|
+ throw new IllegalStateException("No LocaleResolver found: not in a DispatcherServlet request?");
|
|
|
+ }
|
|
|
+
|
|
|
String language = request.getHeader(HttpHeaders.ACCEPT_LANGUAGE);
|
|
|
- Locale locale = Locale.getDefault();
|
|
|
-
|
|
|
- if (StringUtils.hasText(language)
|
|
|
- && !language.trim().equals(Locale.SIMPLIFIED_CHINESE.toString())
|
|
|
- ) {
|
|
|
- String[] langParts = language.split("_");
|
|
|
- if (langParts.length == 2) {
|
|
|
- locale = new Locale(langParts[0], langParts[1]);
|
|
|
- }
|
|
|
+ Locale locale = null;
|
|
|
+
|
|
|
+ if (StringUtils.hasText(language)) {
|
|
|
+ locale = parseAcceptLanguageHeader(language);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (locale == null) {
|
|
|
+ // 如果无法解析语言头或者解析失败,则使用默认语言
|
|
|
+ locale = Locale.getDefault();
|
|
|
}
|
|
|
|
|
|
- LocaleContextHolder.setLocale(locale);
|
|
|
+ localeResolver.setLocale(request, response, locale);
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
|
|
|
- LocaleContextHolder.resetLocaleContext();
|
|
|
+ private Locale parseAcceptLanguageHeader(String languageHeader) {
|
|
|
+ String[] langParts = languageHeader.split(",");
|
|
|
+ Locale locale = null;
|
|
|
+ double highestQuality = Double.MIN_VALUE;
|
|
|
+
|
|
|
+ for (String lang : langParts) {
|
|
|
+ String[] languagePriority = lang.trim().split(";q=");
|
|
|
+ String langTag = languagePriority[0];
|
|
|
+ double quality = (languagePriority.length > 1) ? Double.parseDouble(languagePriority[1]) : 1.0;
|
|
|
+
|
|
|
+ Locale candidateLocale = parseLocale(langTag);
|
|
|
+ if (candidateLocale != null && quality > highestQuality) {
|
|
|
+ locale = candidateLocale;
|
|
|
+ highestQuality = quality;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return locale;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Locale parseLocale(String languageTag) {
|
|
|
+ String[] langParts = languageTag.split("-");
|
|
|
+ if (langParts.length == 1) {
|
|
|
+ return new Locale(langParts[0]);
|
|
|
+ } else if (langParts.length == 2) {
|
|
|
+ return new Locale(langParts[0], langParts[1]);
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
}
|
|
|
-}
|
|
|
+}
|