Browse Source

fix: 语言一致性,退出登录

weibo.xia 2 weeks ago
parent
commit
2fccf64262
1 changed files with 47 additions and 5 deletions
  1. 47 5
      apps/webB-velofex/src/views/home.vue

+ 47 - 5
apps/webB-velofex/src/views/home.vue

@@ -3,9 +3,11 @@ import type { MenuProps } from 'antdv-next';
 
 import { computed, h, onBeforeUnmount, onMounted, ref, watch } from 'vue';
 
-import { preferences } from '@vben/preferences';
+import { loadLocaleMessages, type SupportedLanguagesType } from '@vben/locales';
+import { preferences, updatePreferences } from '@vben/preferences';
 
 import {
+  changeLanguageApi,
   curUserInfo,
   type curUserInfoPayload,
   leftMenuListFromB,
@@ -216,6 +218,21 @@ async function getCurUserInfo() {
 
 let isRefreshingData = false;
 let refreshQueued = false;
+let isApplyingLocaleFromUserInfo = false;
+let hasInitializedLanguageFromUserInfo = false;
+
+function resolveLocaleByUserLanguage(
+  language?: string,
+): null | SupportedLanguagesType {
+  const value = String(language ?? '').trim();
+  if (value === 'en' || value === 'en-US') {
+    return 'en-US';
+  }
+  if (value === 'zh-CN' || value === 'zh') {
+    return 'zh-CN';
+  }
+  return null;
+}
 
 async function refreshHomeData() {
   if (isRefreshingData) {
@@ -227,6 +244,31 @@ async function refreshHomeData() {
   do {
     refreshQueued = false;
     await getCurUserInfo();
+
+    if (!hasInitializedLanguageFromUserInfo) {
+      const localeFromUserInfo = resolveLocaleByUserLanguage(
+        userInfo.value?.language,
+      );
+      if (localeFromUserInfo) {
+        const langId = localeFromUserInfo === 'en-US' ? 1 : 0;
+        if (localeFromUserInfo !== preferences.app.locale) {
+          isApplyingLocaleFromUserInfo = true;
+          try {
+            updatePreferences({
+              app: {
+                locale: localeFromUserInfo,
+              },
+            });
+            await loadLocaleMessages(localeFromUserInfo);
+          } finally {
+            isApplyingLocaleFromUserInfo = false;
+          }
+        }
+        await changeLanguageApi({ langId });
+      }
+      hasInitializedLanguageFromUserInfo = true;
+    }
+
     await loadLeftMenuFromB();
   } while (refreshQueued);
   isRefreshingData = false;
@@ -254,7 +296,7 @@ onBeforeUnmount(() => {
 watch(
   () => preferences.app.locale,
   (locale, previousLocale) => {
-    if (locale === previousLocale) {
+    if (locale === previousLocale || isApplyingLocaleFromUserInfo) {
       return;
     }
     void refreshHomeData();
@@ -286,9 +328,9 @@ function handleUserMenuClick({ key }: { key: string }) {
 
   if (key === 'Logout') {
     const enterpriseCode = resolveEnterpriseCodeFromLocation();
-    if (enterpriseCode) {
-      localStorage.removeItem(`token_${enterpriseCode}`);
-    }
+    // if (enterpriseCode) {
+    //   localStorage.removeItem(`token_${enterpriseCode}`);
+    // }
 
     const logoutUrl = `/Account/Logout?enterpriseCode=${enterpriseCode}`;
     try {