|  | @@ -1,64 +1,73 @@
 | 
											
												
													
														|  |  /**
 |  |  /**
 | 
											
												
													
														|  |   * Multi-language related operations
 |  |   * Multi-language related operations
 | 
											
												
													
														|  |   */
 |  |   */
 | 
											
												
													
														|  | -import type { LocaleType } from '/@/locales/types';
 |  | 
 | 
											
												
													
														|  | -import type { Ref } from 'vue';
 |  | 
 | 
											
												
													
														|  | 
 |  | +import type { LocaleType } from '/#/config';
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -import { unref, ref } from 'vue';
 |  | 
 | 
											
												
													
														|  | -import { useLocaleSetting } from '/@/hooks/setting/useLocaleSetting';
 |  | 
 | 
											
												
													
														|  | 
 |  | +import { ref } from 'vue';
 | 
											
												
													
														|  | 
 |  | +import moment from 'moment';
 | 
											
												
													
														|  | 
 |  | +import { computed } from 'vue';
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  import { i18n } from './setupI18n';
 |  |  import { i18n } from './setupI18n';
 | 
											
												
													
														|  | 
 |  | +import { localeStore } from '/@/store/modules/locale';
 | 
											
												
													
														|  | 
 |  | +import { unref } from 'vue';
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -import 'moment/dist/locale/zh-cn';
 |  | 
 | 
											
												
													
														|  | 
 |  | +interface LangModule {
 | 
											
												
													
														|  | 
 |  | +  message: Recordable;
 | 
											
												
													
														|  | 
 |  | +  momentLocale: Recordable;
 | 
											
												
													
														|  | 
 |  | +  momentLocaleName: string;
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +const antConfigLocale = ref<Nullable<Recordable>>(null);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +const loadLocalePool: LocaleType[] = [];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -const antConfigLocaleRef = ref<any>(null);
 |  | 
 | 
											
												
													
														|  | 
 |  | +function setI18nLanguage(locale: LocaleType) {
 | 
											
												
													
														|  | 
 |  | +  if (i18n.mode === 'legacy') {
 | 
											
												
													
														|  | 
 |  | +    i18n.global.locale = locale;
 | 
											
												
													
														|  | 
 |  | +  } else {
 | 
											
												
													
														|  | 
 |  | +    (i18n.global.locale as any).value = locale;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  localeStore.setLocaleInfo({ locale });
 | 
											
												
													
														|  | 
 |  | +  document.querySelector('html')?.setAttribute('lang', locale);
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  export function useLocale() {
 |  |  export function useLocale() {
 | 
											
												
													
														|  | -  const { getLang, getLocale, setLocale: setLocalSetting } = useLocaleSetting();
 |  | 
 | 
											
												
													
														|  | 
 |  | +  const getLocale = computed(() => localeStore.getLocale);
 | 
											
												
													
														|  | 
 |  | +  const getShowLocalePicker = computed(() => localeStore.getShowPicker);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  const getAntdLocale = computed(() => {
 | 
											
												
													
														|  | 
 |  | +    return i18n.global.getLocaleMessage(unref(getLocale))?.antdLocale;
 | 
											
												
													
														|  | 
 |  | +  });
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |    // Switching the language will change the locale of useI18n
 |  |    // Switching the language will change the locale of useI18n
 | 
											
												
													
														|  |    // And submit to configuration modification
 |  |    // And submit to configuration modification
 | 
											
												
													
														|  | -  function changeLocale(lang: LocaleType): void {
 |  | 
 | 
											
												
													
														|  | -    if (i18n.mode === 'legacy') {
 |  | 
 | 
											
												
													
														|  | -      i18n.global.locale = lang;
 |  | 
 | 
											
												
													
														|  | -    } else {
 |  | 
 | 
											
												
													
														|  | -      ((i18n.global.locale as unknown) as Ref<string>).value = lang;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    setLocalSetting({ lang });
 |  | 
 | 
											
												
													
														|  | -    // i18n.global.setLocaleMessage(locale, messages);
 |  | 
 | 
											
												
													
														|  | 
 |  | +  async function changeLocale(locale: LocaleType) {
 | 
											
												
													
														|  | 
 |  | +    const globalI18n = i18n.global;
 | 
											
												
													
														|  | 
 |  | +    const currentLocale = unref(globalI18n.locale);
 | 
											
												
													
														|  | 
 |  | +    if (currentLocale === locale) return locale;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    switch (lang) {
 |  | 
 | 
											
												
													
														|  | -      // Simplified Chinese
 |  | 
 | 
											
												
													
														|  | -      case 'zh_CN':
 |  | 
 | 
											
												
													
														|  | -        import('ant-design-vue/es/locale/zh_CN').then((locale) => {
 |  | 
 | 
											
												
													
														|  | -          antConfigLocaleRef.value = locale.default;
 |  | 
 | 
											
												
													
														|  | -        });
 |  | 
 | 
											
												
													
														|  | 
 |  | +    if (loadLocalePool.includes(locale)) {
 | 
											
												
													
														|  | 
 |  | +      setI18nLanguage(locale);
 | 
											
												
													
														|  | 
 |  | +      return locale;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    const langModule = ((await import(`./lang/${locale}.ts`)) as any).default as LangModule;
 | 
											
												
													
														|  | 
 |  | +    if (!langModule) return;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        break;
 |  | 
 | 
											
												
													
														|  | -      // English
 |  | 
 | 
											
												
													
														|  | -      case 'en':
 |  | 
 | 
											
												
													
														|  | -        import('ant-design-vue/es/locale/en_US').then((locale) => {
 |  | 
 | 
											
												
													
														|  | -          antConfigLocaleRef.value = locale.default;
 |  | 
 | 
											
												
													
														|  | -        });
 |  | 
 | 
											
												
													
														|  | -        break;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    const { message, momentLocale, momentLocaleName } = langModule;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      // other
 |  | 
 | 
											
												
													
														|  | -      default:
 |  | 
 | 
											
												
													
														|  | -        break;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    globalI18n.setLocaleMessage(locale, message);
 | 
											
												
													
														|  | 
 |  | +    moment.updateLocale(momentLocaleName, momentLocale);
 | 
											
												
													
														|  | 
 |  | +    loadLocalePool.push(locale);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  // initialization
 |  | 
 | 
											
												
													
														|  | -  function setLocale() {
 |  | 
 | 
											
												
													
														|  | -    const lang = unref(getLang);
 |  | 
 | 
											
												
													
														|  | -    lang && changeLocale(lang);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    setI18nLanguage(locale);
 | 
											
												
													
														|  | 
 |  | +    return locale;
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |    return {
 |  |    return {
 | 
											
												
													
														|  | -    setLocale,
 |  | 
 | 
											
												
													
														|  |      getLocale,
 |  |      getLocale,
 | 
											
												
													
														|  | -    getLang,
 |  | 
 | 
											
												
													
														|  | 
 |  | +    getShowLocalePicker,
 | 
											
												
													
														|  |      changeLocale,
 |  |      changeLocale,
 | 
											
												
													
														|  | -    antConfigLocale: antConfigLocaleRef,
 |  | 
 | 
											
												
													
														|  | 
 |  | +    antConfigLocale,
 | 
											
												
													
														|  | 
 |  | +    getAntdLocale,
 | 
											
												
													
														|  |    };
 |  |    };
 | 
											
												
													
														|  |  }
 |  |  }
 |