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