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.
61 lines
1.7 KiB
61 lines
1.7 KiB
/** |
|
* @program: kicc-ui |
|
* @description: 国际化相关操作 |
|
* @author: entfrm开发团队-王翔 |
|
* @create: 2022/4/8 |
|
*/ |
|
|
|
import type { LocaleType } from '/#/config'; |
|
import { i18n } from './setupI18n'; |
|
import { useLocaleStoreWithOut } from '/@/store/modules/locale'; |
|
import { unref, computed } from 'vue'; |
|
import { loadLocalePool, setHtmlPageLang } from './helper'; |
|
|
|
interface LangModule { |
|
message: Recordable; |
|
} |
|
|
|
function setI18nLanguage(locale: LocaleType) { |
|
const localeStore = useLocaleStoreWithOut(); |
|
if (i18n.mode === 'legacy') { |
|
i18n.global.locale = locale; |
|
} else (i18n.global.locale as any).value = locale; |
|
localeStore.setLocaleInfo({ locale }); |
|
setHtmlPageLang(locale); |
|
} |
|
|
|
export function useLocale() { |
|
const localeStore = useLocaleStoreWithOut(); |
|
const getLocale = computed(() => localeStore.getLocale); |
|
const getShowLocalePicker = computed(() => localeStore.getShowPicker); |
|
const getAntdLocale = computed((): any => { |
|
return i18n.global.getLocaleMessage<Recordable>(unref(getLocale))?.antdLocale ?? {}; |
|
}); |
|
|
|
// 切换语言会改变useI18n的语言环境 |
|
async function changeLocale(locale: LocaleType) { |
|
const globalI18n = i18n.global; |
|
const currentLocale = unref(globalI18n.locale); |
|
if (currentLocale === locale) return locale; |
|
if (loadLocalePool.includes(locale)) { |
|
setI18nLanguage(locale); |
|
return locale; |
|
} |
|
const langModule = ((await import(`./lang/${locale}.ts`)) as any).default as LangModule; |
|
if (!langModule) return; |
|
|
|
const { message } = langModule; |
|
globalI18n.setLocaleMessage(locale, message); |
|
loadLocalePool.push(locale); |
|
|
|
setI18nLanguage(locale); |
|
return locale; |
|
} |
|
|
|
return { |
|
getLocale, |
|
getShowLocalePicker, |
|
changeLocale, |
|
getAntdLocale, |
|
}; |
|
}
|
|
|