index.ts 2.2 KB

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