You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.8 KiB
72 lines
1.8 KiB
// 多组件库的国际化和本地项目国际化兼容
|
|
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<string> | 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);
|
|
}
|