|
@@ -3,9 +3,11 @@ import type { MenuProps } from 'antdv-next';
|
|
|
|
|
|
|
|
import { computed, h, onBeforeUnmount, onMounted, ref, watch } from 'vue';
|
|
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 {
|
|
import {
|
|
|
|
|
+ changeLanguageApi,
|
|
|
curUserInfo,
|
|
curUserInfo,
|
|
|
type curUserInfoPayload,
|
|
type curUserInfoPayload,
|
|
|
leftMenuListFromB,
|
|
leftMenuListFromB,
|
|
@@ -216,6 +218,21 @@ async function getCurUserInfo() {
|
|
|
|
|
|
|
|
let isRefreshingData = false;
|
|
let isRefreshingData = false;
|
|
|
let refreshQueued = 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() {
|
|
async function refreshHomeData() {
|
|
|
if (isRefreshingData) {
|
|
if (isRefreshingData) {
|
|
@@ -227,6 +244,31 @@ async function refreshHomeData() {
|
|
|
do {
|
|
do {
|
|
|
refreshQueued = false;
|
|
refreshQueued = false;
|
|
|
await getCurUserInfo();
|
|
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();
|
|
await loadLeftMenuFromB();
|
|
|
} while (refreshQueued);
|
|
} while (refreshQueued);
|
|
|
isRefreshingData = false;
|
|
isRefreshingData = false;
|
|
@@ -254,7 +296,7 @@ onBeforeUnmount(() => {
|
|
|
watch(
|
|
watch(
|
|
|
() => preferences.app.locale,
|
|
() => preferences.app.locale,
|
|
|
(locale, previousLocale) => {
|
|
(locale, previousLocale) => {
|
|
|
- if (locale === previousLocale) {
|
|
|
|
|
|
|
+ if (locale === previousLocale || isApplyingLocaleFromUserInfo) {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
void refreshHomeData();
|
|
void refreshHomeData();
|
|
@@ -286,9 +328,9 @@ function handleUserMenuClick({ key }: { key: string }) {
|
|
|
|
|
|
|
|
if (key === 'Logout') {
|
|
if (key === 'Logout') {
|
|
|
const enterpriseCode = resolveEnterpriseCodeFromLocation();
|
|
const enterpriseCode = resolveEnterpriseCodeFromLocation();
|
|
|
- if (enterpriseCode) {
|
|
|
|
|
- localStorage.removeItem(`token_${enterpriseCode}`);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // if (enterpriseCode) {
|
|
|
|
|
+ // localStorage.removeItem(`token_${enterpriseCode}`);
|
|
|
|
|
+ // }
|
|
|
|
|
|
|
|
const logoutUrl = `/Account/Logout?enterpriseCode=${enterpriseCode}`;
|
|
const logoutUrl = `/Account/Logout?enterpriseCode=${enterpriseCode}`;
|
|
|
try {
|
|
try {
|