i18n.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. missingWarn: import.meta.env.PROD,
  13. silentFallbackWarn: !import.meta.env.PROD,
  14. silentTranslationWarn: !import.meta.env.PROD, // true - warning off
  15. });
  16. const modules = import.meta.glob('./langs/*.y(a)?ml');
  17. const localesMap: Record<Locale, ImportLocaleFn> = {};
  18. for (const [path, loadLocale] of Object.entries(modules)) {
  19. const key = path.match(/([\w-]*)\.y(a)?ml/)?.[1];
  20. if (key) {
  21. localesMap[key] = loadLocale as ImportLocaleFn;
  22. }
  23. }
  24. /**
  25. * Set i18n language
  26. * @param locale
  27. */
  28. function setI18nLanguage(locale: Locale) {
  29. i18n.global.locale.value = locale;
  30. document?.querySelector('html')?.setAttribute('lang', locale);
  31. }
  32. /**
  33. * Load locale messages
  34. * @param lang
  35. */
  36. async function loadLocaleMessages(lang: SupportedLanguagesType) {
  37. if (unref(i18n.global.locale) === lang) {
  38. return setI18nLanguage(lang);
  39. }
  40. if (loadedLanguages.has(lang)) {
  41. return setI18nLanguage(lang);
  42. }
  43. const messages = await localesMap[lang]();
  44. i18n.global.setLocaleMessage(lang, messages.default);
  45. loadedLanguages.add(lang);
  46. return setI18nLanguage(lang);
  47. }
  48. export { i18n, loadLocaleMessages, setI18nLanguage };