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(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 };