From a90b4dadeca85c474bcf89c53ba65c5fa3ade051 Mon Sep 17 00:00:00 2001 From: Timi Date: Thu, 8 Oct 2026 08:39:54 +0800 Subject: [PATCH 1/2] refactor --- ...ual.java => FileMultilingualResolver.java} | 10 +-- ...lingual.java => MultilingualResolver.java} | 34 ++++----- ...ava => ResourcesMultilingualResolver.java} | 10 +-- .../java/com/imyeyu/lang/bean/Language.java | 74 +++++++++++++++++++ .../com/imyeyu/lang/bean/LanguageMapping.java | 54 ++++++++++++++ .../com/imyeyu/lang/bean/Multilingual.java | 21 ++++++ .../imyeyu/lang/bean/MultilingualValue.java | 25 +++++++ .../lang/mapper/AbstractLanguageMapper.java | 12 +-- .../imyeyu/lang/mapper/FileLanguageMap.java | 2 +- .../com/imyeyu/lang/mapper/LanguageMap.java | 20 ++--- .../lang/mapper/PropertiesLanguageMap.java | 2 +- .../lang/mapper/ResourcesLanguageMap.java | 2 +- .../imyeyu/lang/message/MessageResolver.java | 24 ------ src/test/java/test/TestLang.java | 4 +- 14 files changed, 222 insertions(+), 72 deletions(-) rename src/main/java/com/imyeyu/lang/{multi/FileMultilingual.java => FileMultilingualResolver.java} (85%) rename src/main/java/com/imyeyu/lang/{multi/Multilingual.java => MultilingualResolver.java} (84%) rename src/main/java/com/imyeyu/lang/{multi/ResourcesMultilingual.java => ResourcesMultilingualResolver.java} (85%) create mode 100644 src/main/java/com/imyeyu/lang/bean/Language.java create mode 100644 src/main/java/com/imyeyu/lang/bean/LanguageMapping.java create mode 100644 src/main/java/com/imyeyu/lang/bean/Multilingual.java create mode 100644 src/main/java/com/imyeyu/lang/bean/MultilingualValue.java delete mode 100644 src/main/java/com/imyeyu/lang/message/MessageResolver.java diff --git a/src/main/java/com/imyeyu/lang/multi/FileMultilingual.java b/src/main/java/com/imyeyu/lang/FileMultilingualResolver.java similarity index 85% rename from src/main/java/com/imyeyu/lang/multi/FileMultilingual.java rename to src/main/java/com/imyeyu/lang/FileMultilingualResolver.java index a1bc69c..f9b5828 100644 --- a/src/main/java/com/imyeyu/lang/multi/FileMultilingual.java +++ b/src/main/java/com/imyeyu/lang/FileMultilingualResolver.java @@ -1,6 +1,6 @@ -package com.imyeyu.lang.multi; +package com.imyeyu.lang; -import com.imyeyu.java.bean.Language; +import com.imyeyu.lang.bean.Language; import com.imyeyu.lang.mapper.AbstractLanguageMapper; import com.imyeyu.lang.mapper.FileLanguageMap; import com.imyeyu.lang.mapper.LanguageMap; @@ -11,9 +11,9 @@ import com.imyeyu.lang.mapper.LanguageMap; * @author 夜雨 * @version 2024-04-09 01:06 */ -public class FileMultilingual extends Multilingual { +public class FileMultilingualResolver extends MultilingualResolver { - public FileMultilingual() { + public FileMultilingualResolver() { } /** @@ -21,7 +21,7 @@ public class FileMultilingual extends Multilingual { * * @param path 文件路径模板,使用 %s 作为语言代码占位符,例如:lang/app_%s.lang */ - public FileMultilingual(String path) { + public FileMultilingualResolver(String path) { addAll(path); } diff --git a/src/main/java/com/imyeyu/lang/multi/Multilingual.java b/src/main/java/com/imyeyu/lang/MultilingualResolver.java similarity index 84% rename from src/main/java/com/imyeyu/lang/multi/Multilingual.java rename to src/main/java/com/imyeyu/lang/MultilingualResolver.java index 63bb21b..3d7f479 100644 --- a/src/main/java/com/imyeyu/lang/multi/Multilingual.java +++ b/src/main/java/com/imyeyu/lang/MultilingualResolver.java @@ -1,9 +1,9 @@ -package com.imyeyu.lang.multi; +package com.imyeyu.lang; import com.imyeyu.java.bean.CallbackArg; -import com.imyeyu.java.bean.Language; -import com.imyeyu.java.bean.LanguageMapping; import com.imyeyu.java.ref.Ref; +import com.imyeyu.lang.bean.Language; +import com.imyeyu.lang.bean.LanguageMapping; import com.imyeyu.lang.mapper.AbstractLanguageMapper; import lombok.Getter; @@ -21,7 +21,7 @@ import java.util.Objects; * say.msg=hello {0} * * // 加载 - * Multilingual lang = Multilingual.getInstance(); + * MultilingualResolver lang = MultilingualResolver.getInstance(); * lang.load(Language.zh_CN, "lang/timijava/%s.lang"); * * // 加载所有支持的映射文件 @@ -31,17 +31,17 @@ import java.util.Objects; * lang.setActivated("zh_CN"); * * // 引用当前激活语言 - * Multilingual.text("say.msg"); - * Multilingual.text("say.msg", "timi-java"); + * MultilingualResolver.text("say.msg"); + * MultilingualResolver.text("say.msg", "timi-java"); * * // 动态引用 - * Multilingual.map("en_US").text("say.msg"); + * MultilingualResolver.map("en_US").text("say.msg"); * * * @author 夜雨 * @version 2021-10-25 15:16 */ -public class Multilingual implements LanguageMapping { +public class MultilingualResolver implements LanguageMapping { /** 多语言映射表,存储各语言对应的映射器 */ protected final Map multilingualMap; @@ -62,7 +62,7 @@ public class Multilingual implements LanguageMapping { * 根据系统默认 Locale 初始化激活语言,如果无法识别则默认为中文 *

*/ - public Multilingual() { + public MultilingualResolver() { multilingualMap = new HashMap<>(); updateActiveListeners = new ArrayList<>(); @@ -199,19 +199,19 @@ public class Multilingual implements LanguageMapping { * mapping=@test.msg * no_mapping=\@test.msg * - * Multilingual.text("mapping"); // Hello world - * Multilingual.text("no_mapping"); // @test.msg + * MultilingualResolver.text("mapping"); // Hello world + * MultilingualResolver.text("no_mapping"); // @test.msg * * * @param key 键 * @return 文本值 */ @Override - public String text(String key) { + public String message(String key) { if (multilingualMap.get(getActivated()) == null) { return key; } - return multilingualMap.get(getActivated()).text(key); + return multilingualMap.get(getActivated()).message(key); } /** @@ -222,11 +222,11 @@ public class Multilingual implements LanguageMapping { * @return 获取结果 */ @Override - public String text(String key, String def) { + public String message(String key, String def) { if (multilingualMap.get(getActivated()) == null) { return Objects.requireNonNullElse(def, key); } - return multilingualMap.get(getActivated()).text(key, def); + return multilingualMap.get(getActivated()).message(key, def); } /** @@ -237,10 +237,10 @@ public class Multilingual implements LanguageMapping { * @return 结果 */ @Override - public String textArgs(String key, Map argsMap) { + public String message(String key, Map argsMap) { if (multilingualMap.get(getActivated()) == null) { return key; } - return multilingualMap.get(getActivated()).textArgs(key, argsMap); + return multilingualMap.get(getActivated()).message(key, argsMap); } } diff --git a/src/main/java/com/imyeyu/lang/multi/ResourcesMultilingual.java b/src/main/java/com/imyeyu/lang/ResourcesMultilingualResolver.java similarity index 85% rename from src/main/java/com/imyeyu/lang/multi/ResourcesMultilingual.java rename to src/main/java/com/imyeyu/lang/ResourcesMultilingualResolver.java index d3b3360..60e3a12 100644 --- a/src/main/java/com/imyeyu/lang/multi/ResourcesMultilingual.java +++ b/src/main/java/com/imyeyu/lang/ResourcesMultilingualResolver.java @@ -1,6 +1,6 @@ -package com.imyeyu.lang.multi; +package com.imyeyu.lang; -import com.imyeyu.java.bean.Language; +import com.imyeyu.lang.bean.Language; import com.imyeyu.lang.mapper.AbstractLanguageMapper; import com.imyeyu.lang.mapper.LanguageMap; import com.imyeyu.lang.mapper.ResourcesLanguageMap; @@ -14,9 +14,9 @@ import com.imyeyu.lang.mapper.ResourcesLanguageMap; * @author 夜雨 * @version 2024-04-09 01:03 */ -public class ResourcesMultilingual extends Multilingual { +public class ResourcesMultilingualResolver extends MultilingualResolver { - public ResourcesMultilingual() { + public ResourcesMultilingualResolver() { } /** @@ -24,7 +24,7 @@ public class ResourcesMultilingual extends Multilingual { * * @param path 资源文件路径模板,使用 %s 作为语言代码占位符,例如:lang/app_%s.lang */ - public ResourcesMultilingual(String path) { + public ResourcesMultilingualResolver(String path) { addAll(path); } diff --git a/src/main/java/com/imyeyu/lang/bean/Language.java b/src/main/java/com/imyeyu/lang/bean/Language.java new file mode 100644 index 0000000..ca9af49 --- /dev/null +++ b/src/main/java/com/imyeyu/lang/bean/Language.java @@ -0,0 +1,74 @@ +package com.imyeyu.lang.bean; + +import com.imyeyu.java.ref.Ref; +import lombok.Data; + +/** + * 多语言 + * + * @author 夜雨 + * @since 2022-02-23 11:25 + */ +@Data +public class Language { + + /** + * 支持语言枚举 + * + * @author 夜雨 + * @since 2025-12-05 14:31 + */ + public enum Enum { + + /** 英语 */ + en_US, + + /** 简中 */ + zh_CN, + + /** 繁中 */ + zh_TW, + + /** 日语 */ + ja_JP, + + /** 韩语 */ + ko_KR, + + /** 俄语 */ + ru_RU, + + /** 德语 */ + de_DE; + } + + protected String key; + + protected String zhCN; + + protected String zhTW; + + protected String enUS; + + protected String ruRU; + + protected String koKR; + + protected String jaJP; + + protected String deDE; + + /** + * 获取指定语言值 + * + * @param language 指定语言 + * @return 值 + */ + public String getValue(Enum language) { + try { + return Ref.getFieldValue(this, language.toString().replace("_", ""), String.class); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/com/imyeyu/lang/bean/LanguageMapping.java b/src/main/java/com/imyeyu/lang/bean/LanguageMapping.java new file mode 100644 index 0000000..18dd097 --- /dev/null +++ b/src/main/java/com/imyeyu/lang/bean/LanguageMapping.java @@ -0,0 +1,54 @@ +package com.imyeyu.lang.bean; + +import java.util.Map; + +/** + * 多语言映射接口 + * + * @author 夜雨 + * @since 2024-04-03 11:27 + */ +public interface LanguageMapping { + + /** + * 添加映射 + * + * @param key 键 + * @param value 值 + */ + void add(String key, String value); + + /** + * 是否存在映射 + * + * @param key 键 + * @return true 为存在 + */ + boolean has(String key); + + /** + * 获取映射值 + * + * @param key 键 + * @return 值 + */ + String message(String key); + + /** + * 获取映射值,不存在时使用默认值 + * + * @param key 键 + * @param def 默认值 + * @return 值 + */ + String message(String key, String def); + + /** + * 获取映射值并插入参数 + * + * @param key 键 + * @param argsMap 参数列表 + * @return 值 + */ + String message(String key, Map argsMap); +} diff --git a/src/main/java/com/imyeyu/lang/bean/Multilingual.java b/src/main/java/com/imyeyu/lang/bean/Multilingual.java new file mode 100644 index 0000000..d26b4a7 --- /dev/null +++ b/src/main/java/com/imyeyu/lang/bean/Multilingual.java @@ -0,0 +1,21 @@ +package com.imyeyu.lang.bean; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 多语言数据契约 + * + * @author 夜雨 + * @since 2026-09-18 13:35 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class Multilingual extends Language implements MultilingualValue { + + /** 唯一标识 */ + private String id; + + /** 业务类型 */ + private String bizType; +} diff --git a/src/main/java/com/imyeyu/lang/bean/MultilingualValue.java b/src/main/java/com/imyeyu/lang/bean/MultilingualValue.java new file mode 100644 index 0000000..6c389e6 --- /dev/null +++ b/src/main/java/com/imyeyu/lang/bean/MultilingualValue.java @@ -0,0 +1,25 @@ +package com.imyeyu.lang.bean; + +/** + * 多语言值对象 + * + * @author 夜雨 + * @since 2026-09-18 13:35 + */ +public interface MultilingualValue { + + /** + * 获取唯一标识 + * + * @return 唯一标识 + */ + String getId(); + + /** + * 获取指定语言值 + * + * @param language 指定语言 + * @return 语言值 + */ + String getValue(Language.Enum language); +} diff --git a/src/main/java/com/imyeyu/lang/mapper/AbstractLanguageMapper.java b/src/main/java/com/imyeyu/lang/mapper/AbstractLanguageMapper.java index 5c405c2..e043aa1 100644 --- a/src/main/java/com/imyeyu/lang/mapper/AbstractLanguageMapper.java +++ b/src/main/java/com/imyeyu/lang/mapper/AbstractLanguageMapper.java @@ -1,7 +1,7 @@ package com.imyeyu.lang.mapper; -import com.imyeyu.java.bean.Language; -import com.imyeyu.java.bean.LanguageMapping; +import com.imyeyu.lang.bean.Language; +import com.imyeyu.lang.bean.LanguageMapping; import com.imyeyu.utils.StringInterpolator; import lombok.Getter; import lombok.Setter; @@ -44,8 +44,8 @@ public abstract class AbstractLanguageMapper implements LanguageMapping { * @return 获取结果 */ @Override - public String text(String key, String def) { - String result = text(key); + public String message(String key, String def) { + String result = message(key); return result.equals(key) ? def : result; } @@ -57,7 +57,7 @@ public abstract class AbstractLanguageMapper implements LanguageMapping { * @return 替换占位符后的文本 */ @Override - public String textArgs(String key, Map args) { - return INTERPOLATOR.inject(text(key), args); + public String message(String key, Map args) { + return INTERPOLATOR.inject(message(key), args); } } diff --git a/src/main/java/com/imyeyu/lang/mapper/FileLanguageMap.java b/src/main/java/com/imyeyu/lang/mapper/FileLanguageMap.java index 748615f..5f9f4f0 100644 --- a/src/main/java/com/imyeyu/lang/mapper/FileLanguageMap.java +++ b/src/main/java/com/imyeyu/lang/mapper/FileLanguageMap.java @@ -1,7 +1,7 @@ package com.imyeyu.lang.mapper; import com.imyeyu.io.IO; -import com.imyeyu.java.bean.Language; +import com.imyeyu.lang.bean.Language; import java.io.InputStream; import java.io.InputStreamReader; diff --git a/src/main/java/com/imyeyu/lang/mapper/LanguageMap.java b/src/main/java/com/imyeyu/lang/mapper/LanguageMap.java index e65795a..b6621c9 100644 --- a/src/main/java/com/imyeyu/lang/mapper/LanguageMap.java +++ b/src/main/java/com/imyeyu/lang/mapper/LanguageMap.java @@ -1,7 +1,7 @@ package com.imyeyu.lang.mapper; import com.imyeyu.java.TimiJava; -import com.imyeyu.java.bean.Language; +import com.imyeyu.lang.bean.Language; import com.imyeyu.utils.Text; import java.util.HashMap; @@ -26,7 +26,7 @@ public class LanguageMap extends AbstractLanguageMapper { { INTERPOLATOR.putFilter("lang", value -> { if (value.startsWith("@")) { - value = text(value.substring(1)); + value = message(value.substring(1)); } return value; }); @@ -83,20 +83,20 @@ public class LanguageMap extends AbstractLanguageMapper { * mapping=@test.msg * no_mapping=\@test.msg * - * Multilingual.text("mapping"); // Hello world - * Multilingual.text("no_mapping"); // @test.msg + * MultilingualResolver.text("mapping"); // Hello world + * MultilingualResolver.text("no_mapping"); // @test.msg * * * @param key 键 * @return 文本值 */ @Override - public String text(String key) { + public String message(String key) { if (map.containsKey(key)) { String result = map.get(key); if (result.startsWith("@")) { // 递归映射 - return text(result.substring(1)); + return message(result.substring(1)); } else { if (result.startsWith("\\@")) { return result.substring(1); @@ -134,8 +134,8 @@ public class LanguageMap extends AbstractLanguageMapper { * @return 获取结果 */ @Override - public String text(String key, String def) { - String result = text(key); + public String message(String key, String def) { + String result = message(key); return key.equals(result) ? def : result; } @@ -147,7 +147,7 @@ public class LanguageMap extends AbstractLanguageMapper { * @return 结果 */ @Override - public String textArgs(String key, Map argsMap) { - return INTERPOLATOR.inject(text(key), argsMap); + public String message(String key, Map argsMap) { + return INTERPOLATOR.inject(message(key), argsMap); } } diff --git a/src/main/java/com/imyeyu/lang/mapper/PropertiesLanguageMap.java b/src/main/java/com/imyeyu/lang/mapper/PropertiesLanguageMap.java index b7aa67c..417c70d 100644 --- a/src/main/java/com/imyeyu/lang/mapper/PropertiesLanguageMap.java +++ b/src/main/java/com/imyeyu/lang/mapper/PropertiesLanguageMap.java @@ -1,6 +1,6 @@ package com.imyeyu.lang.mapper; -import com.imyeyu.java.bean.Language; +import com.imyeyu.lang.bean.Language; import java.util.HashMap; import java.util.Properties; diff --git a/src/main/java/com/imyeyu/lang/mapper/ResourcesLanguageMap.java b/src/main/java/com/imyeyu/lang/mapper/ResourcesLanguageMap.java index 2daf377..bf0a822 100644 --- a/src/main/java/com/imyeyu/lang/mapper/ResourcesLanguageMap.java +++ b/src/main/java/com/imyeyu/lang/mapper/ResourcesLanguageMap.java @@ -1,7 +1,7 @@ package com.imyeyu.lang.mapper; import com.imyeyu.io.IO; -import com.imyeyu.java.bean.Language; +import com.imyeyu.lang.bean.Language; import java.io.FileNotFoundException; import java.io.InputStream; diff --git a/src/main/java/com/imyeyu/lang/message/MessageResolver.java b/src/main/java/com/imyeyu/lang/message/MessageResolver.java deleted file mode 100644 index 3cbf839..0000000 --- a/src/main/java/com/imyeyu/lang/message/MessageResolver.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.imyeyu.lang.message; - -import com.imyeyu.java.bean.Language; - -import java.util.Map; - -/** - * 消息解析器 - * - * @author 夜雨 - * @since 2026-08-01 00:00 - */ -public interface MessageResolver { - - /** - * 解析消息 - * - * @param messageCode 消息代码 - * @param messageArgs 消息插值参数 - * @param language 语言 - * @return 消息 - */ - String resolve(String messageCode, Map messageArgs, Language.Enum language); -} diff --git a/src/test/java/test/TestLang.java b/src/test/java/test/TestLang.java index b4e76ec..f39ba9c 100644 --- a/src/test/java/test/TestLang.java +++ b/src/test/java/test/TestLang.java @@ -1,6 +1,6 @@ package test; -import com.imyeyu.java.bean.Language; +import com.imyeyu.lang.bean.Language; import com.imyeyu.lang.mapper.ResourcesLanguageMap; import org.junit.jupiter.api.Test; @@ -16,6 +16,6 @@ public class TestLang { public void testArgs() { ResourcesLanguageMap map = new ResourcesLanguageMap(Language.Enum.zh_CN); map.load("zh_CN.lang"); - System.out.println(map.textArgs("test", Map.of("msg", "hello world"))); + System.out.println(map.message("test", Map.of("msg", "hello world"))); } } -- 2.54.0 From f59e8e7743ae05d0ceb1f05ffe891df46fed550a Mon Sep 17 00:00:00 2001 From: Timi Date: Thu, 8 Oct 2026 08:40:04 +0800 Subject: [PATCH 2/2] v0.1.0 --- pom.xml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 54ed68a..491f8e2 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.imyeyu.lang timi-lang - 0.0.5 + 0.1.0 jar @@ -93,12 +93,7 @@ com.imyeyu.io timi-io - 0.0.5 - - - com.imyeyu.java - timi-java - 0.0.6 + 0.1.1 org.junit.jupiter -- 2.54.0