index.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import type { LocaleSetupOptions, SupportedLanguagesType } from '@vben/locales';
  2. import type { App } from 'vue';
  3. import { ref } from 'vue';
  4. import { $t, setupI18n as coreSetup, loadLocalesMap } from '@vben/locales';
  5. import { preferences } from '@vben/preferences';
  6. import dayjs from 'dayjs';
  7. import { Language } from 'element-plus/es/locale';
  8. import defaultLocale from 'element-plus/es/locale/lang/zh-cn';
  9. const elementLocale = ref<Language>(defaultLocale);
  10. const modules = import.meta.glob('./langs/*.json');
  11. const localesMap = loadLocalesMap(modules);
  12. /**
  13. * 加载应用特有的语言包
  14. * 这里也可以改造为从服务端获取翻译数据
  15. * @param lang
  16. */
  17. async function loadMessages(lang: SupportedLanguagesType) {
  18. const [appLocaleMessages] = await Promise.all([
  19. localesMap[lang](),
  20. loadThirdPartyMessage(lang),
  21. ]);
  22. return appLocaleMessages.default;
  23. }
  24. /**
  25. * 加载第三方组件库的语言包
  26. * @param lang
  27. */
  28. async function loadThirdPartyMessage(lang: SupportedLanguagesType) {
  29. await Promise.all([loadElementLocale(lang), loadDayjsLocale(lang)]);
  30. }
  31. /**
  32. * 加载dayjs的语言包
  33. * @param lang
  34. */
  35. async function loadDayjsLocale(lang: SupportedLanguagesType) {
  36. let locale;
  37. switch (lang) {
  38. case 'zh-CN': {
  39. locale = await import('dayjs/locale/zh-cn');
  40. break;
  41. }
  42. case 'en-US': {
  43. locale = await import('dayjs/locale/en');
  44. break;
  45. }
  46. // 默认使用英语
  47. default: {
  48. locale = await import('dayjs/locale/en');
  49. }
  50. }
  51. dayjs.locale(locale);
  52. }
  53. /**
  54. * 加载element-plus的语言包
  55. * @param lang
  56. */
  57. async function loadElementLocale(lang: SupportedLanguagesType) {
  58. switch (lang) {
  59. case 'zh-CN': {
  60. elementLocale.value = defaultLocale;
  61. break;
  62. }
  63. case 'en-US': {
  64. elementLocale.value = (await import(
  65. 'element-plus/es/locale/lang/en'
  66. )) as unknown as Language;
  67. break;
  68. }
  69. }
  70. }
  71. async function setupI18n(app: App, options: LocaleSetupOptions = {}) {
  72. await coreSetup(app, {
  73. defaultLocale: preferences.app.locale,
  74. loadMessages,
  75. missingWarn: !import.meta.env.PROD,
  76. ...options,
  77. });
  78. }
  79. export { $t, elementLocale, loadMessages, setupI18n };