langStore.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import { defineStore } from 'pinia'
  2. import zhCn from 'element-plus/es/locale/lang/zh-cn'
  3. import en from 'element-plus/es/locale/lang/en'
  4. import zhMessages from '@/locales/zh-CN.js' // 中文语言包
  5. import enMessages from '@/locales/en.js'
  6. // 定义localStorage的key
  7. const LANG_KEY = 'APP_CURRENT_LANG'
  8. const elLocaleMap = {
  9. 'zh-CN': zhCn,
  10. en: en
  11. }
  12. // 默认语言(优先从localStorage读取,没有则用浏览器默认)
  13. const defaultLang = localStorage.getItem(LANG_KEY) || (navigator.language || 'zh-CN').toLowerCase()
  14. export const useLangStore = defineStore('lang', {
  15. state: () => ({
  16. // 当前语言
  17. currentLang: defaultLang === 'en' ? 'en' : 'zh-CN', // 兼容处理,只保留en/zh-CN
  18. elLocale: elLocaleMap[defaultLang === 'en' ? 'en' : 'zh-CN']
  19. }),
  20. actions: {
  21. // 切换语言
  22. changeLang(lang) {
  23. this.currentLang = lang
  24. this.elLocale = elLocaleMap[lang === 'en' ? 'en' : 'zh-CN']
  25. // 持久化到localStorage
  26. localStorage.setItem(LANG_KEY, lang)
  27. // 触发i18n实例的语言切换(后续在i18n配置中关联)
  28. if (window.$i18n && window.$i18n.global) {
  29. window.$i18n.global.locale.value = lang
  30. }
  31. window.$i18n.locale = lang
  32. console.log('切换到语言:', lang, $i18n)
  33. // 动态设置页面标题
  34. this.updateDynamicTitle()
  35. },
  36. // 动态更新页面标题
  37. updateDynamicTitle() {
  38. // 从语言包获取网站标题
  39. const siteTitle = this.currentLang === 'en' ? enMessages.common.title : zhMessages.common.title;
  40. if (siteTitle) {
  41. document.title = siteTitle
  42. }
  43. },
  44. }
  45. })