Ver Fonte

fix 国际化语言设置

zoujiajian há 3 anos atrás
pai
commit
9a7e43ac3e

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/UserPageLanguageMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserPageLanguage;
+
+/*
+ *项目名: netflix
+ *文件名: UserPageLanguageMapper
+ *创建者: JavaZou
+ *创建时间:2022/12/7 17:48
+ */
+public interface UserPageLanguageMapper extends BaseMapper<UserPageLanguage> {
+}

+ 39 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserPageLanguage.java

@@ -0,0 +1,39 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Optional;
+
+/*
+ *项目名: netflix
+ *文件名: UserPageLanguage
+ *创建者: JavaZou
+ *创建时间:2022/12/7 17:41
+ */
+@Getter
+@Setter
+public class UserPageLanguage extends BaseEntity {
+
+	private Long userId;
+
+
+	private Language language;
+
+	@Getter
+	public enum Language {
+		zh_CN("中文"),
+
+		en_US("英语");
+
+		String desc;
+
+		Language(String desc) {
+			this.desc = desc;
+		}
+
+		public static Boolean checkLanguage(String language) {
+			return Optional.ofNullable(Language.valueOf(language)).isPresent();
+		}
+	}
+}

+ 31 - 0
netflix-service/src/main/java/com/cyksj/common/I18nMessageUtil.java

@@ -0,0 +1,31 @@
+package com.cyksj.common;
+
+import org.springframework.context.MessageSource;
+import org.springframework.context.NoSuchMessageException;
+import org.springframework.context.i18n.LocaleContextHolder;
+import org.springframework.stereotype.Component;
+
+/*
+ *项目名: netflix
+ *文件名: I18NMessageUtil
+ *创建者: JavaZou
+ *创建时间:2022/12/7 16:38
+ */
+@Component
+public class I18nMessageUtil {
+	private static MessageSource messageSource;
+
+	private static String DEFAULT_KEY = "default_msg";
+
+	public I18nMessageUtil(MessageSource messageSource) {
+		this.messageSource = messageSource;
+	}
+
+	public static String getI18nMsg(String key) {
+		try {
+			return messageSource.getMessage(key, null, LocaleContextHolder.getLocale());
+		} catch (NoSuchMessageException e) {
+			return messageSource.getMessage(DEFAULT_KEY, null, LocaleContextHolder.getLocale());
+		}
+	}
+}

+ 24 - 0
netflix-web/src/main/java/com/cyksj/config/i18n/LocaleResolverConfig.java

@@ -0,0 +1,24 @@
+package com.cyksj.config.i18n;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.LocaleResolver;
+
+/*
+ *项目名: netflix
+ *文件名: LocaleResolver
+ *创建者: JavaZou
+ *创建时间:2022/12/7 16:16
+ */
+@Configuration
+public class LocaleResolverConfig {
+
+	/**
+	 * 注入自定义 国际化解析器
+	 */
+	@Bean
+	public LocaleResolver localeResolver() {
+		MyLocaleResolver localeResolver = new MyLocaleResolver();
+		return localeResolver;
+	}
+}

+ 51 - 0
netflix-web/src/main/java/com/cyksj/config/i18n/MyLocaleResolver.java

@@ -0,0 +1,51 @@
+package com.cyksj.config.i18n;
+
+import cn.hutool.core.util.StrUtil;
+import com.cyksj.model.entity.UserPageLanguage;
+import org.springframework.web.servlet.LocaleResolver;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Locale;
+
+/*
+ *项目名: netflix
+ *文件名: MyLocaleResolver
+ *创建者: JavaZou
+ *创建时间:2022/12/7 17:00
+ * 自定义国际化解析语言
+ */
+public class MyLocaleResolver implements LocaleResolver {
+	@Override
+	public Locale resolveLocale(HttpServletRequest request) {
+		Locale locale = Locale.getDefault();
+		{
+			//通过header解析lang优先
+			String language = request.getHeader("lang");
+			if (StrUtil.isNotBlank(language) && UserPageLanguage.Language.valueOf(language) != null) {
+				locale = new Locale(language);
+				return locale;
+			}
+		}
+		//得到cookie,解析locale
+		Cookie[] cookies = request.getCookies();
+		if (cookies != null) {
+			for (Cookie cookie : cookies) {
+				if (cookie.getName().equals("lang")) {
+					String language = cookie.getValue();
+					if (StrUtil.isNotBlank(language) && UserPageLanguage.Language.valueOf(language) != null) {
+						locale = new Locale(language);
+					}
+					continue;
+				}
+			}
+		}
+		return locale;
+	}
+
+	@Override
+	public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
+
+	}
+}

+ 3 - 7
netflix-web/src/main/java/com/cyksj/web/controller/manage/statistics/StatisticsDataController.java

