From f4bca66a78c52d62f49b14c5b3b7a1c39e4f7923 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?cls=5F=E5=AE=81=E6=B3=A2=E6=9C=AC=E6=9C=BA?= <908705107@qq.com> Date: Wed, 10 Jun 2026 14:47:04 +0800 Subject: [PATCH] Split business locale loading --- web/apps/web-ele/src/locales/index.ts | 51 ++++++++++++++++++++------- web/apps/web-ele/src/router/guard.ts | 3 ++ 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/web/apps/web-ele/src/locales/index.ts b/web/apps/web-ele/src/locales/index.ts index 3591620..97c448d 100644 --- a/web/apps/web-ele/src/locales/index.ts +++ b/web/apps/web-ele/src/locales/index.ts @@ -10,6 +10,7 @@ import { $t, setupI18n as coreSetup, getSystemLanguage, + i18n, loadLocalesMapFromDir, } from '@vben/locales'; import { preferences } from '@vben/preferences'; @@ -19,16 +20,22 @@ import defaultLocale from 'element-plus/es/locale/lang/zh-cn'; const elementLocale = ref(defaultLocale); -const modules = import.meta.glob([ +const baseModules = import.meta.glob([ './langs/*/about.json', + './langs/*/authentication.json', + './langs/*/common.json', + './langs/*/menu-title.json', + './langs/*/page.json', + './langs/*/ui.json', +]); + +const businessModules = import.meta.glob([ './langs/*/account-settings.json', './langs/*/api-token.json', './langs/*/ai-platform.json', './langs/*/announcement.json', './langs/*/application.json', - './langs/*/authentication.json', './langs/*/chat.json', - './langs/*/common.json', './langs/*/dept.json', './langs/*/dashboard-design.json', './langs/*/dingtalk-sync.json', @@ -37,28 +44,32 @@ const modules = import.meta.glob([ './langs/*/file-manager.json', './langs/*/loginLog.json', './langs/*/menu.json', - './langs/*/menu-title.json', './langs/*/message.json', './langs/*/org-chart.json', - './langs/*/page.json', './langs/*/page-manager.json', './langs/*/permission.json', './langs/*/post.json', './langs/*/role.json', './langs/*/system-config.json', './langs/*/system.json', - './langs/*/ui.json', './langs/*/ui-config.json', './langs/*/user-avatar.json', './langs/*/user.json', './langs/*/wecom-sync.json', ]); -const localesMap = loadLocalesMapFromDir( +const baseLocalesMap = loadLocalesMapFromDir( /\.\/langs\/([^/]+)\/(.*)\.json$/, - modules, + baseModules, ); +const businessLocalesMap = loadLocalesMapFromDir( + /\.\/langs\/([^/]+)\/(.*)\.json$/, + businessModules, +); + +const loadedBusinessLocales = new Set(); + /** * 加载应用特有的语言包 * 这里也可以改造为从服务端获取翻译数据 @@ -66,12 +77,29 @@ const localesMap = loadLocalesMapFromDir( */ async function loadMessages(lang: SupportedLanguagesType) { const [appLocaleMessages] = await Promise.all([ - localesMap[lang]?.(), + baseLocalesMap[lang]?.(), loadThirdPartyMessage(lang), ]); return appLocaleMessages?.default || {}; } +function getActualLocale(): SupportedLanguagesType { + const locale = preferences.app.locale; + return locale === 'auto' ? getSystemLanguage() : locale; +} + +async function loadBusinessMessages(lang = getActualLocale()) { + if (loadedBusinessLocales.has(lang)) { + return; + } + + const businessLocaleMessages = await businessLocalesMap[lang]?.(); + if (businessLocaleMessages?.default) { + i18n.global.mergeLocaleMessage(lang, businessLocaleMessages.default); + } + loadedBusinessLocales.add(lang); +} + /** * 加载第三方组件库的语言包 * @param lang @@ -138,8 +166,7 @@ async function loadElementLocale(lang: SupportedLanguagesType) { async function setupI18n(app: App, options: LocaleSetupOptions = {}) { // 如果是跟随系统,获取系统语言 - const locale = preferences.app.locale; - const actualLocale = locale === 'auto' ? getSystemLanguage() : locale; + const actualLocale = getActualLocale(); await coreSetup(app, { defaultLocale: actualLocale, @@ -149,4 +176,4 @@ async function setupI18n(app: App, options: LocaleSetupOptions = {}) { }); } -export { $t, elementLocale, setupI18n }; +export { $t, elementLocale, loadBusinessMessages, setupI18n }; diff --git a/web/apps/web-ele/src/router/guard.ts b/web/apps/web-ele/src/router/guard.ts index a23867e..34f2f17 100644 --- a/web/apps/web-ele/src/router/guard.ts +++ b/web/apps/web-ele/src/router/guard.ts @@ -5,6 +5,7 @@ import { preferences } from '@vben/preferences'; import { useAccessStore, useTabbarStore, useUserStore } from '@vben/stores'; import { startProgress, stopProgress } from '@vben/utils'; +import { loadBusinessMessages } from '#/locales'; import { accessRoutes, coreRouteNames } from '#/router/routes'; import { useAuthStore } from '#/store'; import { useAppContextStore } from '#/store/app-context'; @@ -169,6 +170,8 @@ function setupAccessGuard(router: Router) { const userInfo = userStore.userInfo || (await authStore.fetchUserInfo()); const userRoles = userInfo.roles ?? []; + await loadBusinessMessages(); + // 生成菜单和路由 const { accessibleMenus, accessibleRoutes } = await generateAccess({ roles: userRoles,