diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 6ea57a27d..3cbdc88fc 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -28,6 +28,7 @@
ruoyi-common-security
ruoyi-common-sms
ruoyi-common-web
+ ruoyi-common-translation
ruoyi-common
diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml
index 49c859df8..84d9cb012 100644
--- a/ruoyi-common/ruoyi-common-bom/pom.xml
+++ b/ruoyi-common/ruoyi-common-bom/pom.xml
@@ -130,6 +130,14 @@
ruoyi-common-web
${revision}
+
+
+
+ com.ruoyi
+ ruoyi-common-translation
+ ${revision}
+
+
diff --git a/ruoyi-common/ruoyi-common-translation/pom.xml b/ruoyi-common/ruoyi-common-translation/pom.xml
new file mode 100644
index 000000000..b4844681a
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-translation/pom.xml
@@ -0,0 +1,28 @@
+
+
+
+ com.ruoyi
+ ruoyi-common
+ ${revision}
+ ../pom.xml
+
+ 4.0.0
+
+ ruoyi-common-translation
+
+
+ ruoyi-common-translation 通用翻译功能
+
+
+
+
+
+ com.ruoyi
+ ruoyi-common-core
+
+
+
+
+
diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/annotation/Translation.java b/ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/annotation/Translation.java
new file mode 100644
index 000000000..158c35077
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/annotation/Translation.java
@@ -0,0 +1,32 @@
+package com.ruoyi.common.translation.annotation;
+
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.ruoyi.common.translation.core.handler.TranslationHandler;
+
+import java.lang.annotation.*;
+
+/**
+ * 通用翻译注解
+ *
+ * @author Lion Li
+ */
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD, ElementType.METHOD})
+@Documented
+@JacksonAnnotationsInside
+@JsonSerialize(using = TranslationHandler.class)
+public @interface Translation {
+
+ /**
+ * 类型 (需与实现类上的 {@link com.ruoyi.common.translation.annotation.TranslationType} 注解type对应)
+ */
+ String type();
+
+ /**
+ * 通用Key 如果为空则取被标注的字段值 例如: 字典type(sys_user_sex)
+ */
+ String key() default "";
+
+}
diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/annotation/TranslationType.java b/ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/annotation/TranslationType.java
new file mode 100644
index 000000000..1b64e5370
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/annotation/TranslationType.java
@@ -0,0 +1,21 @@
+package com.ruoyi.common.translation.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * 翻译类型注解 (标注到{@link com.ruoyi.common.translation.core.TranslationInterface} 的实现类)
+ *
+ * @author Lion Li
+ */
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE})
+@Documented
+public @interface TranslationType {
+
+ /**
+ * 类型
+ */
+ String type();
+
+}
diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/config/TranslationConfig.java b/ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/config/TranslationConfig.java
new file mode 100644
index 000000000..d589fdde6
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/config/TranslationConfig.java
@@ -0,0 +1,41 @@
+package com.ruoyi.common.translation.config;
+
+import com.ruoyi.common.translation.annotation.TranslationType;
+import com.ruoyi.common.translation.core.TranslationInterface;
+import com.ruoyi.common.translation.core.handler.TranslationHandler;
+import jakarta.annotation.PostConstruct;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 翻译模块配置类
+ *
+ * @author Lion Li
+ */
+@Slf4j
+@AutoConfiguration
+public class TranslationConfig {
+
+ @Autowired
+ private List list;
+
+ @PostConstruct
+ public void init() {
+ Map map = new HashMap<>(list.size());
+ for (TranslationInterface trans : list) {
+ if (trans.getClass().isAnnotationPresent(TranslationType.class)) {
+ TranslationType annotation = trans.getClass().getAnnotation(TranslationType.class);
+ map.put(annotation.type(), trans);
+ } else {
+ log.warn(trans.getClass().getName() + " 翻译实现类未标注 TranslationType 注解!");
+ }
+ }
+ TranslationHandler.TRANSLATION_MAPPER.putAll(map);
+ }
+
+}
diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/constant/TransConstant.java b/ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/constant/TransConstant.java
new file mode 100644
index 000000000..84c4bba92
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/constant/TransConstant.java
@@ -0,0 +1,22 @@
+package com.ruoyi.common.translation.constant;
+
+/**
+ * 翻译常量
+ *
+ * @author Lion Li
+ */
+public interface TransConstant {
+
+ /**
+ * 用户名翻译
+ */
+ String USER_ID_TO_NAME = "userIdToName";
+
+ /**
+ * 字典值翻译
+ */
+ String DICT_TYPE_TO_LABEL = "dictTypeToLabel";
+
+ String OSS_ID_TO_URL = "ossIdToUrl";
+
+}
diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/core/TranslationInterface.java b/ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/core/TranslationInterface.java
new file mode 100644
index 000000000..449e8943b
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/core/TranslationInterface.java
@@ -0,0 +1,17 @@
+package com.ruoyi.common.translation.core;
+
+/**
+ * 翻译接口 (实现类需标注 {@link com.ruoyi.common.translation.annotation.TranslationType} 注解标明翻译类型)
+ *
+ * @author Lion Li
+ */
+public interface TranslationInterface {
+
+ /**
+ * 翻译
+ *
+ * @param key 需要被翻译的键
+ * @return 返回键对应的值
+ */
+ String translation(Object key);
+}
diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/core/handler/TranslationHandler.java b/ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/core/handler/TranslationHandler.java
new file mode 100644
index 000000000..1ca2f0728
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/core/handler/TranslationHandler.java
@@ -0,0 +1,61 @@
+package com.ruoyi.common.translation.core.handler;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.BeanProperty;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.ContextualSerializer;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.translation.annotation.Translation;
+import com.ruoyi.common.translation.core.TranslationInterface;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeansException;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 翻译处理器
+ *
+ * @author Lion Li
+ */
+@Slf4j
+public class TranslationHandler extends JsonSerializer