vending-machine/mobile/stores/app.js
2026-04-08 20:45:41 +08:00

58 lines
1.5 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { defineStore } from 'pinia'
import { ref } from 'vue'
import i18n, { SUPPORTED_LOCALES, DEFAULT_LOCALE } from '../i18n/index.js'
import { getStorage, setStorage, LOCALE_KEY } from '../utils/storage.js'
export const useAppStore = defineStore('app', () => {
const locale = ref(DEFAULT_LOCALE)
/**
* 切换语言同步更新i18n并持久化到本地存储
* @param {string} newLocale - 目标语言标识
*/
function setLocale(newLocale) {
if (!SUPPORTED_LOCALES.includes(newLocale)) {
return
}
locale.value = newLocale
i18n.global.locale.value = newLocale
setStorage(LOCALE_KEY, newLocale)
}
/**
* 初始化语言:优先从本地存储读取,否则根据系统语言匹配
*/
function initLocale() {
const savedLocale = getStorage(LOCALE_KEY)
if (savedLocale && SUPPORTED_LOCALES.includes(savedLocale)) {
setLocale(savedLocale)
return
}
// 从系统语言推断
let systemLocale = DEFAULT_LOCALE
try {
const systemInfo = uni.getSystemInfoSync()
const lang = systemInfo.language || ''
if (lang.startsWith('zh')) {
// 区分简体和繁体
systemLocale = lang.includes('TW') || lang.includes('HK') || lang.includes('Hant')
? 'zh-TW'
: 'zh-CN'
} else if (lang.startsWith('en')) {
systemLocale = 'en'
}
} catch (e) {
// 获取系统信息失败,使用默认语言
}
setLocale(systemLocale)
}
return {
locale,
setLocale,
initLocale
}
})