perf: 优化中英文翻译与切换

This commit is contained in:
xiaojunnuo
2025-06-28 23:57:01 +08:00
parent 082f47663d
commit acaa8b1731
43 changed files with 4121 additions and 4175 deletions
+75 -73
View File
@@ -1,24 +1,24 @@
import type { App } from "vue";
import type { Locale } from "vue-i18n";
import { setAntdvLocale } from "./antdv";
import type { ImportLocaleFn, LoadMessageFn, LocaleSetupOptions, SupportedLanguagesType } from "./typing";
import { unref } from "vue";
import { createI18n } from "vue-i18n";
import en_US from './langs/en-US/index';
import zh_CH from './langs/zh-CN/index';
import en_US from "./langs/en-US/index";
import zh_CN from "./langs/zh-CN/index";
import { useSimpleLocale } from "/@/vben/composables";
const i18n = createI18n({
globalInjection: true,
legacy: false,
fallbackLocale: 'en_US',
locale: 'en_US',
messages: {
zh_CH: zh_CH,
en_US: en_US
}
globalInjection: true,
legacy: false,
fallbackLocale: "en-US",
locale: "en-US",
messages: {
"zh-CN": zh_CN,
"en-US": en_US,
},
});
const modules = import.meta.glob("./langs/**/*.json");
@@ -33,15 +33,15 @@ let loadMessages: LoadMessageFn;
* @param modules
*/
function loadLocalesMap(modules: Record<string, () => Promise<unknown>>) {
const localesMap: Record<Locale, ImportLocaleFn> = {};
const localesMap: Record<Locale, ImportLocaleFn> = {};
for (const [path, loadLocale] of Object.entries(modules)) {
const key = path.match(/([\w-]*)\.(json)/)?.[1];
if (key) {
localesMap[key] = loadLocale as ImportLocaleFn;
}
}
return localesMap;
for (const [path, loadLocale] of Object.entries(modules)) {
const key = path.match(/([\w-]*)\.(json)/)?.[1];
if (key) {
localesMap[key] = loadLocale as ImportLocaleFn;
}
}
return localesMap;
}
/**
@@ -51,37 +51,37 @@ function loadLocalesMap(modules: Record<string, () => Promise<unknown>>) {
* @returns A map of locales to their corresponding import functions
*/
function loadLocalesMapFromDir(regexp: RegExp, modules: Record<string, () => Promise<unknown>>): Record<Locale, ImportLocaleFn> {
const localesRaw: Record<Locale, Record<string, () => Promise<unknown>>> = {};
const localesMap: Record<Locale, ImportLocaleFn> = {};
const localesRaw: Record<Locale, Record<string, () => Promise<unknown>>> = {};
const localesMap: Record<Locale, ImportLocaleFn> = {};
// Iterate over the modules to extract language and file names
for (const path in modules) {
const match = path.match(regexp);
if (match) {
const [_, locale, fileName] = match;
if (locale && fileName) {
if (!localesRaw[locale]) {
localesRaw[locale] = {};
}
if (modules[path]) {
localesRaw[locale][fileName] = modules[path];
}
}
}
}
// Iterate over the modules to extract language and file names
for (const path in modules) {
const match = path.match(regexp);
if (match) {
const [_, locale, fileName] = match;
if (locale && fileName) {
if (!localesRaw[locale]) {
localesRaw[locale] = {};
}
if (modules[path]) {
localesRaw[locale][fileName] = modules[path];
}
}
}
}
// Convert raw locale data into async import functions
for (const [locale, files] of Object.entries(localesRaw)) {
localesMap[locale] = async () => {
const messages: Record<string, any> = {};
for (const [fileName, importFn] of Object.entries(files)) {
messages[fileName] = ((await importFn()) as any)?.default;
}
return { default: messages };
};
}
// Convert raw locale data into async import functions
for (const [locale, files] of Object.entries(localesRaw)) {
localesMap[locale] = async () => {
const messages: Record<string, any> = {};
for (const [fileName, importFn] of Object.entries(files)) {
messages[fileName] = ((await importFn()) as any)?.default;
}
return { default: messages };
};
}
return localesMap;
return localesMap;
}
/**
@@ -89,24 +89,26 @@ function loadLocalesMapFromDir(regexp: RegExp, modules: Record<string, () => Pro
* @param locale
*/
function setI18nLanguage(locale: Locale) {
i18n.global.locale.value = locale;
// setAntdvLocale(locale);
//@ts-ignore
i18n.global.locale.value = locale;
document?.querySelector("html")?.setAttribute("lang", locale);
document?.querySelector("html")?.setAttribute("lang", locale);
}
async function setupI18n(app: App, options: LocaleSetupOptions = {}) {
const { defaultLocale = "en-US" } = options;
// app可以自行扩展一些第三方库和组件库的国际化
loadMessages = options.loadMessages || (async () => ({}));
app.use(i18n);
await loadLocaleMessages(defaultLocale);
const { defaultLocale = "en-US" } = options;
// app可以自行扩展一些第三方库和组件库的国际化
loadMessages = options.loadMessages || (async () => ({}));
app.use(i18n);
await loadLocaleMessages(defaultLocale);
// 在控制台打印警告
i18n.global.setMissingHandler((locale, key) => {
if (options.missingWarn && key.includes(".")) {
console.warn(`[intlify] Not found '${key}' key in '${locale}' locale messages.`);
}
});
// 在控制台打印警告
i18n.global.setMissingHandler((locale, key) => {
if (options.missingWarn && key.includes(".")) {
console.warn(`[intlify] Not found '${key}' key in '${locale}' locale messages.`);
}
});
}
/**
@@ -114,22 +116,22 @@ async function setupI18n(app: App, options: LocaleSetupOptions = {}) {
* @param lang
*/
async function loadLocaleMessages(lang: SupportedLanguagesType) {
if (unref(i18n.global.locale) === lang) {
return setI18nLanguage(lang);
}
setSimpleLocale(lang);
if (unref(i18n.global.locale) === lang) {
return setI18nLanguage(lang);
}
setSimpleLocale(lang);
const message = await localesMap[lang]?.();
const message = await localesMap[lang]?.();
if (message?.default) {
i18n.global.setLocaleMessage(lang, message.default);
}
if (message?.default) {
//@ts-ignore
i18n.global.setLocaleMessage(lang, message.default);
}
const mergeMessage = await loadMessages(lang);
i18n.global.mergeLocaleMessage(lang, mergeMessage);
const mergeMessage = await loadMessages(lang);
i18n.global.mergeLocaleMessage(lang, mergeMessage);
return setI18nLanguage(lang);
return setI18nLanguage(lang);
}
export { i18n, loadLocaleMessages, loadLocalesMap, loadLocalesMapFromDir, setupI18n };
export { i18n, loadLocaleMessages, loadLocalesMap, loadLocalesMapFromDir, setupI18n, setI18nLanguage };
export default i18n;