Split business locale loading

This commit is contained in:
2026-06-10 14:47:04 +08:00
parent bb6ff80998
commit f4bca66a78
2 changed files with 42 additions and 12 deletions
+39 -12
View File
@@ -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<Language>(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<SupportedLanguagesType>();
/**
* 加载应用特有的语言包
* 这里也可以改造为从服务端获取翻译数据
@@ -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 };
+3
View File
@@ -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,