| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- import { defineStore } from 'pinia'
- import { ref, computed } from 'vue'
- import { useStorage } from '@vueuse/core'
- // 导入 Element Plus 中英文语言包
- import zhCn from 'element-plus/es/locale/lang/zh-cn'
- import en from 'element-plus/es/locale/lang/en'
- import i18n from '@/locales'
- // 默认语言从环境变量获取
- const DEFAULT_LANG = import.meta.env.VITE_APP_LANG || 'zh-cn'
- export const useAppStore = defineStore('app', () => {
- // 侧边栏状态
- const sidebarOpened = ref(true)
- const loading = ref(false)
- // 语言和组件尺寸
- const language = useStorage('language', DEFAULT_LANG)
- const size = ref<'default' | 'small' | 'large'>('default')
- /**
- * 根据语言标识读取对应的 Element Plus 语言包
- */
- const locale = computed(() => {
- if (language?.value === 'zh-cn') {
- return zhCn
- }
- return en
- })
- function toggleSidebar() {
- sidebarOpened.value = !sidebarOpened.value
- }
- function setLoading(value: boolean) {
- loading.value = value
- }
- /**
- * 切换语言
- */
- function changeLanguage(val: string) {
- language.value = val
- // 同步更新 vue-i18n 的语言
- i18n.global.locale.value = val as 'zh-cn' | 'en'
- }
- /**
- * 设置组件尺寸
- */
- function setSize(val: 'default' | 'small' | 'large') {
- size.value = val
- }
- return {
- sidebarOpened,
- loading,
- language,
- locale,
- size,
- toggleSidebar,
- setLoading,
- changeLanguage,
- setSize
- }
- })
|