app.ts 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import { defineStore } from 'pinia'
  2. import { ref, computed } from 'vue'
  3. import { useStorage } from '@vueuse/core'
  4. // 导入 Element Plus 中英文语言包
  5. import zhCn from 'element-plus/es/locale/lang/zh-cn'
  6. import en from 'element-plus/es/locale/lang/en'
  7. import i18n from '@/locales'
  8. // 默认语言从环境变量获取
  9. const DEFAULT_LANG = import.meta.env.VITE_APP_LANG || 'zh-cn'
  10. export const useAppStore = defineStore('app', () => {
  11. // 侧边栏状态
  12. const sidebarOpened = ref(true)
  13. const loading = ref(false)
  14. // 语言和组件尺寸
  15. const language = useStorage('language', DEFAULT_LANG)
  16. const size = ref<'default' | 'small' | 'large'>('default')
  17. /**
  18. * 根据语言标识读取对应的 Element Plus 语言包
  19. */
  20. const locale = computed(() => {
  21. if (language?.value === 'zh-cn') {
  22. return zhCn
  23. }
  24. return en
  25. })
  26. function toggleSidebar() {
  27. sidebarOpened.value = !sidebarOpened.value
  28. }
  29. function setLoading(value: boolean) {
  30. loading.value = value
  31. }
  32. /**
  33. * 切换语言
  34. */
  35. function changeLanguage(val: string) {
  36. language.value = val
  37. // 同步更新 vue-i18n 的语言
  38. i18n.global.locale.value = val as 'zh-cn' | 'en'
  39. }
  40. /**
  41. * 设置组件尺寸
  42. */
  43. function setSize(val: 'default' | 'small' | 'large') {
  44. size.value = val
  45. }
  46. return {
  47. sidebarOpened,
  48. loading,
  49. language,
  50. locale,
  51. size,
  52. toggleSidebar,
  53. setLoading,
  54. changeLanguage,
  55. setSize
  56. }
  57. })