Split business locale loading
This commit is contained in:
@@ -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 };
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user