141 lines
3.2 KiB
TypeScript
141 lines
3.2 KiB
TypeScript
import type { Language } from 'element-plus/es/locale';
|
|
|
|
import type { App } from 'vue';
|
|
|
|
import type { LocaleSetupOptions, SupportedLanguagesType } from '@vben/locales';
|
|
|
|
import { ref } from 'vue';
|
|
|
|
import {
|
|
$t,
|
|
setupI18n as coreSetup,
|
|
getSystemLanguage,
|
|
loadLocalesMapFromDir,
|
|
} from '@vben/locales';
|
|
import { preferences } from '@vben/preferences';
|
|
|
|
import dayjs from 'dayjs';
|
|
import defaultLocale from 'element-plus/es/locale/lang/zh-cn';
|
|
|
|
const elementLocale = ref<Language>(defaultLocale);
|
|
|
|
const modules = import.meta.glob([
|
|
'./langs/*/about.json',
|
|
'./langs/*/account-settings.json',
|
|
'./langs/*/api-token.json',
|
|
'./langs/*/ai-platform.json',
|
|
'./langs/*/announcement.json',
|
|
'./langs/*/authentication.json',
|
|
'./langs/*/common.json',
|
|
'./langs/*/menu.json',
|
|
'./langs/*/menu-title.json',
|
|
'./langs/*/message.json',
|
|
'./langs/*/page.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',
|
|
]);
|
|
|
|
const localesMap = loadLocalesMapFromDir(
|
|
/\.\/langs\/([^/]+)\/(.*)\.json$/,
|
|
modules,
|
|
);
|
|
|
|
/**
|
|
* 加载应用特有的语言包
|
|
* 这里也可以改造为从服务端获取翻译数据
|
|
* @param lang
|
|
*/
|
|
async function loadMessages(lang: SupportedLanguagesType) {
|
|
const [appLocaleMessages] = await Promise.all([
|
|
localesMap[lang]?.(),
|
|
loadThirdPartyMessage(lang),
|
|
]);
|
|
return appLocaleMessages?.default || {};
|
|
}
|
|
|
|
/**
|
|
* 加载第三方组件库的语言包
|
|
* @param lang
|
|
*/
|
|
async function loadThirdPartyMessage(lang: SupportedLanguagesType) {
|
|
await Promise.all([loadElementLocale(lang), loadDayjsLocale(lang)]);
|
|
}
|
|
|
|
/**
|
|
* 加载dayjs的语言包
|
|
* @param lang
|
|
*/
|
|
async function loadDayjsLocale(lang: SupportedLanguagesType) {
|
|
let locale;
|
|
switch (lang) {
|
|
case 'en-US': {
|
|
locale = await import('dayjs/locale/en');
|
|
break;
|
|
}
|
|
case 'zh-CN': {
|
|
locale = await import('dayjs/locale/zh-cn');
|
|
break;
|
|
}
|
|
case 'zh-TW': {
|
|
locale = await import('dayjs/locale/zh-tw');
|
|
break;
|
|
}
|
|
// 默认使用英语
|
|
default: {
|
|
locale = await import('dayjs/locale/en');
|
|
}
|
|
}
|
|
if (locale) {
|
|
dayjs.locale(locale);
|
|
} else {
|
|
console.error(`Failed to load dayjs locale for ${lang}`);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 加载element-plus的语言包
|
|
* @param lang
|
|
*/
|
|
async function loadElementLocale(lang: SupportedLanguagesType) {
|
|
switch (lang) {
|
|
case 'en-US': {
|
|
elementLocale.value = (
|
|
await import('element-plus/es/locale/lang/en')
|
|
).default;
|
|
break;
|
|
}
|
|
case 'zh-CN': {
|
|
elementLocale.value = defaultLocale;
|
|
break;
|
|
}
|
|
case 'zh-TW': {
|
|
elementLocale.value = (
|
|
await import('element-plus/es/locale/lang/zh-tw')
|
|
).default;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
async function setupI18n(app: App, options: LocaleSetupOptions = {}) {
|
|
// 如果是跟随系统,获取系统语言
|
|
const locale = preferences.app.locale;
|
|
const actualLocale = locale === 'auto' ? getSystemLanguage() : locale;
|
|
|
|
await coreSetup(app, {
|
|
defaultLocale: actualLocale,
|
|
loadMessages,
|
|
missingWarn: !import.meta.env.PROD,
|
|
...options,
|
|
});
|
|
}
|
|
|
|
export { $t, elementLocale, setupI18n };
|