ソースを参照

动态多语言

yanghao 4 日 前
コミット
55235106f5

BIN
src/assets/images/banner3_white.png


+ 26 - 1
src/config/axios/service.ts

@@ -16,6 +16,7 @@ import {
   removeToken,
   setToken,
 } from "@utils/auth";
+import { langHelper } from "@/utils/langHelper";
 import errorCode from "./errorCode";
 
 import { resetRouter } from "@/router";
@@ -174,7 +175,31 @@ service.interceptors.response.use(
       }
       return Promise.reject("error");
     } else {
-      return data;
+      const requestUrl = response.config.url || "";
+      // 判断是否包含rq/iot路径
+      if (requestUrl.includes("portal/flow-group/all")) {
+        // 判断当前语言
+
+        const lang = localStorage.getItem("yf-portal-locale") || "zh";
+
+        if (data && data.data !== null && data.data !== undefined) {
+          if (Array.isArray(data.data)) {
+            const list = langHelper.transformArray(data.data, lang);
+            data.data = list;
+            return data;
+          } else if (typeof data.data === "object") {
+            data.data = langHelper.transformObject(data.data, lang);
+            return data;
+          } else {
+            if (typeof data.data === "string") {
+              data.data = langHelper.getDisplayText(data.data, lang);
+            }
+            return data;
+          }
+        }
+      } else {
+        return data;
+      }
     }
   },
   (error: AxiosError) => {

+ 68 - 0
src/utils/langHelper.ts

@@ -0,0 +1,68 @@
+interface LangPair {
+  zh: string;
+  en: string;
+  ru: string;
+}
+
+export const langHelper = {
+  parseLangString(str: string): LangPair {
+    if (!str.includes("~~")) return { zh: str, en: str, ru: str };
+    const [zhPart, enPart, ruPart] = str.split("~~");
+    const fallbackZh = zhPart.replace("zh-CN**", "").replace("zh**", "");
+    return {
+      zh: fallbackZh,
+      en: enPart?.replace("en**", "") || fallbackZh,
+      ru: ruPart ? ruPart.replace("ru**", "") : fallbackZh,
+    };
+  },
+
+  getDisplayText(str: string, currentLang: string): string {
+    const { zh, en, ru } = this.parseLangString(str);
+    if (currentLang === "zh" || currentLang === "zh-CN") {
+      return zh;
+    }
+
+    if (currentLang === "en") {
+      return en;
+    }
+
+    if (currentLang === "ru") {
+      return ru;
+    }
+
+    return zh;
+  },
+
+  transformObject<T extends Record<string, any>>(
+    obj: T,
+    currentLang: string,
+  ): T {
+    if (obj === null || obj === undefined) {
+      return obj;
+    }
+    if (typeof obj === "number") {
+      return obj;
+    }
+    if (typeof obj === "string") {
+      return this.getDisplayText(obj, currentLang);
+    }
+    const result = { ...obj };
+    for (const key in result) {
+      if (Array.isArray(result[key])) {
+        result[key] = this.transformArray(result[key], currentLang);
+      } else if (typeof result[key] === "string") {
+        result[key] = this.getDisplayText(result[key], currentLang);
+      } else if (typeof result[key] === "object" && result[key] !== null) {
+        result[key] = this.transformObject(result[key], currentLang);
+      }
+    }
+    return result;
+  },
+
+  transformArray<T extends Record<string, any>>(
+    arr: T[],
+    currentLang: string,
+  ): T[] {
+    return arr.map((item) => this.transformObject(item, currentLang));
+  },
+};

+ 0 - 15
src/views/index.vue

@@ -1553,18 +1553,6 @@ onUnmounted(() => {
       transparent 28%
     ),
     linear-gradient(180deg, #eef3f9 0%, #f7faff 46%, #eef3f9 100%);
-  background-image:
-    /* linear-gradient(rgba(245, 249, 255, 0.82), rgba(237, 244, 253, 0.92)), */
-    linear-gradient(rgba(245, 249, 255, 0.9), rgba(218, 233, 251, 0.82)),
-    url("../assets//images/bg666.png");
-  background-position:
-    center center,
-    center bottom;
-  background-repeat: no-repeat, no-repeat;
-  background-size:
-    cover,
-    100% auto;
-  background-attachment: fixed, fixed;
 }
 
 .portal-login-mask {
@@ -1649,9 +1637,6 @@ onUnmounted(() => {
       transparent 28%
     ),
     linear-gradient(180deg, #040814 0%, #060d1d 46%, #040814 100%);
-  background-image:
-    linear-gradient(rgba(5, 11, 26, 0.62), rgba(5, 11, 26, 0.82)),
-    url("../assets//images/bg666.png");
 }
 
 .hero-banner {