// 多组件库的国际化和本地项目国际化兼容 import { App, WritableComputedRef } from "vue"; import { storageLocal } from "/@/utils/storage"; import { type I18n, createI18n } from "vue-i18n"; // element-plus国际化 import enLocale from "element-plus/lib/locale/lang/en"; import zhLocale from "element-plus/lib/locale/lang/zh-cn"; function siphonI18n(prefix = "zh-CN") { return Object.fromEntries( Object.entries(import.meta.globEager("../../locales/*.y(a)?ml")).map( ([key, value]) => { const matched = key.match(/([A-Za-z0-9-_]+)\./i)[1]; return [matched, value.default]; } ) )[prefix]; } export const localesConfigs = { zh: { ...siphonI18n("zh-CN"), ...zhLocale }, en: { ...siphonI18n("en"), ...enLocale } }; /** * 国际化转换工具函数 * @param message message * @param isI18n 如果true,获取对应的消息,否则返回本身 * @returns message */ export function transformI18n( message: string | unknown | object = "", isI18n: boolean | unknown = false ) { if (!message) { return ""; } // 处理存储动态路由的title,格式 {zh:"",en:""} if (typeof message === "object") { const locale: string | WritableComputedRef | any = i18n.global.locale; return message[locale?.value]; } if (isI18n) { return i18n.global.t.call(i18n.global.locale, message); } else { return message; } } // 此函数只是配合i18n Ally插件来进行国际化智能提示,并无实际意义(只对提示起作用),如果不需要国际化可删除 export const $t = (key: string) => key; export const i18n: I18n = createI18n({ legacy: false, locale: storageLocal.getItem("responsive-locale")?.locale ?? "zh", fallbackLocale: "en", messages: localesConfigs }); export function useI18n(app: App) { app.use(i18n); }