59 lines
1.3 KiB
JavaScript
59 lines
1.3 KiB
JavaScript
import { defineStore } from 'pinia'
|
|
import { ref, computed } from 'vue'
|
|
|
|
export const useLangStore = defineStore('lang', () => {
|
|
// 状态
|
|
const langList = ref([
|
|
{
|
|
type: 'en',
|
|
value: 'English',
|
|
dir: 'ltr',
|
|
},
|
|
{
|
|
type: 'ar',
|
|
value: 'اللغة العربية',
|
|
dir: 'rtl',
|
|
},
|
|
])
|
|
|
|
const selectedLang = ref(langList.value[0])
|
|
|
|
// Getter
|
|
const currentLanguage = computed(() => selectedLang.value)
|
|
const availableLanguages = computed(() => langList.value)
|
|
|
|
// Action
|
|
const setLanguage = (lang) => {
|
|
selectedLang.value = lang
|
|
localStorage.setItem('preferred-language', lang.type)
|
|
}
|
|
|
|
// 初始化语言
|
|
const initLanguage = () => {
|
|
const savedLang = localStorage.getItem('preferred-language')
|
|
if (savedLang) {
|
|
const lang = langList.value.find((item) => item.type === savedLang)
|
|
if (lang) {
|
|
setLanguage(lang)
|
|
return
|
|
}
|
|
}
|
|
|
|
// 根据浏览器语言自动检测
|
|
const browserLang = navigator.language.split('-')[0]
|
|
const detectedLang = langList.value.find((item) => item.type === browserLang)
|
|
if (detectedLang) {
|
|
setLanguage(detectedLang)
|
|
}
|
|
}
|
|
|
|
return {
|
|
selectedLang,
|
|
langList,
|
|
currentLanguage,
|
|
availableLanguages,
|
|
setLanguage,
|
|
initLanguage,
|
|
}
|
|
})
|