i18n.ts 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. // TODO:import.meta.env,会导致该包依赖外部项目必须是vite才可以
  8. const i18n = createI18n({
  9. globalInjection: true,
  10. legacy: false,
  11. locale: '',
  12. messages: {},
  13. });
  14. const modules = {
  15. './langs/en-US.json': async () => import('./langs/en-US.json'),
  16. './langs/zh-CN.json': async () => import('./langs/zh-CN.json'),
  17. };
  18. const localesMap = loadLocalesMap(modules);
  19. /**
  20. * Load locale modules
  21. * @param modules
  22. */
  23. function loadLocalesMap(modules: Record<string, () => Promise<unknown>>) {
  24. const localesMap: Record<Locale, ImportLocaleFn> = {};
  25. for (const [path, loadLocale] of Object.entries(modules)) {
  26. const key = path.match(/([\w-]*)\.(yaml|yml|json)/)?.[1];
  27. if (key) {
  28. localesMap[key] = loadLocale as ImportLocaleFn;
  29. }
  30. }
  31. return localesMap;
  32. }
  33. /**
  34. * Set i18n language
  35. * @param locale
  36. */
  37. function setI18nLanguage(locale: Locale) {
  38. i18n.global.locale.value = locale;
  39. document?.querySelector('html')?.setAttribute('lang', locale);
  40. }
  41. /**
  42. * Load locale messages
  43. * @param lang
  44. */
  45. async function loadI18nMessages(lang: SupportedLanguagesType) {
  46. if (unref(i18n.global.locale) === lang) {
  47. return setI18nLanguage(lang);
  48. }
  49. if (loadedLanguages.has(lang)) {
  50. return setI18nLanguage(lang);
  51. }
  52. const message = await localesMap[lang]();
  53. i18n.global.setLocaleMessage(lang, message.default);
  54. loadedLanguages.add(lang);
  55. return setI18nLanguage(lang);
  56. }
  57. export { i18n, loadI18nMessages, loadLocalesMap, setI18nLanguage };