index.ts 2.3 KB

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