53 lines
1.4 KiB
TypeScript
53 lines
1.4 KiB
TypeScript
import { createI18n } from 'vue-i18n';
|
|
import type { languageIndexItemValueType, languageIndexType, languageType } from './type';
|
|
import { ref } from 'vue';
|
|
|
|
export * from './type';
|
|
|
|
const languagedatas = import.meta.glob('@/language/*.json');
|
|
|
|
const loadIndexFile = async (): Promise<languageIndexType> => {
|
|
try {
|
|
const module = (await languagedatas['/language/index.json']()) as {
|
|
default: languageIndexType;
|
|
};
|
|
return module.default;
|
|
} catch (error) {
|
|
console.error('加载语言索引文件失败:', error);
|
|
throw error;
|
|
}
|
|
};
|
|
|
|
const loadLanguageFile = async (fileName: string): Promise<languageType> => {
|
|
try {
|
|
const module = (await languagedatas[`/language/${fileName}`]()) as { default: languageType };
|
|
return module.default;
|
|
} catch (error) {
|
|
console.error(`加载语言文件失败:${fileName}`, error);
|
|
return {};
|
|
}
|
|
};
|
|
|
|
export const messages: languageType | any = {};
|
|
|
|
export const messageData = ref<languageIndexItemValueType[]>([]);
|
|
|
|
export const i18n = createI18n({
|
|
legacy: false,
|
|
locale: 'zh-cn',
|
|
fallbackLocale: 'zh-cn',
|
|
messages,
|
|
});
|
|
|
|
export async function installI18n() {
|
|
const data: languageIndexType = await loadIndexFile();
|
|
for (const i of data.languages) {
|
|
messageData.value.push({
|
|
title: i.title,
|
|
value: i.id,
|
|
icon: i.icon,
|
|
});
|
|
messages[i.id] = await loadLanguageFile(i.file);
|
|
}
|
|
}
|