+ * 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