From 13b31b2ca2a5f8600002a042b536c9d5529842e3 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期一, 09 三月 2026 19:21:18 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/common/i18n/I18nLocaleUtils.java |  114 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 114 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/zy/common/i18n/I18nLocaleUtils.java b/src/main/java/com/zy/common/i18n/I18nLocaleUtils.java
new file mode 100644
index 0000000..23029f2
--- /dev/null
+++ b/src/main/java/com/zy/common/i18n/I18nLocaleUtils.java
@@ -0,0 +1,114 @@
+package com.zy.common.i18n;
+
+import com.core.common.Cools;
+
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class I18nLocaleUtils {
+
+    private static final Set<String> UPPERCASE_WORDS = new HashSet<>(
+            Arrays.asList("ai", "api", "wcs", "wms", "llm", "rgv", "crn", "plc", "http", "mcp", "erp", "io")
+    );
+
+    private static final Pattern WORD_BOUNDARY = Pattern.compile("([a-z0-9])([A-Z])");
+
+    private I18nLocaleUtils() {
+    }
+
+    public static Locale defaultLocale(I18nProperties properties) {
+        return toLocale(properties.getDefaultLocale());
+    }
+
+    public static Locale toLocale(String value) {
+        if (Cools.isEmpty(value)) {
+            return Locale.SIMPLIFIED_CHINESE;
+        }
+        String normalized = value.replace('_', '-').trim();
+        return Locale.forLanguageTag(normalized);
+    }
+
+    public static String toTag(Locale locale) {
+        if (locale == null) {
+            return "zh-CN";
+        }
+        String tag = locale.toLanguageTag();
+        return Cools.isEmpty(tag) || "und".equalsIgnoreCase(tag) ? "zh-CN" : tag;
+    }
+
+    public static Locale resolveLocale(String requested, I18nProperties properties) {
+        Locale fallback = defaultLocale(properties);
+        if (Cools.isEmpty(requested)) {
+            return fallback;
+        }
+        String requestedTag = requested.replace('_', '-').trim();
+        if (requestedTag.contains(",")) {
+            requestedTag = requestedTag.substring(0, requestedTag.indexOf(',')).trim();
+        }
+        if (requestedTag.contains(";")) {
+            requestedTag = requestedTag.substring(0, requestedTag.indexOf(';')).trim();
+        }
+        for (String supported : properties.getSupportedLocales()) {
+            String supportedTag = supported.replace('_', '-').trim();
+            if (supportedTag.equalsIgnoreCase(requestedTag)) {
+                return toLocale(supportedTag);
+            }
+            Locale supportedLocale = toLocale(supportedTag);
+            if (supportedLocale.getLanguage().equalsIgnoreCase(toLocale(requestedTag).getLanguage())) {
+                return supportedLocale;
+            }
+        }
+        return fallback;
+    }
+
+    public static boolean isDefaultLocale(Locale locale, I18nProperties properties) {
+        return toTag(defaultLocale(properties)).equalsIgnoreCase(toTag(locale));
+    }
+
+    public static String humanizeCode(String code) {
+        if (Cools.isEmpty(code)) {
+            return null;
+        }
+        String normalized = code;
+        int hashIndex = normalized.indexOf('#');
+        if (hashIndex > -1 && hashIndex < normalized.length() - 1) {
+            normalized = normalized.substring(hashIndex + 1);
+        } else {
+            int slashIndex = normalized.lastIndexOf('/');
+            if (slashIndex > -1 && slashIndex < normalized.length() - 1) {
+                normalized = normalized.substring(slashIndex + 1);
+            }
+            if (normalized.endsWith(".html")) {
+                normalized = normalized.substring(0, normalized.length() - 5);
+            }
+        }
+        normalized = normalized.replaceAll("[^A-Za-z0-9_\\-]+", " ");
+        Matcher matcher = WORD_BOUNDARY.matcher(normalized);
+        normalized = matcher.replaceAll("$1 $2");
+        normalized = normalized.replace('_', ' ').replace('-', ' ');
+        String[] parts = normalized.trim().split("\\s+");
+        if (parts.length == 0) {
+            return code;
+        }
+        StringBuilder builder = new StringBuilder();
+        for (String part : parts) {
+            if (Cools.isEmpty(part)) {
+                continue;
+            }
+            if (builder.length() > 0) {
+                builder.append(' ');
+            }
+            String lower = part.toLowerCase(Locale.ENGLISH);
+            if (UPPERCASE_WORDS.contains(lower)) {
+                builder.append(lower.toUpperCase(Locale.ENGLISH));
+            } else {
+                builder.append(Character.toUpperCase(part.charAt(0)));
+                if (part.length() > 1) {
+                    builder.append(part.substring(1));
+                }
+            }
+        }
+        return builder.length() == 0 ? code : builder.toString();
+    }
+}

--
Gitblit v1.9.1