@@ -7,9 +7,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
-import com.cyksj.model.excel.ExcelAccountData;
-import com.cyksj.model.views.BackgroundDataView;
-import com.cyksj.model.views.ExpiredAccountDataView;
 import com.cyksj.mapper.GroupsRelationMapper;
 import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.manage.CustomerServiceEveryMonthDetailMapper;
@@ -20,11 +17,12 @@ import com.cyksj.model.entity.GroupsRelation;
 import com.cyksj.model.entity.IncrExpiryTimeRecord;
 import com.cyksj.model.entity.StatisticsCustomerServiceEveryMonth;
 import com.cyksj.model.entity.StatisticsUserData;
+import com.cyksj.model.excel.ExcelAccountData;
 import com.cyksj.model.request.RenewTimeUpReq;
 import com.cyksj.model.views.*;
 import com.cyksj.service.mange.statistics.StatisticsDataService;
-import com.cyksj.web.util.EasyExcelUtils;
 import com.cyksj.task.OrderCustomerHandleScheduler;
+import com.cyksj.web.util.EasyExcelUtils;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.param.Operator;
@@ -34,10 +32,8 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletResponse;
-import java.util.List;
-
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;

+ 50 - 0
netflix-web/src/main/java/com/cyksj/web/controller/user/UserController.java

@@ -1,15 +1,23 @@
 package com.cyksj.web.controller.user;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.UserPageLanguageMapper;
 import com.cyksj.model.dto.UserWhoami;
+import com.cyksj.model.entity.User;
+import com.cyksj.model.entity.UserPageLanguage;
 import com.cyksj.model.request.ExchangeCodeTicket;
 import com.cyksj.service.exchange.ExchangeCodeService;
 import com.cyksj.service.user.UserService;
 import com.cyksj.web.util.StpUserUtil;
 import lombok.RequiredArgsConstructor;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Optional;
+
 /**
  * @author chan
  * @date 2021/10/11 下午11:05
@@ -23,6 +31,7 @@ public class UserController {
 
     private final ExchangeCodeService exchangeCodeService;
 
+    private final UserPageLanguageMapper userPageLanguageMapper;
 
 
     @GetMapping(value = "/wx/whoami")
@@ -43,4 +52,45 @@ public class UserController {
         return exchangeCodeService.getTicketByExchangeCode(exchangeCodeTicket, userId);
     }
 
+    /**
+     * 查询页面语言
+     */
+    @GetMapping("/get/self/language")
+    public Result<UserPageLanguage> getSelfLanguage() {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        UserPageLanguage userPageLanguage = userPageLanguageMapper.selectOne(Wrappers.lambdaQuery(UserPageLanguage.class).eq(UserPageLanguage::getUserId, userId).last("limit 1"));
+        return GatewayResponse.SUCCESS.newBuilder().toResult(userPageLanguage);
+    }
+
+
+    /**
+     * 更换页面语言
+     */
+    @PutMapping("/put/language")
+    public Result<String> updatePageLanguage(String language) {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        User user = userService.getById(userId);
+        if (user == null) {
+            throw BusinessRuntimeException.getInstance("登录信息失效,请您重新授权登录..");
+        }
+        if (!UserPageLanguage.Language.checkLanguage(language)) {
+            throw BusinessRuntimeException.getInstance("语言传递错误");
+        }
+        UserPageLanguage.Language lang = UserPageLanguage.Language.valueOf(language);
+        UserPageLanguage userPageLanguage = userPageLanguageMapper.selectOne(Wrappers.lambdaQuery(UserPageLanguage.class).eq(UserPageLanguage::getUserId, userId).last("limit 1"));
+        Optional.ofNullable(userPageLanguage).ifPresentOrElse(exits -> {
+            exits.setLanguage(lang);
+            userPageLanguageMapper.updateById(exits);
+        }, () -> {
+            try {
+                UserPageLanguage entity = new UserPageLanguage();
+                entity.setUserId(userId);
+                entity.setLanguage(lang);
+                userPageLanguageMapper.insert(entity);
+            } catch (DuplicateKeyException e) {
+
+            }
+        });
+        return GatewayResponse.SUCCESS.newBuilder().toResult("更换语言成功");
+    }
 }

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
netflix-web/src/main/resources/application-dev.yml


+ 2 - 0
netflix-web/src/main/resources/i18n/yhlx.properties

@@ -0,0 +1,2 @@
+default_msg=国际化信息返回异常
+login=登录

+ 2 - 0
netflix-web/src/main/resources/i18n/yhlx_en_US.properties

@@ -0,0 +1,2 @@
+default_msg=Internationalization information returned exception
+login=login

+ 2 - 0
netflix-web/src/main/resources/i18n/yhlx_zh_CN.properties

@@ -0,0 +1,2 @@
+default_msg=国际化信息返回异常
+login=登录

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff