فهرست منبع

1、解决国际化错误问题

rayson 1 سال پیش
والد
کامیت
b092f959f9

+ 71 - 15
citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/i18n/config/LocaleInterceptor.java

@@ -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;
+        }
     }
-}
+}