i18n.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import type { SupportedLanguagesType } from '@vben-core/typings';
  2. import type { Locale } from 'vue-i18n';
  3. import type { ImportLocaleFn } from './typing';
  4. import { unref } from 'vue';
  5. import { createI18n } from 'vue-i18n';
  6. const loadedLanguages = new Set<string>();
  7. const i18n = createI18n({
  8. globalInjection: true,
  9. legacy: false,
  10. locale: '',
  11. messages: {},
  12. });
  13. const modules = {
  14. './langs/en-US.json': async () => import('./langs/en-US.json'),
  15. './langs/zh-CN.json': async () => import('./langs/zh-CN.json'),
  16. };
  17. const localesMap = loadLocalesMap(modules);
  18. /**
  19. * Load locale modules
  20. * @param modules
  21. */
  22. function loadLocalesMap(modules: Record<string, () => Promise<unknown>>) {
  23. const localesMap: Record<Locale, ImportLocaleFn> = {};
  24. for (const [path, loadLocale] of Object.entries(modules)) {
  25. const key = path.match(/([\w-]*)\.(yaml|yml|json)/)?.[1];
  26. if (key) {
  27. localesMap[key] = loadLocale as ImportLocaleFn;
  28. }
  29. }
  30. return localesMap;
  31. }
  32. /**
  33. * Set i18n language
  34. * @param locale
  35. */
  36. function setI18nLanguage(locale: Locale) {
  37. i18n.global.locale.value = locale;
  38. document?.querySelector('html')?.setAttribute('lang', locale);
  39. }
  40. /**
  41. * Load locale messages
  42. * @param lang
  43. */
  44. async function loadI18nMessages(lang: SupportedLanguagesType) {
  45. if (unref(i18n.global.locale) === lang) {
  46. return setI18nLanguage(lang);
  47. }
  48. if (loadedLanguages.has(lang)) {
  49. return setI18nLanguage(lang);
  50. }
  51. const message = await localesMap[lang]();
  52. i18n.global.setLocaleMessage(lang, message.default);
  53. loadedLanguages.add(lang);
  54. return setI18nLanguage(lang);
  55. }
  56. export { i18n, loadI18nMessages, loadLocalesMap, setI18nLanguage };