From ecfa89c7c573c085ceda23d160dace8c0b080892 Mon Sep 17 00:00:00 2001 From: b2baccline <23131013+b2baccline@users.noreply.github.com> Date: Wed, 4 Aug 2021 22:03:45 +0800 Subject: [PATCH] =?UTF-8?q?:recycle:=20=E9=87=8D=E6=9E=84=20i18n=20?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=96=B0=E5=A2=9E=20common-i18n?= =?UTF-8?q?=EF=BC=8Cballcat-i18n=EF=BC=8C=E7=A7=BB=E9=99=A4=E5=8E=9F?= =?UTF-8?q?=E5=85=88=E7=9A=84=20extend-i18n=EF=BC=8C=E4=BB=A5=E5=8F=8A=20i?= =?UTF-8?q?18n-starter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ballcat-admin/ballcat-admin-i18n/pom.xml | 4 - .../i18n/config/I18NGlobalException.java | 186 --------------- .../i18n/config/I18nAdminProperties.java | 27 --- .../admin/i18n/config/I18nResponseAdvice.java | 53 ----- .../admin/i18n/config/LocaleConfig.java | 58 ----- ballcat-common/ballcat-common-i18n/pom.xml | 44 ++++ .../common/i18n/DynamicMessageSource.java | 32 +++ .../hccake/ballcat/common/i18n/I18nClass.java | 15 ++ .../hccake/ballcat/common/i18n/I18nField.java | 32 +++ .../ballcat/common/i18n/I18nMessage.java | 28 +++ .../common/i18n/I18nMessageProvider.java | 20 ++ .../common/i18n/I18nResponseAdvice.java | 134 +++++++++++ .../MessageSourceHierarchicalChanger.java | 41 ++++ .../i18n/DefautlI18nMessageProvider.java | 34 +++ ballcat-common/ballcat-common-model/pom.xml | 19 +- .../hccake/ballcat/common/model/result/R.java | 3 +- ballcat-common/pom.xml | 3 +- ballcat-dependencies/pom.xml | 36 +-- .../common/i18n/annotation/I18nField.java | 31 --- .../hccake/common/i18n/I18nDataProvider.java | 34 --- .../hccake/common/i18n/I18nProperties.java | 69 ------ .../common/i18n/cache/CacheService.java | 38 --- .../common/i18n/cache/LocalCacheService.java | 38 --- .../common/i18n/cache/RedisCacheService.java | 43 ---- .../execute/AbstractTranslateExecute.java | 84 ------- .../i18n/execute/DefaultTranslateExecute.java | 216 ------------------ .../common/i18n/execute/TranslateExecute.java | 56 ----- .../i18n/execute/TranslateExecuteWrapper.java | 42 ---- .../common/i18n/executor/CacheExecutor.java | 73 ------ .../hccake/common/i18n/executor/Executor.java | 33 --- .../common/i18n/executor/ExecutorWrapper.java | 47 ---- .../common/i18n/executor/SimpleExecutor.java | 29 --- .../i18n/generate/DefaultKeyGenerate.java | 28 --- .../common/i18n/generate/KeyGenerate.java | 17 -- .../i18n/handler/SimpleTranslateHandler.java | 20 -- .../handler/TemplateTranslateHandler.java | 21 -- .../common/i18n/handler/TranslateHandler.java | 20 -- .../i18n/handler/TranslateHandlerHolder.java | 77 ------- .../hccake/common/i18n/model/I18nItem.java | 45 ---- .../common/i18n/model/I18nValueItem.java | 25 -- ballcat-extends/ballcat-extend-i18n/pom.xml | 18 -- ballcat-extends/pom.xml | 1 - ballcat-i18n/ballcat-i18n-biz/pom.xml | 25 ++ .../ballcat/i18n/mapper/I18nDataMapper.java | 49 ++++ .../provider/CustomI18nMessageProvider.java | 35 +++ .../ballcat/i18n/service/I18nDataService.java | 33 +++ .../service/impl/I18nDataServiceImpl.java | 43 ++++ .../resources/mapper/i18n/I18nDataMapper.xml | 40 ++++ .../ballcat-i18n-controller}/pom.xml | 17 +- .../i18n/controller/I18nDataController.java | 87 +++++++ ballcat-i18n/ballcat-i18n-model/pom.xml | 25 ++ .../i18n/converter/I18nDataConverter.java | 25 ++ .../ballcat/i18n/model/entity/I18nData.java | 82 +++++++ .../ballcat/i18n/model/qo/I18nDataQO.java | 24 ++ .../ballcat/i18n/model/vo/I18nDataPageVO.java | 74 ++++++ .../pom.xml | 14 +- .../ballcat-spring-boot-starter-i18n/pom.xml | 32 --- .../common/i18n/I18nAutoConfiguration.java | 89 -------- .../main/resources/META-INF/spring.factories | 2 - ballcat-starters/pom.xml | 1 - ballcat-system/ballcat-system-model/pom.xml | 4 + .../system/model/vo/SysMenuPageVO.java | 5 + .../system/model/vo/SysMenuRouterVO.java | 4 + pom.xml | 3 +- 64 files changed, 987 insertions(+), 1600 deletions(-) delete mode 100644 ballcat-admin/ballcat-admin-i18n/src/main/java/com/hccake/ballcat/admin/i18n/config/I18NGlobalException.java delete mode 100644 ballcat-admin/ballcat-admin-i18n/src/main/java/com/hccake/ballcat/admin/i18n/config/I18nAdminProperties.java delete mode 100644 ballcat-admin/ballcat-admin-i18n/src/main/java/com/hccake/ballcat/admin/i18n/config/I18nResponseAdvice.java delete mode 100644 ballcat-admin/ballcat-admin-i18n/src/main/java/com/hccake/ballcat/admin/i18n/config/LocaleConfig.java create mode 100644 ballcat-common/ballcat-common-i18n/pom.xml create mode 100644 ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/DynamicMessageSource.java create mode 100644 ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/I18nClass.java create mode 100644 ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/I18nField.java create mode 100644 ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/I18nMessage.java create mode 100644 ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/I18nMessageProvider.java create mode 100644 ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/I18nResponseAdvice.java create mode 100644 ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/MessageSourceHierarchicalChanger.java create mode 100644 ballcat-common/ballcat-common-i18n/src/test/java/com/hccake/ballcat/common/i18n/DefautlI18nMessageProvider.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-annotation/src/main/java/com/hccake/common/i18n/annotation/I18nField.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/I18nDataProvider.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/I18nProperties.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/cache/CacheService.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/cache/LocalCacheService.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/cache/RedisCacheService.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/execute/AbstractTranslateExecute.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/execute/DefaultTranslateExecute.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/execute/TranslateExecute.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/execute/TranslateExecuteWrapper.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/executor/CacheExecutor.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/executor/Executor.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/executor/ExecutorWrapper.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/executor/SimpleExecutor.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/generate/DefaultKeyGenerate.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/generate/KeyGenerate.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/handler/SimpleTranslateHandler.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/handler/TemplateTranslateHandler.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/handler/TranslateHandler.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/handler/TranslateHandlerHolder.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/model/I18nItem.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/model/I18nValueItem.java delete mode 100644 ballcat-extends/ballcat-extend-i18n/pom.xml create mode 100644 ballcat-i18n/ballcat-i18n-biz/pom.xml create mode 100644 ballcat-i18n/ballcat-i18n-biz/src/main/java/com/hccake/ballcat/i18n/mapper/I18nDataMapper.java create mode 100644 ballcat-i18n/ballcat-i18n-biz/src/main/java/com/hccake/ballcat/i18n/provider/CustomI18nMessageProvider.java create mode 100644 ballcat-i18n/ballcat-i18n-biz/src/main/java/com/hccake/ballcat/i18n/service/I18nDataService.java create mode 100644 ballcat-i18n/ballcat-i18n-biz/src/main/java/com/hccake/ballcat/i18n/service/impl/I18nDataServiceImpl.java create mode 100644 ballcat-i18n/ballcat-i18n-biz/src/main/resources/mapper/i18n/I18nDataMapper.xml rename {ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core => ballcat-i18n/ballcat-i18n-controller}/pom.xml (63%) create mode 100644 ballcat-i18n/ballcat-i18n-controller/src/main/java/com/hccake/ballcat/i18n/controller/I18nDataController.java create mode 100644 ballcat-i18n/ballcat-i18n-model/pom.xml create mode 100644 ballcat-i18n/ballcat-i18n-model/src/main/java/com/hccake/ballcat/i18n/converter/I18nDataConverter.java create mode 100644 ballcat-i18n/ballcat-i18n-model/src/main/java/com/hccake/ballcat/i18n/model/entity/I18nData.java create mode 100644 ballcat-i18n/ballcat-i18n-model/src/main/java/com/hccake/ballcat/i18n/model/qo/I18nDataQO.java create mode 100644 ballcat-i18n/ballcat-i18n-model/src/main/java/com/hccake/ballcat/i18n/model/vo/I18nDataPageVO.java rename {ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-annotation => ballcat-i18n}/pom.xml (61%) delete mode 100644 ballcat-starters/ballcat-spring-boot-starter-i18n/pom.xml delete mode 100644 ballcat-starters/ballcat-spring-boot-starter-i18n/src/main/java/com/hccake/common/i18n/I18nAutoConfiguration.java delete mode 100644 ballcat-starters/ballcat-spring-boot-starter-i18n/src/main/resources/META-INF/spring.factories diff --git a/ballcat-admin/ballcat-admin-i18n/pom.xml b/ballcat-admin/ballcat-admin-i18n/pom.xml index da64ff0e..21192249 100644 --- a/ballcat-admin/ballcat-admin-i18n/pom.xml +++ b/ballcat-admin/ballcat-admin-i18n/pom.xml @@ -16,10 +16,6 @@ com.hccake ballcat-common-core - - com.hccake - ballcat-spring-boot-starter-i18n - com.hccake ballcat-spring-boot-starter-web diff --git a/ballcat-admin/ballcat-admin-i18n/src/main/java/com/hccake/ballcat/admin/i18n/config/I18NGlobalException.java b/ballcat-admin/ballcat-admin-i18n/src/main/java/com/hccake/ballcat/admin/i18n/config/I18NGlobalException.java deleted file mode 100644 index 1d38b573..00000000 --- a/ballcat-admin/ballcat-admin-i18n/src/main/java/com/hccake/ballcat/admin/i18n/config/I18NGlobalException.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.hccake.ballcat.admin.i18n.config; - -import com.hccake.ballcat.autoconfigure.web.exception.resolver.GlobalHandlerExceptionResolver; -import com.hccake.ballcat.common.core.constant.GlobalConstants; -import com.hccake.ballcat.common.core.exception.BusinessException; -import com.hccake.ballcat.common.core.exception.handler.GlobalExceptionHandler; -import com.hccake.ballcat.common.model.result.R; -import com.hccake.ballcat.common.model.result.SystemResultCode; -import com.hccake.common.i18n.execute.TranslateExecuteWrapper; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.HttpStatus; -import org.springframework.validation.BindException; -import org.springframework.validation.BindingResult; -import org.springframework.web.HttpMediaTypeNotSupportedException; -import org.springframework.web.HttpRequestMethodNotSupportedException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestControllerAdvice; -import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; - -import javax.validation.ValidationException; -import java.util.HashMap; -import java.util.Map; - -/** - * 国际化全局异常处理器 - * - * @author Yakir - */ -@Slf4j -@RestControllerAdvice -public class I18NGlobalException extends GlobalHandlerExceptionResolver { - - private final GlobalExceptionHandler globalExceptionHandler; - - public I18NGlobalException(GlobalExceptionHandler globalExceptionHandler) { - super(globalExceptionHandler); - this.globalExceptionHandler = globalExceptionHandler; - - } - - @Value("${spring.profiles.active:prod}") - private String profile; - - /** - * 异常业务key - */ - @Value("${ballcat.i18n.exceptionKey:exception}") - private String exceptionCode; - - public static final String PROD_ERR_MSG = "系统异常,请联系管理员"; - - public static final String NLP_MSG = "空指针异常!"; - - /** - * 全局异常捕获 - * @param e the e - * @return R - */ - @Override - @ExceptionHandler(Exception.class) - @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) - public R handleGlobalException(Exception e) { - log.error("全局异常信息 ex={}", e.getMessage(), e); - globalExceptionHandler.handle(e); - // 当为生产环境, 不适合把具体的异常信息展示给用户, 比如数据库异常信息. - String errorMsg = GlobalConstants.ENV_PROD.equals(profile) ? PROD_ERR_MSG - : (e instanceof NullPointerException ? NLP_MSG : e.getLocalizedMessage()); - String exceptionMsg = executeTranslate("global.exception", SystemResultCode.BAD_REQUEST.getCode(), errorMsg); - return R.failed(SystemResultCode.SERVER_ERROR, exceptionMsg); - } - - /** - * MethodArgumentTypeMismatchException 参数类型转换异常 - * @param e the e - * @return R - */ - @Override - @ExceptionHandler({ MethodArgumentTypeMismatchException.class }) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public R handleMethodArgumentTypeMismatchException(Exception e) { - log.error("请求入参异常 ex={}", e.getMessage()); - globalExceptionHandler.handle(e); - String message = GlobalConstants.ENV_PROD.equals(profile) ? PROD_ERR_MSG : e.getMessage(); - - String exceptionMsg = executeTranslate("method.argument.type.exception", SystemResultCode.BAD_REQUEST.getCode(), - message); - - return R.failed(SystemResultCode.BAD_REQUEST, exceptionMsg); - } - - /** - * 请求方式有问题 - MediaType 异常 - Method 异常 - * @return R - */ - @Override - @ExceptionHandler({ HttpMediaTypeNotSupportedException.class, HttpRequestMethodNotSupportedException.class }) - public R requestNotSupportedException(Exception e) { - log.error("请求方式异常 ex={}", e.getMessage()); - globalExceptionHandler.handle(e); - String exceptionMsg = executeTranslate("request.not.support.exception", SystemResultCode.BAD_REQUEST.getCode(), - e.getLocalizedMessage()); - return R.failed(SystemResultCode.BAD_REQUEST, exceptionMsg); - } - - /** - * IllegalArgumentException 异常捕获,主要用于Assert - * @param e the e - * @return R - */ - @Override - @ExceptionHandler(IllegalArgumentException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public R handleIllegalArgumentException(IllegalArgumentException e) { - log.error("非法数据输入 ex={}", e.getMessage()); - globalExceptionHandler.handle(e); - String exceptionMsg = executeTranslate("illegal.argument.exception", SystemResultCode.BAD_REQUEST.getCode(), - e.getMessage()); - return R.failed(SystemResultCode.BAD_REQUEST, exceptionMsg); - } - - /** - * validation Exception - * @param exception e - * @return R - */ - @Override - @ExceptionHandler({ MethodArgumentNotValidException.class, BindException.class }) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public R handleBodyValidException(BindException exception) { - BindingResult bindingResult = exception.getBindingResult(); - String errorMsg = bindingResult.getErrorCount() > 0 ? bindingResult.getAllErrors().get(0).getDefaultMessage() - : "未获取到错误信息!"; - - log.error("参数绑定异常,ex = {}", errorMsg); - globalExceptionHandler.handle(exception); - String exceptionMsg = executeTranslate("body.valid.exception", SystemResultCode.BAD_REQUEST.getCode(), - errorMsg); - return R.failed(SystemResultCode.BAD_REQUEST, exceptionMsg); - } - - /** - * 单体参数校验异常 validation Exception - * @param e the e - * @return R - */ - @Override - @ExceptionHandler(ValidationException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public R handleValidationException(ValidationException e) { - log.error("参数绑定异常 ex={}", e.getMessage()); - globalExceptionHandler.handle(e); - String exceptionMsg = executeTranslate("valid.exception", SystemResultCode.BAD_REQUEST.getCode(), - e.getLocalizedMessage()); - return R.failed(SystemResultCode.BAD_REQUEST, exceptionMsg); - } - - /** - * 自定义业务异常捕获 业务异常响应码推荐使用200 用 result 结构中的code做为业务错误码标识 - * @param e the e - * @return R - */ - @Override - @ExceptionHandler(BusinessException.class) - @ResponseStatus(HttpStatus.OK) - public R handleBallCatException(BusinessException e) { - log.error("业务异常信息 ex={}", e.getMessage()); - globalExceptionHandler.handle(e); - String exceptionMsg = executeTranslate("ballcat.exception", e.getCode(), e.getMessage()); - return R.failed(e.getCode(), exceptionMsg); - } - - private String executeTranslate(String code, Integer statusCode, String exceptionMsg) { - return TranslateExecuteWrapper.translateText(exceptionCode, code, prodI18nErrorParam(statusCode, exceptionMsg)); - } - - private Map prodI18nErrorParam(Integer code, String exceptionMsg) { - Map params = new HashMap<>(); - params.put("code", String.valueOf(code)); - params.put("msg", exceptionMsg); - return params; - } - -} diff --git a/ballcat-admin/ballcat-admin-i18n/src/main/java/com/hccake/ballcat/admin/i18n/config/I18nAdminProperties.java b/ballcat-admin/ballcat-admin-i18n/src/main/java/com/hccake/ballcat/admin/i18n/config/I18nAdminProperties.java deleted file mode 100644 index b2c6ee35..00000000 --- a/ballcat-admin/ballcat-admin-i18n/src/main/java/com/hccake/ballcat/admin/i18n/config/I18nAdminProperties.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.hccake.ballcat.admin.i18n.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -/** - * i18n admin properties - * - * @author Yakir - */ -@Component -@Data -@ConfigurationProperties(prefix = "ballcat.i18n") -public class I18nAdminProperties { - - /** - * 请求头指定语言key - */ - private String langHeader = "lang"; - - /** - * msg响应key code - */ - private String responseMsgKey = "response_msg"; - -} diff --git a/ballcat-admin/ballcat-admin-i18n/src/main/java/com/hccake/ballcat/admin/i18n/config/I18nResponseAdvice.java b/ballcat-admin/ballcat-admin-i18n/src/main/java/com/hccake/ballcat/admin/i18n/config/I18nResponseAdvice.java deleted file mode 100644 index c7353ab8..00000000 --- a/ballcat-admin/ballcat-admin-i18n/src/main/java/com/hccake/ballcat/admin/i18n/config/I18nResponseAdvice.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.hccake.ballcat.admin.i18n.config; - -import com.hccake.ballcat.common.model.result.R; -import com.hccake.common.i18n.execute.TranslateExecuteWrapper; - -import lombok.RequiredArgsConstructor; -import org.springframework.core.MethodParameter; -import org.springframework.http.MediaType; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.server.ServerHttpRequest; -import org.springframework.http.server.ServerHttpResponse; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; -import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; - -/** - * 只针对R的msg进行国际化处理 - * - * @author Yakir - */ -@RequiredArgsConstructor -@RestControllerAdvice -public class I18nResponseAdvice implements ResponseBodyAdvice { - - private final I18nAdminProperties i18nAdminProperties; - - @Override - public boolean supports(MethodParameter methodParameter, Class> aClass) { - return isSupport(methodParameter); - } - - @Override - public R beforeBodyWrite(R r, MethodParameter methodParameter, MediaType mediaType, - Class> aClass, ServerHttpRequest serverHttpRequest, - ServerHttpResponse serverHttpResponse) { - String responseMsg = TranslateExecuteWrapper.translateText(i18nAdminProperties.getResponseMsgKey(), - r.getMessage()); - r.setMessage(responseMsg); - TranslateExecuteWrapper.translateObject(r.getData()); - return r; - } - - /** - * 仅支持返回值类型为R 与不为错误处理器返回过来的类型 - * @param methodParameter 方法参数 - * @return true 支持 false 不支持 - */ - private boolean isSupport(MethodParameter methodParameter) { - return methodParameter.getMethod().getAnnotation(ExceptionHandler.class) == null - && methodParameter.getParameterType().isAssignableFrom(R.class); - } - -} diff --git a/ballcat-admin/ballcat-admin-i18n/src/main/java/com/hccake/ballcat/admin/i18n/config/LocaleConfig.java b/ballcat-admin/ballcat-admin-i18n/src/main/java/com/hccake/ballcat/admin/i18n/config/LocaleConfig.java deleted file mode 100644 index d3e22d28..00000000 --- a/ballcat-admin/ballcat-admin-i18n/src/main/java/com/hccake/ballcat/admin/i18n/config/LocaleConfig.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.hccake.ballcat.admin.i18n.config; - -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.util.StringUtils; -import org.springframework.web.servlet.LocaleResolver; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.util.Locale; - -/** - * 语言解析器 主要负责从头提取语言环境 - * - * @author Yakir - */ -@RequiredArgsConstructor -@Configuration -public class LocaleConfig { - - private final I18nAdminProperties i18nAdminProperties; - - /** - * 区域解析器 - * @return @{link LocaleResolver} - */ - @Bean - public LocaleResolver localeResolver() { - MyLocaleResolver localeResolver = new MyLocaleResolver(); - return localeResolver; - } - - class MyLocaleResolver implements LocaleResolver { - - @Override - public Locale resolveLocale(HttpServletRequest request) { - String language = request.getHeader(i18nAdminProperties.getLangHeader()); - if (StrUtil.isEmpty(language)) { - // 路径上没有国际化语言参数,采用默认的(从请求头中获取) - return request.getLocale(); - } - else { - // 格式语言_国家 en_US - return StringUtils.parseLocale(language); - } - } - - @Override - public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, - Locale locale) { - - } - - } - -} diff --git a/ballcat-common/ballcat-common-i18n/pom.xml b/ballcat-common/ballcat-common-i18n/pom.xml new file mode 100644 index 00000000..283c46ea --- /dev/null +++ b/ballcat-common/ballcat-common-i18n/pom.xml @@ -0,0 +1,44 @@ + + + + ballcat-common + com.hccake + ${revision} + + 4.0.0 + + ballcat-common-i18n + + + + org.slf4j + slf4j-api + + + cn.hutool + hutool-core + + + org.springframework + spring-context + + + jakarta.annotation + jakarta.annotation-api + + + org.springframework + spring-web + true + + + org.springframework + spring-webmvc + true + + + + + \ No newline at end of file diff --git a/ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/DynamicMessageSource.java b/ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/DynamicMessageSource.java new file mode 100644 index 00000000..372f62e9 --- /dev/null +++ b/ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/DynamicMessageSource.java @@ -0,0 +1,32 @@ +package com.hccake.ballcat.common.i18n; + +import lombok.RequiredArgsConstructor; +import org.springframework.context.support.AbstractMessageSource; +import org.springframework.lang.Nullable; + +import java.text.MessageFormat; +import java.util.Locale; + +/** + * 动态获取的 MessageSource,比如从数据库 或者 redis 中获取 message 信息 + * + * @author hccake + */ +@RequiredArgsConstructor +public class DynamicMessageSource extends AbstractMessageSource { + + public static final String DYNAMIC_MESSAGE_SOURCE_BEAN_NAME = "dynamicMessageSource"; + + private final I18nMessageProvider i18nMessageProvider; + + @Override + @Nullable + protected MessageFormat resolveCode(String code, Locale locale) { + I18nMessage i18nMessage = i18nMessageProvider.getI18nMessage(code, locale); + if (i18nMessage != null) { + return createMessageFormat(i18nMessage.getMessage(), locale); + } + return null; + } + +} diff --git a/ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/I18nClass.java b/ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/I18nClass.java new file mode 100644 index 00000000..6517fb3e --- /dev/null +++ b/ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/I18nClass.java @@ -0,0 +1,15 @@ +package com.hccake.ballcat.common.i18n; + +import java.lang.annotation.*; + +/** + * 标注于需要国际化处理的类上, 配合 {@link I18nField} 使用,在响应时进行国际化处理 + * @see I18nResponseAdvice + * @author hccake + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface I18nClass { + +} diff --git a/ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/I18nField.java b/ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/I18nField.java new file mode 100644 index 00000000..6772a118 --- /dev/null +++ b/ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/I18nField.java @@ -0,0 +1,32 @@ +package com.hccake.ballcat.common.i18n; + +import org.springframework.core.annotation.AliasFor; + +import java.lang.annotation.*; + +/** + * 用于标注在需要国际化的 String 类型的属性上,用于标记其需要国际化。 必须在拥有 {@link I18nClass} 注解标记的类上 + * @author hccake + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface I18nField { + + /** + *

+ * This is an alias for {@link #code} + *

+ * @return String + */ + @AliasFor("code") + String value() default ""; + + /** + * 国际化的唯一标识, 当不传值时,则使用被标注的元素的值作为 code + * @return String + */ + @AliasFor("value") + String code() default ""; + +} diff --git a/ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/I18nMessage.java b/ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/I18nMessage.java new file mode 100644 index 00000000..19926997 --- /dev/null +++ b/ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/I18nMessage.java @@ -0,0 +1,28 @@ +package com.hccake.ballcat.common.i18n; + +import lombok.Data; + +/** + * 对标于 message bundle 的文件消息的抽象 + * + * @author hccake + */ +@Data +public class I18nMessage { + + /** + * 唯一标识 + */ + private String code; + + /** + * 消息 + */ + private String message; + + /** + * 地区语言标签 + */ + private String languageTag; + +} diff --git a/ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/I18nMessageProvider.java b/ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/I18nMessageProvider.java new file mode 100644 index 00000000..e14b8b13 --- /dev/null +++ b/ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/I18nMessageProvider.java @@ -0,0 +1,20 @@ +package com.hccake.ballcat.common.i18n; + +import java.util.Locale; + +/** + * 国际化信息的提供者,使用者实现此接口,用于从数据库或者缓存中读取数据 + * + * @author hccake + */ +public interface I18nMessageProvider { + + /** + * 获取 I18nMessage 对象 + * @param code 国际化唯一标识 + * @param locale 语言 + * @return 国际化消息 + */ + I18nMessage getI18nMessage(String code, Locale locale); + +} diff --git a/ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/I18nResponseAdvice.java b/ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/I18nResponseAdvice.java new file mode 100644 index 00000000..4fe67507 --- /dev/null +++ b/ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/I18nResponseAdvice.java @@ -0,0 +1,134 @@ +package com.hccake.ballcat.common.i18n; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.MessageSource; +import org.springframework.context.NoSuchMessageException; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.core.MethodParameter; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; + +import java.lang.reflect.Field; +import java.util.Collection; +import java.util.Locale; + +/** + * 利用 ResponseBodyAdvice 对返回结果进行国际化处理 + * + * @author Yakir + * @author hccake + */ +@Slf4j +@RestControllerAdvice +@RequiredArgsConstructor +public class I18nResponseAdvice implements ResponseBodyAdvice { + + private final MessageSource messageSource; + + // todo 配置文件 + private Locale defaultLocal = Locale.SIMPLIFIED_CHINESE; + + /** + * supports all type + * @param returnType MethodParameter + * @param converterType 消息转换器 + * @return always true + */ + @Override + public boolean supports(MethodParameter returnType, Class> converterType) { + return true; + } + + @SneakyThrows + @Override + public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, + Class> selectedConverterType, ServerHttpRequest request, + ServerHttpResponse response) { + switchLanguage(body); + return body; + } + + /** + *

+ * 对提供了 {@link I18nClass} 注解的类进行国际化处理,递归检查所有属性。 + *

+ * ps: 仅处理 String 类型,且注解了 {@link I18nField} 的属性 + * @param source 当前待处理的对象 + */ + public void switchLanguage(Object source) { + if (source == null) { + return; + } + Class sourceClass = source.getClass(); + // 只对添加了 I18nClass 注解的类进行处理 + I18nClass i18nClass = sourceClass.getAnnotation(I18nClass.class); + if (i18nClass == null) { + return; + } + + for (Field field : ReflectUtil.getFields(sourceClass)) { + Class fieldType = field.getType(); + Object fieldValue = ReflectUtil.getFieldValue(source, field); + + if (fieldValue instanceof String) { + // 若不存在国际化注解 直接跳过 + I18nField i18nField = field.getAnnotation(I18nField.class); + if (i18nField == null) { + continue; + } + // 获取国际化的唯一标识 + String annotationCode = i18nField.code(); + String code = StrUtil.isNotEmpty(annotationCode) ? annotationCode : (String) fieldValue; + if (StrUtil.isEmpty(code)) { + continue; + } + // 把当前 field 的值更新为国际化后的属性 + Locale locale = LocaleContextHolder.getLocale(); + String message; + try { + message = messageSource.getMessage(code, null, locale); + } + catch (NoSuchMessageException e) { + log.warn("[switchLanguage]未找到对应的国际化配置,code: {}, local: {}.切换到默认的语言:{}", code, locale, defaultLocal); + message = messageSource.getMessage(code, null, defaultLocal); + } + ReflectUtil.setFieldValue(source, field, message); + } + else if (fieldValue instanceof Collection) { + @SuppressWarnings("unchecked") + Collection elements = (Collection) fieldValue; + if (CollectionUtil.isEmpty(elements)) { + continue; + } + // 集合属性 递归处理 + for (Object element : elements) { + switchLanguage(element); + } + } + else if (fieldType.isArray()) { + Object[] elements = (Object[]) fieldValue; + if (elements == null || elements.length == 0) { + continue; + } + // 数组 递归处理 + for (Object element : elements) { + switchLanguage(element); + } + } + else { + // 其他类型的属性,递归判断处理 + switchLanguage(fieldValue); + } + } + } + +} diff --git a/ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/MessageSourceHierarchicalChanger.java b/ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/MessageSourceHierarchicalChanger.java new file mode 100644 index 00000000..8edae598 --- /dev/null +++ b/ballcat-common/ballcat-common-i18n/src/main/java/com/hccake/ballcat/common/i18n/MessageSourceHierarchicalChanger.java @@ -0,0 +1,41 @@ +package com.hccake.ballcat.common.i18n; + +import org.springframework.context.HierarchicalMessageSource; +import org.springframework.context.MessageSource; +import org.springframework.context.support.AbstractApplicationContext; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; + +/** + * 用于修改 MessageSource 的层级关系,保证 DynamicMessageSource 在父级位置,减少开销 + * + * @author hccake + */ +public class MessageSourceHierarchicalChanger { + + @Resource(name = AbstractApplicationContext.MESSAGE_SOURCE_BEAN_NAME) + private MessageSource messageSource; + + @Resource(name = DynamicMessageSource.DYNAMIC_MESSAGE_SOURCE_BEAN_NAME) + private DynamicMessageSource dynamicMessageSource; + + /** + * 将 dynamicMessageSource 置为 messageSource 的父级
+ * 若 messageSource 非层级,则将 messageSource 置为 dynamicMessageSource 的父级 + */ + @PostConstruct + public void changeMessageSourceParent() { + // 优先走 messageSource,从资源文件中查找 + if (messageSource instanceof HierarchicalMessageSource) { + HierarchicalMessageSource hierarchicalMessageSource = (HierarchicalMessageSource) messageSource; + MessageSource parentMessageSource = hierarchicalMessageSource.getParentMessageSource(); + dynamicMessageSource.setParentMessageSource(parentMessageSource); + hierarchicalMessageSource.setParentMessageSource(dynamicMessageSource); + } + else { + dynamicMessageSource.setParentMessageSource(messageSource); + } + } + +} \ No newline at end of file diff --git a/ballcat-common/ballcat-common-i18n/src/test/java/com/hccake/ballcat/common/i18n/DefautlI18nMessageProvider.java b/ballcat-common/ballcat-common-i18n/src/test/java/com/hccake/ballcat/common/i18n/DefautlI18nMessageProvider.java new file mode 100644 index 00000000..593952ee --- /dev/null +++ b/ballcat-common/ballcat-common-i18n/src/test/java/com/hccake/ballcat/common/i18n/DefautlI18nMessageProvider.java @@ -0,0 +1,34 @@ +package com.hccake.ballcat.common.i18n; + +import java.util.Locale; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 国际化信息的提供者,使用者实现此接口,用于从数据库或者缓存中读取数据 + * + * @author hccake + */ +public class DefautlI18nMessageProvider { + + private static final Map map = new ConcurrentHashMap<>(); + static { + I18nMessage i18nMessage = new I18nMessage(); + i18nMessage.setMessage("你好啊"); + i18nMessage.setCode("test"); + i18nMessage.setLanguageTag("zh-CN"); + map.put("test:zh-CN", i18nMessage); + + I18nMessage i18nMessage2 = new I18nMessage(); + i18nMessage2.setMessage("Hello"); + i18nMessage2.setCode("test"); + i18nMessage2.setLanguageTag("en-US"); + map.put("test:en-US", i18nMessage2); + } + + public I18nMessage getI18nMessage(String code, Locale locale) { + String languageTag = locale.toLanguageTag(); + return map.get(code + ":" + languageTag); + } + +} diff --git a/ballcat-common/ballcat-common-model/pom.xml b/ballcat-common/ballcat-common-model/pom.xml index 0235300b..b1f77aee 100644 --- a/ballcat-common/ballcat-common-model/pom.xml +++ b/ballcat-common/ballcat-common-model/pom.xml @@ -7,10 +7,15 @@ com.hccake ${revision} - 4.0.0 + 4.0.0 ballcat-common-model + + + com.hccake + ballcat-common-i18n + io.swagger swagger-annotations @@ -23,16 +28,6 @@ org.hibernate.validator hibernate-validator - - com.hccake - ballcat-extend-i18n-annotation - - - - - - 8 - 8 - + \ No newline at end of file diff --git a/ballcat-common/ballcat-common-model/src/main/java/com/hccake/ballcat/common/model/result/R.java b/ballcat-common/ballcat-common-model/src/main/java/com/hccake/ballcat/common/model/result/R.java index 9be91a6e..0c85f2d8 100644 --- a/ballcat-common/ballcat-common-model/src/main/java/com/hccake/ballcat/common/model/result/R.java +++ b/ballcat-common/ballcat-common-model/src/main/java/com/hccake/ballcat/common/model/result/R.java @@ -1,6 +1,6 @@ package com.hccake.ballcat.common.model.result; -import com.hccake.common.i18n.annotation.I18nField; +import com.hccake.ballcat.common.i18n.I18nClass; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.*; @@ -14,6 +14,7 @@ import java.io.Serializable; * @param * @author Hccake */ +@I18nClass @Getter @Setter @ToString diff --git a/ballcat-common/pom.xml b/ballcat-common/pom.xml index 96d20aeb..9f94cde7 100644 --- a/ballcat-common/pom.xml +++ b/ballcat-common/pom.xml @@ -22,7 +22,8 @@ ballcat-common-idempotent ballcat-common-log ballcat-common-redis - + ballcat-common-i18n + diff --git a/ballcat-dependencies/pom.xml b/ballcat-dependencies/pom.xml index 43465fd4..f0efbfcb 100644 --- a/ballcat-dependencies/pom.xml +++ b/ballcat-dependencies/pom.xml @@ -124,6 +124,11 @@ ballcat-common-desensitize ${revision} + + com.hccake + ballcat-common-i18n + ${revision} + com.hccake ballcat-common-idempotent @@ -235,21 +240,6 @@ ballcat-spring-boot-starter-xss ${revision} - - com.hccake - ballcat-extend-i18n-annotation - ${revision} - - - com.hccake - ballcat-extend-i18n-core - ${revision} - - - com.hccake - ballcat-spring-boot-starter-i18n - ${revision} - com.hccake ballcat-admin-i18n @@ -350,6 +340,22 @@ ballcat-log-model ${revision} + + + com.hccake + ballcat-i18n-controller + ${revision} + + + com.hccake + ballcat-i18n-biz + ${revision} + + + com.hccake + ballcat-i18n-model + ${revision} + diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-annotation/src/main/java/com/hccake/common/i18n/annotation/I18nField.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-annotation/src/main/java/com/hccake/common/i18n/annotation/I18nField.java deleted file mode 100644 index 4ff7ce88..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-annotation/src/main/java/com/hccake/common/i18n/annotation/I18nField.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.hccake.common.i18n.annotation; - -import java.lang.annotation.*; - -/** - * i18n field annotation - * @author Yakir - */ -@Target(ElementType.FIELD) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface I18nField { - - /** - * 业务 - * @return 业务码 - */ - String businessCode(); - - /** - * 范围值 若指定 则对此范围内的值进行国际化 不在范围的则使用默认值 - * @return 范围值 - */ - String[] rangeValue() default {}; - - /** - * 默认值 - */ - String defaultValue() default ""; - -} diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/I18nDataProvider.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/I18nDataProvider.java deleted file mode 100644 index 5052d62d..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/I18nDataProvider.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.hccake.common.i18n; - -import com.hccake.common.i18n.model.I18nItem; - -import java.util.List; - -/** - * i18n 数据提供 主要负责从数据库中提取数据 - * - * @author Yakir - * @since 2021/3/30 - */ -public interface I18nDataProvider { - - /** - * 指定业务 业务码 语言环境 - * @param systemName - * @param businessCode - * @param code - * @param language - * @return - */ - I18nItem selectOne(String systemName, String businessCode, String code, String language); - - /** - * 查询列表 指定code 查询出所有语言环境 - * @param systemName - * @param businessCode - * @param code - * @return - */ - List selectListByCode(String systemName, String businessCode, String code); - -} diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/I18nProperties.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/I18nProperties.java deleted file mode 100644 index dcc2ed4e..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/I18nProperties.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.hccake.common.i18n; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * i18n properties - * - * @author Yakir - */ -@Data -@ConfigurationProperties(prefix = "ballcat.i18n") -public class I18nProperties { - - /** - * 系统名称 - */ - private String systemName = "test-item"; - - /** - * 缓存空值标记 - */ - private String nullValue = "N_V"; - - /** - * 执行器 主要用来对数据做附加操作 - */ - private String executor = "simple"; - - /** - * 生成器 - */ - private Generate generate = new Generate(); - - /** - * 缓存设置 - */ - private Cache cache = new Cache(); - - @Data - public class Generate { - - /** - * 生成器定界符 - */ - private String delimiter = ":"; - - } - - @Data - public class Cache { - - /** - * 缓存类型 - */ - private String type = "local"; - - /** - * 过期时间(s) -1 表示永不过期 - */ - private Long expire = -1L; - - } - - public boolean isNullValue(String val) { - return this.nullValue.equals(val); - } - -} diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/cache/CacheService.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/cache/CacheService.java deleted file mode 100644 index 9132dda5..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/cache/CacheService.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.hccake.common.i18n.cache; - -/** - * 缓存服务 规范国际化的缓存 - * - * @author Yakir - */ -public interface CacheService { - - /** - * 设置过期时间永不过期 - * @param cacheKey - * @param cacheValue - */ - void put(String cacheKey, String cacheValue); - - /** - * 设置缓存 - * @param cacheKey 缓存key - * @param cacheValue 值 - * @param expireTime 秒(S)为单位 - */ - void put(String cacheKey, String cacheValue, Long expireTime); - - /** - * 根据key 得到数据 - * @param cacheKey 缓存key - * @return string - */ - String get(String cacheKey); - - /** - * 根据key删除 - * @param cacheKey 缓存key - */ - void del(String cacheKey); - -} diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/cache/LocalCacheService.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/cache/LocalCacheService.java deleted file mode 100644 index 59b636cf..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/cache/LocalCacheService.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.hccake.common.i18n.cache; - -import java.util.HashMap; -import java.util.Map; - -/** - * local cache - * - * @author Yakir - */ -public class LocalCacheService implements CacheService { - - /** - * 本地缓存 map - */ - private static final Map CACHE_MAP = new HashMap<>(); - - @Override - public void put(String cacheKey, String cacheValue) { - put(cacheKey, cacheValue, null); - } - - @Override - public void put(String cacheKey, String cacheValue, Long expireTime) { - CACHE_MAP.put(cacheKey, cacheValue); - } - - @Override - public String get(String cacheKey) { - return CACHE_MAP.get(cacheKey); - } - - @Override - public void del(String cacheKey) { - CACHE_MAP.remove(cacheKey); - } - -} diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/cache/RedisCacheService.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/cache/RedisCacheService.java deleted file mode 100644 index 5ae56879..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/cache/RedisCacheService.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.hccake.common.i18n.cache; - -import lombok.RequiredArgsConstructor; -import org.springframework.data.redis.core.StringRedisTemplate; - -import java.util.concurrent.TimeUnit; - -/** - * redis 缓存 - * - * @author Yakir - */ -@RequiredArgsConstructor -public class RedisCacheService implements CacheService { - - private final StringRedisTemplate redisTemplate; - - @Override - public void put(String cacheKey, String cacheValue) { - redisTemplate.opsForValue().set(cacheKey, cacheValue); - } - - @Override - public void put(String cacheKey, String cacheValue, Long expireTime) { - if (expireTime <= 0) { - this.put(cacheKey, cacheValue); - } - else { - redisTemplate.opsForValue().set(cacheKey, cacheValue, expireTime, TimeUnit.SECONDS); - } - } - - @Override - public String get(String cacheKey) { - return redisTemplate.opsForValue().get(cacheKey); - } - - @Override - public void del(String cacheKey) { - redisTemplate.delete(cacheKey); - } - -} diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/execute/AbstractTranslateExecute.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/execute/AbstractTranslateExecute.java deleted file mode 100644 index fcd3e54f..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/execute/AbstractTranslateExecute.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.hccake.common.i18n.execute; - -import org.springframework.context.i18n.LocaleContextHolder; - -import java.util.*; - -/** - * abstract translate execute - * - * @author Yakir - */ -public abstract class AbstractTranslateExecute implements TranslateExecute { - - @SuppressWarnings("unchecked") - @Override - public void translateObject(Object source) { - if (source == null) { - return; - } - // 获取本地语言环境 - Locale locale = LocaleContextHolder.getLocale(); - String language = locale.toString(); - if (source instanceof List) { - processObjects((List) source, language); - } - else if (source instanceof Set) { - processObjects((Set) source, language); - } - else { - processObject(source, language); - } - } - - @SuppressWarnings("unchecked") - @Override - public void translateObject(Object source, Map params) { - if (source == null) { - return; - } - // 获取本地语言环境 - Locale locale = LocaleContextHolder.getLocale(); - String language = locale.toString(); - if (source instanceof List) { - processObjects((List) source, language, params); - } - else if (source instanceof Set) { - processObjects((Set) source, language, params); - } - else { - processObject(source, language, params); - } - } - - /** - * 处理对象 不带参数的 - * @param object 处理数据对象 - * @param language 语言环境 - */ - public abstract void processObject(Object object, String language); - - /** - * 处理对象 不带参数 - * @param sources 元对象集合 - * @param language 语言环境 - */ - public abstract void processObjects(T sources, String language); - - /** - * 处理对象带参数 一批对象公用一份参数 - * @param sources 元对象集合 - * @param language 语言环境 - * @param params 参数 - */ - public abstract void processObjects(T sources, String language, Map params); - - /** - * 处理对象单个 带参数 - * @param source 元对象 - * @param language 语言环境 - * @param params 参数 - */ - public abstract void processObject(Object source, String language, Map params); - -} diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/execute/DefaultTranslateExecute.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/execute/DefaultTranslateExecute.java deleted file mode 100644 index e63e486e..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/execute/DefaultTranslateExecute.java +++ /dev/null @@ -1,216 +0,0 @@ -package com.hccake.common.i18n.execute; - -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.ClassUtil; -import cn.hutool.core.util.StrUtil; -import com.hccake.common.i18n.annotation.I18nField; -import com.hccake.common.i18n.executor.ExecutorWrapper; -import com.hccake.common.i18n.handler.TranslateHandler; -import com.hccake.common.i18n.handler.TranslateHandlerHolder; -import com.hccake.common.i18n.model.I18nValueItem; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import org.springframework.context.i18n.LocaleContextHolder; - -import java.lang.reflect.Field; -import java.util.*; - -/** - * 翻译执行器 - * - * @author Yakir - */ -@Slf4j -@RequiredArgsConstructor -public class DefaultTranslateExecute extends AbstractTranslateExecute { - - private final ExecutorWrapper executorWrapper; - - @Override - public String translateText(String businessCode, String code) { - String languageName = LocaleContextHolder.getLocale().toString(); - return translateText(businessCode, code, languageName, null, code); - } - - @Override - public String translateText(String businessCode, String code, String languageName) { - return translateText(businessCode, code, languageName, null, code); - } - - @Override - public String translateText(String businessCode, String code, Map params) { - String languageName = LocaleContextHolder.getLocale().toString(); - return translateText(businessCode, code, languageName, params, code); - } - - @Override - public String translateText(String businessCode, String code, String languageName, - Map paramValues) { - return translateText(businessCode, code, languageName, paramValues, code); - } - - public String translateText(String businessCode, String code, String languageName, Map paramValues, - String defaultValue) { - I18nValueItem i18nValueItem = executorWrapper.selectLocaleLanguage(businessCode, code, languageName); - if (i18nValueItem == null) { - return code; - } - Integer type = i18nValueItem.getType(); - String tplValue = i18nValueItem.getTplValue(); - TranslateHandler translateHandler = TranslateHandlerHolder.getTranslateHandler(type); - Assert.notNull(translateHandler, "translateHandler can not be Null"); - String resultValue = translateHandler.translateText(tplValue, paramValues); - return StrUtil.isNotEmpty(resultValue) ? resultValue : defaultValue; - } - - @Override - public void processObjects(T sources, String language, Map params) { - if (CollectionUtil.isEmpty(sources)) { - return; - } - for (Object source : sources) { - processObject(source, language, params); - } - } - - @Override - public void processObjects(T sources, String language) { - this.processObjects(sources, language, null); - } - - @Override - public void processObject(Object source, String language) { - this.processObject(source, language, null); - } - - @Override - public void processObject(Object source, String language, Map params) { - if (source == null) { - return; - } - Class sourceClass = source.getClass(); - // 若为基本类型 或string类中直接跳过 - if (isBaseTypeOrString(sourceClass)) { - return; - } - for (Field field : sourceClass.getDeclaredFields()) { - Class fieldType = field.getType(); - // 若为排除类型直接跳过 - if (isExcludeFieldType(fieldType)) { - continue; - } - if (List.class.isAssignableFrom(fieldType)) { - // 防止实体对象里面防止list属性 - List elementsList = getFieldValue(field, source); - if (CollectionUtil.isEmpty(elementsList)) { - continue; - } - processObjects(elementsList, language); - continue; - } - else if (Set.class.isAssignableFrom(fieldType)) { - Set elementSet = getFieldValue(field, source); - if (CollectionUtil.isEmpty(elementSet)) { - continue; - } - processObjects(new ArrayList<>(elementSet), language); - continue; - } - // 若不存在国际化注解 直接跳过 - if (!field.isAnnotationPresent(I18nField.class)) { - continue; - } - // 设置字段为可进入 - String fieldValue = getFieldValue(field, source); - // 若字段值为空 则直接跳过 - if (StrUtil.isEmpty(fieldValue)) { - continue; - } - I18nField annotation = field.getAnnotation(I18nField.class); - String[] rangeValue = annotation.rangeValue(); - String defaultValue = annotation.defaultValue(); - // rangeValue 不为空 并且当前元素 不在范围值内 直接跳过 - if (ArrayUtil.isNotEmpty(rangeValue) && !ArrayUtil.contains(rangeValue, fieldValue)) { - continue; - } - String businessCode = annotation.businessCode(); - I18nValueItem i18nValueItem = executorWrapper.selectLocaleLanguage(businessCode, fieldValue, language); - if (i18nValueItem == null) { - continue; - } - String tplValue = i18nValueItem.getTplValue(); - Integer type = i18nValueItem.getType(); - TranslateHandler translateHandler = TranslateHandlerHolder.getTranslateHandler(type); - if (translateHandler == null) { - continue; - } - String afterValue = translateHandler.translateText(tplValue, params); - if (StrUtil.isEmpty(afterValue)) { - if (StrUtil.isEmpty(defaultValue)) { - continue; - } - afterValue = defaultValue; - } - // 设置进字段 - setFieldValue(field, source, afterValue); - } - } - - /** - * 判断是否为基础类型 或String 类型 - * @param sourceClass - * @return - */ - private boolean isBaseTypeOrString(Class sourceClass) { - return ClassUtil.isBasicType(sourceClass) || String.class.isAssignableFrom(sourceClass); - } - - private T getFieldValue(Field field, Object obj) { - try { - if (!field.isAccessible()) { - field.setAccessible(true); - } - return (T) field.get(obj); - } - catch (IllegalAccessException e) { - log.error("字段值获取失败", e); - } - return null; - } - - /** - * 设置字段值 - * @param field 字段 - * @param obj 对象 - * @param val 新值 - */ - private void setFieldValue(Field field, Object obj, String val) { - try { - if (!field.isAccessible()) { - field.setAccessible(true); - } - field.set(obj, val); - } - catch (IllegalAccessException e) { - log.error("国际化处理结果回填失败", e); - } - } - - /** - * 是否为排除字段类型 - * @param clazz string List map 保留 - * @return true 排除 false 进行翻译 - */ - public boolean isExcludeFieldType(Class clazz) { - if (String.class.isAssignableFrom(clazz) || List.class.isAssignableFrom(clazz) - || Set.class.isAssignableFrom(clazz)) { - return false; - } - return true; - } - -} diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/execute/TranslateExecute.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/execute/TranslateExecute.java deleted file mode 100644 index 9347d3fb..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/execute/TranslateExecute.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.hccake.common.i18n.execute; - -import java.util.Map; - -public interface TranslateExecute { - - /** - * 翻译文本使用默认语言环境 - * @param businessCode - * @param code - * @return - */ - String translateText(String businessCode, String code); - - /** - * 翻译文本 指定语言环境 - * @param businessCode - * @param code - * @param language - * @return - */ - String translateText(String businessCode, String code, String language); - - /** - * 翻译文本使用当前语言环境 - * @param businessCode - * @param code - * @param params - * @return - */ - String translateText(String businessCode, String code, Map params); - - /** - * 翻译文本 指定语言环境 - * @param businessCode - * @param code - * @param language - * @param params - * @return - */ - String translateText(String businessCode, String code, String language, Map params); - - /** - * 翻译对象 直接进行字段值更新 - * @param source - */ - void translateObject(Object source); - - /** - * 翻译单个对象 可以指定参数 - * @param source - * @param params - */ - void translateObject(Object source, Map params); - -} diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/execute/TranslateExecuteWrapper.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/execute/TranslateExecuteWrapper.java deleted file mode 100644 index 5a492cdb..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/execute/TranslateExecuteWrapper.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.hccake.common.i18n.execute; - -import java.util.Map; - -/** - * 翻译执行包装器 - * - * @author Yakir - */ -public class TranslateExecuteWrapper { - - private static TranslateExecute translateExecute; - - public static String translateText(String businessCode, String code) { - return translateExecute.translateText(businessCode, code); - } - - public static String translateText(String businessCode, String code, String language) { - return translateExecute.translateText(businessCode, code, language); - } - - public static String translateText(String businessCode, String code, Map params) { - return translateExecute.translateText(businessCode, code, params); - } - - public static String translateText(String businessCode, String code, String language, Map params) { - return translateExecute.translateText(businessCode, code, language, params); - } - - public static void translateObject(Object source) { - translateExecute.translateObject(source); - } - - public static void translateObject(Object source, Map params) { - translateExecute.translateObject(source, params); - } - - public void setTranslateExecute(TranslateExecute translateExecute) { - TranslateExecuteWrapper.translateExecute = translateExecute; - } - -} diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/executor/CacheExecutor.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/executor/CacheExecutor.java deleted file mode 100644 index 934d8e18..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/executor/CacheExecutor.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.hccake.common.i18n.executor; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.hccake.ballcat.common.util.JsonUtils; -import com.hccake.common.i18n.I18nDataProvider; -import com.hccake.common.i18n.I18nProperties; -import com.hccake.common.i18n.cache.CacheService; -import com.hccake.common.i18n.generate.KeyGenerate; -import com.hccake.common.i18n.model.I18nItem; -import lombok.RequiredArgsConstructor; - -import java.util.ArrayList; -import java.util.List; - -/** - * 简单执行器 主要负责数据提取与缓存 - * - * @author Yakir - */ -@RequiredArgsConstructor -public class CacheExecutor implements Executor { - - private final I18nDataProvider i18nDataProvider; - - private final I18nProperties i18nProperties; - - private final KeyGenerate keyGenerate; - - private final CacheService cacheService; - - @Override - public I18nItem selectOne(String systemName, String businessCode, String code, String language) { - String key = keyGenerate.generateKey(systemName, businessCode, code, language); - String cacheValue = cacheService.get(key); - // 若为空值标记 则直接返回 - if (i18nProperties.isNullValue(cacheValue)) { - return null; - } - if (StrUtil.isNotEmpty(cacheValue)) { - return JsonUtils.toObj(cacheValue, I18nItem.class); - } - I18nItem i18nItem = i18nDataProvider.selectOne(systemName, businessCode, code, language); - - cacheService.put(key, - ObjectUtil.isNotEmpty(i18nItem) ? JsonUtils.toJson(i18nItem) : i18nProperties.getNullValue(), - i18nProperties.getCache().getExpire()); - - return i18nItem; - } - - @Override - public List selectListByCode(String systemName, String businessCode, String code) { - String key = keyGenerate.generateKey(systemName, businessCode, code); - String cacheValue = cacheService.get(key); - // 若为空值标记 则直接返回 - if (i18nProperties.isNullValue(cacheValue)) { - return new ArrayList<>(); - } - - if (StrUtil.isNotEmpty(cacheValue)) { - return JsonUtils.toObj(cacheValue, List.class); - } - List i18nItems = i18nDataProvider.selectListByCode(systemName, businessCode, code); - - cacheService.put(key, - ObjectUtil.isNotEmpty(i18nItems) ? JsonUtils.toJson(i18nItems) : i18nProperties.getNullValue(), - i18nProperties.getCache().getExpire()); - - return i18nItems; - } - -} diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/executor/Executor.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/executor/Executor.java deleted file mode 100644 index fdd73abf..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/executor/Executor.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.hccake.common.i18n.executor; - -import com.hccake.common.i18n.model.I18nItem; - -import java.util.List; - -/** - * 执行器 主要负责数据提取与附加操作 - * - * @author Yakir - */ -public interface Executor { - - /** - * 指定业务 业务码 语言环境 - * @param systemName 系统名称 - * @param businessCode 业务 - * @param code key - * @param language 语言环境 - * @return 值 - */ - I18nItem selectOne(String systemName, String businessCode, String code, String language); - - /** - * 查询列表 指定code 查询出所有语言环境 - * @param systemName 系统名称 - * @param businessCode 业务码 - * @param code key - * @return 值列表 - */ - List selectListByCode(String systemName, String businessCode, String code); - -} diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/executor/ExecutorWrapper.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/executor/ExecutorWrapper.java deleted file mode 100644 index a5dc33e0..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/executor/ExecutorWrapper.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.hccake.common.i18n.executor; - -import com.hccake.common.i18n.I18nProperties; -import com.hccake.common.i18n.model.I18nItem; -import com.hccake.common.i18n.model.I18nValueItem; -import lombok.RequiredArgsConstructor; - -/** - * 执行者包装类 主要负责数据的处理转换 - * - * @author Yakir - */ -@RequiredArgsConstructor -public class ExecutorWrapper { - - private final I18nProperties i18nProperties; - - private final Executor executor; - - /** - * 获取系统名 - * @return - */ - private String getSystemName() { - return i18nProperties.getSystemName(); - } - - /** - * 查询区域项 语言 - * @param businessCode - * @param code - * @param language - * @return {@link I18nValueItem} 对应处理后的国际化值 - */ - public I18nValueItem selectLocaleLanguage(String businessCode, String code, String language) { - I18nItem i18nItem = executor.selectOne(getSystemName(), businessCode, code, language); - if (i18nItem == null) { - return null; - } - return convertI18nValueItem(i18nItem); - } - - private I18nValueItem convertI18nValueItem(I18nItem e) { - return new I18nValueItem().setTplValue(e.getValue()).setType(e.getType()); - } - -} diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/executor/SimpleExecutor.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/executor/SimpleExecutor.java deleted file mode 100644 index 89821185..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/executor/SimpleExecutor.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.hccake.common.i18n.executor; - -import com.hccake.common.i18n.I18nDataProvider; -import com.hccake.common.i18n.model.I18nItem; -import lombok.RequiredArgsConstructor; - -import java.util.List; - -/** - * 简单执行器 主要负责数据提取与缓存 - * - * @author Yakir - */ -@RequiredArgsConstructor -public class SimpleExecutor implements Executor { - - private final I18nDataProvider i18nDataProvider; - - @Override - public I18nItem selectOne(String systemName, String businessCode, String code, String language) { - return i18nDataProvider.selectOne(systemName, businessCode, code, language); - } - - @Override - public List selectListByCode(String systemName, String businessCode, String code) { - return i18nDataProvider.selectListByCode(systemName, businessCode, code); - } - -} diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/generate/DefaultKeyGenerate.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/generate/DefaultKeyGenerate.java deleted file mode 100644 index f5e43710..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/generate/DefaultKeyGenerate.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.hccake.common.i18n.generate; - -import cn.hutool.core.lang.Assert; -import com.hccake.common.i18n.I18nProperties; -import lombok.RequiredArgsConstructor; - -/** - * 默认key生成 - * - * @author Yakir - */ -@RequiredArgsConstructor -public class DefaultKeyGenerate implements KeyGenerate { - - private final I18nProperties i18nProperties; - - @Override - public String generateKey(String... params) { - Assert.noNullElements(params, "params size must be greater than 0 "); - StringBuilder stringBuilder = new StringBuilder(); - I18nProperties.Generate generate = i18nProperties.getGenerate(); - for (String param : params) { - stringBuilder.append(param).append(generate.getDelimiter()); - } - return stringBuilder.deleteCharAt(stringBuilder.length() - 1).toString(); - } - -} diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/generate/KeyGenerate.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/generate/KeyGenerate.java deleted file mode 100644 index ce63da8f..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/generate/KeyGenerate.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.hccake.common.i18n.generate; - -/** - * 缓存key生成器 - * - * @author Yakir - */ -public interface KeyGenerate { - - /** - * 缓存 key 生成 - * @param params 参数数组 - * @return 指定分隔符字符串 - */ - String generateKey(String... params); - -} diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/handler/SimpleTranslateHandler.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/handler/SimpleTranslateHandler.java deleted file mode 100644 index 714fb48f..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/handler/SimpleTranslateHandler.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.hccake.common.i18n.handler; - -import lombok.RequiredArgsConstructor; - -import java.util.Map; - -/** - * simple translate handler - * - * @author Yakir - */ -@RequiredArgsConstructor -public class SimpleTranslateHandler implements TranslateHandler { - - @Override - public String translateText(String originalText, Map paramValues) { - return originalText; - } - -} diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/handler/TemplateTranslateHandler.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/handler/TemplateTranslateHandler.java deleted file mode 100644 index 9b254ffd..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/handler/TemplateTranslateHandler.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.hccake.common.i18n.handler; - -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; - -import java.util.Map; - -/** - * template translate handler - * - * @author Yakir - */ -@RequiredArgsConstructor -public class TemplateTranslateHandler implements TranslateHandler { - - @Override - public String translateText(String originalText, Map paramValues) { - return StrUtil.format(originalText, paramValues); - } - -} diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/handler/TranslateHandler.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/handler/TranslateHandler.java deleted file mode 100644 index 5e217bba..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/handler/TranslateHandler.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.hccake.common.i18n.handler; - -import java.util.Map; - -/** - * 翻译处理器 具体执行处理逻辑 - * - * @author Yakir - */ -public interface TranslateHandler { - - /** - * 翻译文本 - * @param originalText 原始文本 - * @param paramValues 参数值 - * @return 翻译后的值 - */ - String translateText(String originalText, Map paramValues); - -} diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/handler/TranslateHandlerHolder.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/handler/TranslateHandlerHolder.java deleted file mode 100644 index 63fd12de..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/handler/TranslateHandlerHolder.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.hccake.common.i18n.handler; - -import lombok.RequiredArgsConstructor; - -import java.util.HashMap; -import java.util.Map; - -/** - * translate handler holder - * - * @author Yakir - */ -@RequiredArgsConstructor -public class TranslateHandlerHolder { - - /** - * 处理器map元素 - */ - private static final Map, TranslateHandler> HANDLER_MAP = new HashMap<>(); - - /** - * 枚举类型type标记 与类型的映射 - */ - private static final Map> TYPE_CLASS_MAP = new HashMap<>(); - - static { - - TYPE_CLASS_MAP.put(1, SimpleTranslateHandler.class); - TYPE_CLASS_MAP.put(2, TemplateTranslateHandler.class); - - HANDLER_MAP.put(SimpleTranslateHandler.class, new SimpleTranslateHandler()); - HANDLER_MAP.put(TemplateTranslateHandler.class, new TemplateTranslateHandler()); - } - - /** - * 得到处理器 - * @param clazz TranslateHandler的Class - * @return @{code TranslateHandler实现} - */ - public static TranslateHandler getTranslateHandler(Class clazz) { - return HANDLER_MAP.get(clazz); - } - - /** - * 添加处理器 - * @param clazz TranslateHandler的Class - * @param translateHandler TranslateHandler实现 - * @return @{code TranslateHandler实现} - */ - public static TranslateHandler addTranslateHandler(Class clazz, - TranslateHandler translateHandler) { - return HANDLER_MAP.put(clazz, translateHandler); - } - - /** - * 得到处理器 主要拓展 绑定type 与类的映射 - * @param type type - * @return @{code TranslateHandler实现} - */ - public static TranslateHandler getTranslateHandler(Integer type) { - return HANDLER_MAP.get(TYPE_CLASS_MAP.get(type)); - } - - /** - * 添加处理器 主要拓展 绑定type 与类的映射 - * @param type 类型1.明文 2.模板 - * @param clazz TranslateHandler的Class - * @param translateHandler TranslateHandler实现 - * @return @{code TranslateHandler实现} - */ - public static TranslateHandler addTranslateHandler(Integer type, Class clazz, - TranslateHandler translateHandler) { - TYPE_CLASS_MAP.put(type, clazz); - return HANDLER_MAP.put(clazz, translateHandler); - } - -} diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/model/I18nItem.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/model/I18nItem.java deleted file mode 100644 index b3e41934..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/model/I18nItem.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.hccake.common.i18n.model; - -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * i18n item - * - * @author Yakir - */ -@Accessors(chain = true) -@Data -public class I18nItem { - - /** - * 系统名称 - */ - private String systemName; - - /** - * 业务码 - */ - private String businessCode; - - /** - * 分组code - */ - private String code; - - /** - * 语言环境 - */ - private String language; - - /** - * 值 - */ - private String value; - - /** - * 类型 - */ - private Integer type; - -} diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/model/I18nValueItem.java b/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/model/I18nValueItem.java deleted file mode 100644 index bc745908..00000000 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/src/main/java/com/hccake/common/i18n/model/I18nValueItem.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.hccake.common.i18n.model; - -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * i18n - * - * @author Yakir - */ -@Data -@Accessors(chain = true) -public class I18nValueItem { - - /** - * 模板值 - */ - private String tplValue; - - /** - * 类型 1.明文 2.模板 - */ - private Integer type; - -} diff --git a/ballcat-extends/ballcat-extend-i18n/pom.xml b/ballcat-extends/ballcat-extend-i18n/pom.xml deleted file mode 100644 index 781f7203..00000000 --- a/ballcat-extends/ballcat-extend-i18n/pom.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - ballcat-extends - com.hccake - ${revision} - - 4.0.0 - - ballcat-extend-i18n - pom - - ballcat-extend-i18n-annotation - ballcat-extend-i18n-core - - \ No newline at end of file diff --git a/ballcat-extends/pom.xml b/ballcat-extends/pom.xml index a32e11dd..af72961e 100644 --- a/ballcat-extends/pom.xml +++ b/ballcat-extends/pom.xml @@ -19,7 +19,6 @@ ballcat-extend-pay-virtual ballcat-extend-pay-ali ballcat-extend-pay-wx - ballcat-extend-i18n ballcat-extend-redis-module \ No newline at end of file diff --git a/ballcat-i18n/ballcat-i18n-biz/pom.xml b/ballcat-i18n/ballcat-i18n-biz/pom.xml new file mode 100644 index 00000000..4a0cc9e1 --- /dev/null +++ b/ballcat-i18n/ballcat-i18n-biz/pom.xml @@ -0,0 +1,25 @@ + + + + ballcat-i18n + com.hccake + ${revision} + + 4.0.0 + + ballcat-i18n-biz + + + + com.hccake + ballcat-i18n-model + + + com.hccake + ballcat-extend-mybatis-plus + + + + \ No newline at end of file diff --git a/ballcat-i18n/ballcat-i18n-biz/src/main/java/com/hccake/ballcat/i18n/mapper/I18nDataMapper.java b/ballcat-i18n/ballcat-i18n-biz/src/main/java/com/hccake/ballcat/i18n/mapper/I18nDataMapper.java new file mode 100644 index 00000000..dc0e8b73 --- /dev/null +++ b/ballcat-i18n/ballcat-i18n-biz/src/main/java/com/hccake/ballcat/i18n/mapper/I18nDataMapper.java @@ -0,0 +1,49 @@ +package com.hccake.ballcat.i18n.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.hccake.ballcat.i18n.converter.I18nDataConverter; +import com.hccake.ballcat.i18n.model.entity.I18nData; +import com.hccake.ballcat.i18n.model.qo.I18nDataQO; +import com.hccake.ballcat.i18n.model.vo.I18nDataPageVO; +import com.hccake.ballcat.common.model.domain.PageParam; +import com.hccake.ballcat.common.model.domain.PageResult; +import com.hccake.extend.mybatis.plus.conditions.query.LambdaQueryWrapperX; +import com.hccake.extend.mybatis.plus.mapper.ExtendMapper; +import com.hccake.extend.mybatis.plus.toolkit.WrappersX; + +/** + * 国际化信息 + * + * @author hccake 2021-08-04 11:31:49 + */ +public interface I18nDataMapper extends ExtendMapper { + + /** + * 分页查询 + * @param pageParam 分页参数 + * @param qo 查询参数 + * @return PageResult VO分页数据 + */ + default PageResult queryPage(PageParam pageParam, I18nDataQO qo) { + IPage page = this.prodPage(pageParam); + LambdaQueryWrapperX wrapper = WrappersX.lambdaQueryX(I18nData.class); + this.selectPage(page, wrapper); + IPage voPage = page.convert(I18nDataConverter.INSTANCE::poToPageVo); + return new PageResult<>(voPage.getRecords(), voPage.getTotal()); + } + + /** + * 根据 code 和 languageTag 查询指定的 I18nData + * @param code 唯一标识 + * @param languageTag 语言标识 + * @return I18nData + */ + default I18nData selectByCodeAndLanguageTag(String code, String languageTag) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(I18nData.class).eq(I18nData::getCode, code) + .eq(I18nData::getLanguageTag, languageTag); + return this.selectOne(wrapper); + } + +} \ No newline at end of file diff --git a/ballcat-i18n/ballcat-i18n-biz/src/main/java/com/hccake/ballcat/i18n/provider/CustomI18nMessageProvider.java b/ballcat-i18n/ballcat-i18n-biz/src/main/java/com/hccake/ballcat/i18n/provider/CustomI18nMessageProvider.java new file mode 100644 index 00000000..b33de41e --- /dev/null +++ b/ballcat-i18n/ballcat-i18n-biz/src/main/java/com/hccake/ballcat/i18n/provider/CustomI18nMessageProvider.java @@ -0,0 +1,35 @@ +package com.hccake.ballcat.i18n.provider; + +import com.hccake.ballcat.common.i18n.I18nMessage; +import com.hccake.ballcat.common.i18n.I18nMessageProvider; +import com.hccake.ballcat.i18n.model.entity.I18nData; +import com.hccake.ballcat.i18n.service.I18nDataService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.Locale; + +/** + * @author hccake + */ +@Component +@RequiredArgsConstructor +public class CustomI18nMessageProvider implements I18nMessageProvider { + + private final I18nDataService i18nDataService; + + @Override + public I18nMessage getI18nMessage(String code, Locale locale) { + String languageTag = locale.toLanguageTag(); + I18nData i18nData = i18nDataService.getByCodeAndLanguageTag(code, languageTag); + if (i18nData == null) { + return null; + } + I18nMessage i18nMessage = new I18nMessage(); + i18nMessage.setMessage(i18nData.getMessage()); + i18nMessage.setCode(i18nData.getCode()); + i18nMessage.setLanguageTag(i18nData.getCode()); + return i18nMessage; + } + +} diff --git a/ballcat-i18n/ballcat-i18n-biz/src/main/java/com/hccake/ballcat/i18n/service/I18nDataService.java b/ballcat-i18n/ballcat-i18n-biz/src/main/java/com/hccake/ballcat/i18n/service/I18nDataService.java new file mode 100644 index 00000000..ff186045 --- /dev/null +++ b/ballcat-i18n/ballcat-i18n-biz/src/main/java/com/hccake/ballcat/i18n/service/I18nDataService.java @@ -0,0 +1,33 @@ +package com.hccake.ballcat.i18n.service; + +import com.hccake.ballcat.i18n.model.entity.I18nData; +import com.hccake.ballcat.i18n.model.vo.I18nDataPageVO; +import com.hccake.ballcat.i18n.model.qo.I18nDataQO; +import com.hccake.ballcat.common.model.domain.PageParam; +import com.hccake.ballcat.common.model.domain.PageResult; +import com.hccake.extend.mybatis.plus.service.ExtendService; + +/** + * 国际化信息 + * + * @author hccake 2021-08-04 11:31:49 + */ +public interface I18nDataService extends ExtendService { + + /** + * 根据QueryObeject查询分页数据 + * @param pageParam 分页参数 + * @param qo 查询参数对象 + * @return PageResult<I18nDataPageVO> 分页数据 + */ + PageResult queryPage(PageParam pageParam, I18nDataQO qo); + + /** + * 根据 code 和 languageTag 查询指定的 I18nData + * @param code 唯一标识 + * @param languageTag 语言标识 + * @return I18nData + */ + I18nData getByCodeAndLanguageTag(String code, String languageTag); + +} \ No newline at end of file diff --git a/ballcat-i18n/ballcat-i18n-biz/src/main/java/com/hccake/ballcat/i18n/service/impl/I18nDataServiceImpl.java b/ballcat-i18n/ballcat-i18n-biz/src/main/java/com/hccake/ballcat/i18n/service/impl/I18nDataServiceImpl.java new file mode 100644 index 00000000..dcdb333e --- /dev/null +++ b/ballcat-i18n/ballcat-i18n-biz/src/main/java/com/hccake/ballcat/i18n/service/impl/I18nDataServiceImpl.java @@ -0,0 +1,43 @@ +package com.hccake.ballcat.i18n.service.impl; + +import com.hccake.ballcat.i18n.model.entity.I18nData; +import com.hccake.ballcat.i18n.model.vo.I18nDataPageVO; +import com.hccake.ballcat.i18n.model.qo.I18nDataQO; +import com.hccake.ballcat.i18n.mapper.I18nDataMapper; +import com.hccake.ballcat.i18n.service.I18nDataService; +import com.hccake.ballcat.common.model.domain.PageParam; +import com.hccake.ballcat.common.model.domain.PageResult; +import com.hccake.extend.mybatis.plus.service.impl.ExtendServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 国际化信息 + * + * @author hccake 2021-08-04 11:31:49 + */ +@Service +public class I18nDataServiceImpl extends ExtendServiceImpl implements I18nDataService { + + /** + * 根据QueryObeject查询分页数据 + * @param pageParam 分页参数 + * @param qo 查询参数对象 + * @return PageResult 分页数据 + */ + @Override + public PageResult queryPage(PageParam pageParam, I18nDataQO qo) { + return baseMapper.queryPage(pageParam, qo); + } + + /** + * 根据 code 和 languageTag 查询指定的 I18nData + * @param code 唯一标识 + * @param languageTag 语言标识 + * @return I18nData + */ + @Override + public I18nData getByCodeAndLanguageTag(String code, String languageTag) { + return baseMapper.selectByCodeAndLanguageTag(code, languageTag); + } + +} diff --git a/ballcat-i18n/ballcat-i18n-biz/src/main/resources/mapper/i18n/I18nDataMapper.xml b/ballcat-i18n/ballcat-i18n-biz/src/main/resources/mapper/i18n/I18nDataMapper.xml new file mode 100644 index 00000000..71197138 --- /dev/null +++ b/ballcat-i18n/ballcat-i18n-biz/src/main/resources/mapper/i18n/I18nDataMapper.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + id, + business, + message_key, + code, + message, + language_tag, + remark, + create_time, + update_time + + + + id.id, + id.business, + id.message_key, + id.code, + id.message, + id.language_tag, + id.remark, + id.create_time, + id.update_time + + \ No newline at end of file diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/pom.xml b/ballcat-i18n/ballcat-i18n-controller/pom.xml similarity index 63% rename from ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/pom.xml rename to ballcat-i18n/ballcat-i18n-controller/pom.xml index 4e8aa792..18c9ebe2 100644 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-core/pom.xml +++ b/ballcat-i18n/ballcat-i18n-controller/pom.xml @@ -3,28 +3,31 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - ballcat-extend-i18n + ballcat-i18n com.hccake ${revision} 4.0.0 - ballcat-extend-i18n-core - jar + ballcat-i18n-controller - com.hccake - ballcat-extend-i18n-annotation + ballcat-i18n-biz com.hccake - ballcat-common-core + ballcat-common-log com.hccake - ballcat-spring-boot-starter-redis + ballcat-common-security + + + org.springframework + spring-web + \ No newline at end of file diff --git a/ballcat-i18n/ballcat-i18n-controller/src/main/java/com/hccake/ballcat/i18n/controller/I18nDataController.java b/ballcat-i18n/ballcat-i18n-controller/src/main/java/com/hccake/ballcat/i18n/controller/I18nDataController.java new file mode 100644 index 00000000..b78dd309 --- /dev/null +++ b/ballcat-i18n/ballcat-i18n-controller/src/main/java/com/hccake/ballcat/i18n/controller/I18nDataController.java @@ -0,0 +1,87 @@ +package com.hccake.ballcat.i18n.controller; + +import com.hccake.ballcat.common.log.operation.annotation.CreateOperationLogging; +import com.hccake.ballcat.common.log.operation.annotation.DeleteOperationLogging; +import com.hccake.ballcat.common.log.operation.annotation.UpdateOperationLogging; +import com.hccake.ballcat.common.model.domain.PageParam; +import com.hccake.ballcat.common.model.domain.PageResult; +import com.hccake.ballcat.common.model.result.BaseResultCode; +import com.hccake.ballcat.common.model.result.R; +import com.hccake.ballcat.i18n.model.entity.I18nData; +import com.hccake.ballcat.i18n.model.qo.I18nDataQO; +import com.hccake.ballcat.i18n.model.vo.I18nDataPageVO; +import com.hccake.ballcat.i18n.service.I18nDataService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +/** + * 国际化信息 + * + * @author hccake 2021-08-04 11:31:49 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/i18n/data") +@Api(value = "i18n-data", tags = "国际化信息管理") +public class I18nDataController { + + private final I18nDataService i18nDataService; + + /** + * 分页查询 + * @param pageParam 分页参数 + * @param i18nDataQO 国际化信息查询对象 + * @return R 通用返回体 + */ + @ApiOperation(value = "分页查询", notes = "分页查询") + @GetMapping("/page") + @PreAuthorize("@per.hasPermission('i18n:data:read')") + public R> getI18nDataPage(PageParam pageParam, I18nDataQO i18nDataQO) { + return R.ok(i18nDataService.queryPage(pageParam, i18nDataQO)); + } + + /** + * 新增国际化信息 + * @param i18nData 国际化信息 + * @return R 通用返回体 + */ + @ApiOperation(value = "新增国际化信息", notes = "新增国际化信息") + @CreateOperationLogging(msg = "新增国际化信息") + @PostMapping + @PreAuthorize("@per.hasPermission('i18n:data:add')") + public R save(@RequestBody I18nData i18nData) { + return i18nDataService.save(i18nData) ? R.ok() : R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "新增国际化信息失败"); + } + + /** + * 修改国际化信息 + * @param i18nData 国际化信息 + * @return R 通用返回体 + */ + @ApiOperation(value = "修改国际化信息", notes = "修改国际化信息") + @UpdateOperationLogging(msg = "修改国际化信息") + @PutMapping + @PreAuthorize("@per.hasPermission('i18n:data:edit')") + public R updateById(@RequestBody I18nData i18nData) { + return i18nDataService.updateById(i18nData) ? R.ok() + : R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "修改国际化信息失败"); + } + + /** + * 通过id删除国际化信息 + * @param id id + * @return R 通用返回体 + */ + @ApiOperation(value = "通过id删除国际化信息", notes = "通过id删除国际化信息") + @DeleteOperationLogging(msg = "通过id删除国际化信息") + @DeleteMapping("/{id}") + @PreAuthorize("@per.hasPermission('i18n:data:del')") + public R removeById(@PathVariable("id") Integer id) { + return i18nDataService.removeById(id) ? R.ok() + : R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "通过id删除国际化信息失败"); + } + +} \ No newline at end of file diff --git a/ballcat-i18n/ballcat-i18n-model/pom.xml b/ballcat-i18n/ballcat-i18n-model/pom.xml new file mode 100644 index 00000000..10a566f9 --- /dev/null +++ b/ballcat-i18n/ballcat-i18n-model/pom.xml @@ -0,0 +1,25 @@ + + + + ballcat-i18n + com.hccake + ${revision} + + 4.0.0 + + ballcat-i18n-model + + + + com.baomidou + mybatis-plus-annotation + + + io.swagger + swagger-annotations + + + + \ No newline at end of file diff --git a/ballcat-i18n/ballcat-i18n-model/src/main/java/com/hccake/ballcat/i18n/converter/I18nDataConverter.java b/ballcat-i18n/ballcat-i18n-model/src/main/java/com/hccake/ballcat/i18n/converter/I18nDataConverter.java new file mode 100644 index 00000000..c85336b9 --- /dev/null +++ b/ballcat-i18n/ballcat-i18n-model/src/main/java/com/hccake/ballcat/i18n/converter/I18nDataConverter.java @@ -0,0 +1,25 @@ +package com.hccake.ballcat.i18n.converter; + +import com.hccake.ballcat.i18n.model.entity.I18nData; +import com.hccake.ballcat.i18n.model.vo.I18nDataPageVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 国际化信息模型转换器 + * + * @author hccake 2021-08-04 11:31:49 + */ +@Mapper +public interface I18nDataConverter { + + I18nDataConverter INSTANCE = Mappers.getMapper(I18nDataConverter.class); + + /** + * PO 转 PageVO + * @param i18nData 国际化信息 + * @return I18nDataPageVO 国际化信息PageVO + */ + I18nDataPageVO poToPageVo(I18nData i18nData); + +} diff --git a/ballcat-i18n/ballcat-i18n-model/src/main/java/com/hccake/ballcat/i18n/model/entity/I18nData.java b/ballcat-i18n/ballcat-i18n-model/src/main/java/com/hccake/ballcat/i18n/model/entity/I18nData.java new file mode 100644 index 00000000..8f499b15 --- /dev/null +++ b/ballcat-i18n/ballcat-i18n-model/src/main/java/com/hccake/ballcat/i18n/model/entity/I18nData.java @@ -0,0 +1,82 @@ +package com.hccake.ballcat.i18n.model.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 国际化信息 + * + * @author hccake 2021-08-04 11:31:49 + */ +@Data +@TableName("i18n_data") +@ApiModel(value = "国际化信息") +public class I18nData { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId + @ApiModelProperty(value = "ID") + private Integer id; + + /** + * 业务 + */ + @ApiModelProperty(value = "业务") + private String business; + + /** + * 关键词 + */ + @ApiModelProperty(value = "关键词") + private String messageKey; + + /** + * 唯一标识 = 业务:关键词 + */ + @ApiModelProperty(value = "唯一标识 = 业务:关键词") + private String code; + + /** + * 文本值,可以使用 { } 加角标,作为占位符 + */ + @ApiModelProperty(value = "文本值,可以使用 { } 加角标,作为占位符") + private String message; + + /** + * 语言标识 + */ + @ApiModelProperty(value = "语言标识") + private String languageTag; + + /** + * 备注 + */ + @ApiModelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建时间") + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @ApiModelProperty(value = "修改时间") + private LocalDateTime updateTime; + +} diff --git a/ballcat-i18n/ballcat-i18n-model/src/main/java/com/hccake/ballcat/i18n/model/qo/I18nDataQO.java b/ballcat-i18n/ballcat-i18n-model/src/main/java/com/hccake/ballcat/i18n/model/qo/I18nDataQO.java new file mode 100644 index 00000000..fe1afc3a --- /dev/null +++ b/ballcat-i18n/ballcat-i18n-model/src/main/java/com/hccake/ballcat/i18n/model/qo/I18nDataQO.java @@ -0,0 +1,24 @@ +package com.hccake.ballcat.i18n.model.qo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 国际化信息 查询对象 + * + * @author hccake 2021-08-04 11:31:49 + */ +@Data +@ApiModel(value = "国际化信息查询对象") +public class I18nDataQO { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @ApiModelProperty(value = "ID") + private Integer id; + +} \ No newline at end of file diff --git a/ballcat-i18n/ballcat-i18n-model/src/main/java/com/hccake/ballcat/i18n/model/vo/I18nDataPageVO.java b/ballcat-i18n/ballcat-i18n-model/src/main/java/com/hccake/ballcat/i18n/model/vo/I18nDataPageVO.java new file mode 100644 index 00000000..24e76873 --- /dev/null +++ b/ballcat-i18n/ballcat-i18n-model/src/main/java/com/hccake/ballcat/i18n/model/vo/I18nDataPageVO.java @@ -0,0 +1,74 @@ +package com.hccake.ballcat.i18n.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 国际化信息分页视图对象 + * + * @author hccake 2021-08-04 11:31:49 + */ +@Data +@ApiModel(value = "国际化信息分页视图对象") +public class I18nDataPageVO { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @ApiModelProperty(value = "ID") + private Integer id; + + /** + * 业务 + */ + @ApiModelProperty(value = "业务") + private String business; + + /** + * 关键词 + */ + @ApiModelProperty(value = "关键词") + private String messageKey; + + /** + * 唯一标识 = 业务:关键词 + */ + @ApiModelProperty(value = "唯一标识 = 业务:关键词") + private String code; + + /** + * 文本值,可以使用 { } 加角标,作为占位符 + */ + @ApiModelProperty(value = "文本值,可以使用 { } 加角标,作为占位符") + private String message; + + /** + * 语言标识 + */ + @ApiModelProperty(value = "语言标识") + private String languageTag; + + /** + * 备注 + */ + @ApiModelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @ApiModelProperty(value = "修改时间") + private LocalDateTime updateTime; + +} \ No newline at end of file diff --git a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-annotation/pom.xml b/ballcat-i18n/pom.xml similarity index 61% rename from ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-annotation/pom.xml rename to ballcat-i18n/pom.xml index cb31758f..f993fe3b 100644 --- a/ballcat-extends/ballcat-extend-i18n/ballcat-extend-i18n-annotation/pom.xml +++ b/ballcat-i18n/pom.xml @@ -3,16 +3,18 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - ballcat-extend-i18n + ballcat com.hccake ${revision} 4.0.0 - ballcat-extend-i18n-annotation - jar + ballcat-i18n + pom + + ballcat-i18n-model + ballcat-i18n-biz + ballcat-i18n-controller + - - - \ No newline at end of file diff --git a/ballcat-starters/ballcat-spring-boot-starter-i18n/pom.xml b/ballcat-starters/ballcat-spring-boot-starter-i18n/pom.xml deleted file mode 100644 index 530403a0..00000000 --- a/ballcat-starters/ballcat-spring-boot-starter-i18n/pom.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - 4.0.0 - - - ballcat-starters - com.hccake - ${revision} - - - ballcat-spring-boot-starter-i18n - - - - com.hccake - ballcat-extend-i18n-core - - - org.springframework.boot - spring-boot-autoconfigure - - - org.springframework.boot - spring-boot-configuration-processor - compile - - - - - \ No newline at end of file diff --git a/ballcat-starters/ballcat-spring-boot-starter-i18n/src/main/java/com/hccake/common/i18n/I18nAutoConfiguration.java b/ballcat-starters/ballcat-spring-boot-starter-i18n/src/main/java/com/hccake/common/i18n/I18nAutoConfiguration.java deleted file mode 100644 index 2a5e7ba8..00000000 --- a/ballcat-starters/ballcat-spring-boot-starter-i18n/src/main/java/com/hccake/common/i18n/I18nAutoConfiguration.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.hccake.common.i18n; - -import com.hccake.common.i18n.cache.CacheService; -import com.hccake.common.i18n.cache.LocalCacheService; -import com.hccake.common.i18n.cache.RedisCacheService; -import com.hccake.common.i18n.execute.DefaultTranslateExecute; -import com.hccake.common.i18n.execute.TranslateExecute; -import com.hccake.common.i18n.execute.TranslateExecuteWrapper; -import com.hccake.common.i18n.executor.CacheExecutor; -import com.hccake.common.i18n.executor.Executor; -import com.hccake.common.i18n.executor.ExecutorWrapper; -import com.hccake.common.i18n.executor.SimpleExecutor; -import com.hccake.common.i18n.generate.DefaultKeyGenerate; -import com.hccake.common.i18n.generate.KeyGenerate; -import lombok.RequiredArgsConstructor; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.DependsOn; -import org.springframework.data.redis.core.StringRedisTemplate; - -/** - * i18n auto configuration - * - * @author Yakir - */ -@RequiredArgsConstructor -@EnableConfigurationProperties(I18nProperties.class) -public class I18nAutoConfiguration { - - private final I18nProperties i18nProperties; - - private final I18nDataProvider i18nDataProvider; - - @Bean - @ConditionalOnMissingBean - public KeyGenerate keyGenerate() { - return new DefaultKeyGenerate(i18nProperties); - } - - @Bean - @ConditionalOnMissingBean - @ConditionalOnProperty(prefix = "ballcat.i18n.cache", name = "type", havingValue = "local", matchIfMissing = true) - public CacheService localCacheService() { - return new LocalCacheService(); - } - - @Bean - @ConditionalOnMissingBean - @DependsOn("redisTemplate") - @ConditionalOnProperty(prefix = "ballcat.i18n.cache", name = "type", havingValue = "redis") - public CacheService redisCacheService(StringRedisTemplate stringRedisTemplate) { - return new RedisCacheService(stringRedisTemplate); - } - - @Bean - @ConditionalOnMissingBean(Executor.class) - @ConditionalOnProperty(prefix = "ballcat.i18n", name = "executor", havingValue = "simple", matchIfMissing = true) - public Executor simpleExecutor() { - return new SimpleExecutor(i18nDataProvider); - } - - @Bean - @ConditionalOnBean(CacheService.class) - @ConditionalOnMissingBean(Executor.class) - @ConditionalOnProperty(prefix = "ballcat.i18n", name = "executor", havingValue = "cache") - public Executor cacheExecutor(KeyGenerate keyGenerate, CacheService cacheService) { - return new CacheExecutor(i18nDataProvider, i18nProperties, keyGenerate, cacheService); - } - - @Bean - @ConditionalOnBean(Executor.class) - @ConditionalOnMissingBean - public TranslateExecute translateExecute(Executor executor) { - return new DefaultTranslateExecute(new ExecutorWrapper(i18nProperties, executor)); - } - - @Bean - @ConditionalOnBean({ Executor.class, TranslateExecute.class }) - @ConditionalOnMissingBean - public TranslateExecuteWrapper translateExecuteWrapper(TranslateExecute translateExecute) { - TranslateExecuteWrapper translateExecuteWrapper = new TranslateExecuteWrapper(); - translateExecuteWrapper.setTranslateExecute(translateExecute); - return translateExecuteWrapper; - } - -} diff --git a/ballcat-starters/ballcat-spring-boot-starter-i18n/src/main/resources/META-INF/spring.factories b/ballcat-starters/ballcat-spring-boot-starter-i18n/src/main/resources/META-INF/spring.factories deleted file mode 100644 index b242e436..00000000 --- a/ballcat-starters/ballcat-spring-boot-starter-i18n/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,2 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - com.hccake.common.i18n.I18nAutoConfiguration \ No newline at end of file diff --git a/ballcat-starters/pom.xml b/ballcat-starters/pom.xml index df987db8..c3c063d1 100644 --- a/ballcat-starters/pom.xml +++ b/ballcat-starters/pom.xml @@ -28,7 +28,6 @@ ballcat-spring-boot-starter-websocket ballcat-spring-boot-starter-pay ballcat-spring-boot-starter-xss - ballcat-spring-boot-starter-i18n \ No newline at end of file diff --git a/ballcat-system/ballcat-system-model/pom.xml b/ballcat-system/ballcat-system-model/pom.xml index 9be11de5..bca0e155 100644 --- a/ballcat-system/ballcat-system-model/pom.xml +++ b/ballcat-system/ballcat-system-model/pom.xml @@ -11,6 +11,10 @@ ballcat-system-model + + com.hccake + ballcat-common-i18n + com.hccake ballcat-common-desensitize diff --git a/ballcat-system/ballcat-system-model/src/main/java/com/hccake/ballcat/system/model/vo/SysMenuPageVO.java b/ballcat-system/ballcat-system-model/src/main/java/com/hccake/ballcat/system/model/vo/SysMenuPageVO.java index 8e0b17be..ea205b7a 100644 --- a/ballcat-system/ballcat-system-model/src/main/java/com/hccake/ballcat/system/model/vo/SysMenuPageVO.java +++ b/ballcat-system/ballcat-system-model/src/main/java/com/hccake/ballcat/system/model/vo/SysMenuPageVO.java @@ -1,5 +1,7 @@ package com.hccake.ballcat.system.model.vo; +import com.hccake.ballcat.common.i18n.I18nClass; +import com.hccake.ballcat.common.i18n.I18nField; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -11,6 +13,7 @@ import java.time.LocalDateTime; * * @author hccake 2021-04-06 17:59:51 */ +@I18nClass @Data @ApiModel(value = "菜单权限分页视图对象") public class SysMenuPageVO { @@ -32,6 +35,8 @@ public class SysMenuPageVO { /** * 菜单名称 */ + // TODO 原始 title 也返回,方便前端回显和修改 + @I18nField @ApiModelProperty(value = "菜单名称") private String title; diff --git a/ballcat-system/ballcat-system-model/src/main/java/com/hccake/ballcat/system/model/vo/SysMenuRouterVO.java b/ballcat-system/ballcat-system-model/src/main/java/com/hccake/ballcat/system/model/vo/SysMenuRouterVO.java index 6ef521f1..f613e09a 100644 --- a/ballcat-system/ballcat-system-model/src/main/java/com/hccake/ballcat/system/model/vo/SysMenuRouterVO.java +++ b/ballcat-system/ballcat-system-model/src/main/java/com/hccake/ballcat/system/model/vo/SysMenuRouterVO.java @@ -1,5 +1,7 @@ package com.hccake.ballcat.system.model.vo; +import com.hccake.ballcat.common.i18n.I18nClass; +import com.hccake.ballcat.common.i18n.I18nField; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -10,6 +12,7 @@ import lombok.Data; * @author hccake 2021-04-06 17:59:51 */ @Data +@I18nClass @ApiModel(value = "菜单权限视图对象") public class SysMenuRouterVO { @@ -30,6 +33,7 @@ public class SysMenuRouterVO { /** * 菜单名称 */ + @I18nField @ApiModelProperty(value = "菜单名称") private String title; diff --git a/pom.xml b/pom.xml index d2c3a002..875001fa 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,8 @@ ballcat-auth ballcat-notify ballcat-log - + ballcat-i18n + ballcat 项目基本脚手架 https://github.com/hccake/ballcat