locale.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import { defineStore } from 'pinia'
  2. import { ref } from 'vue'
  3. import { defaultLocale, localeList } from '../locales'
  4. import i18n from '../i18n'
  5. export const useLocaleStore = defineStore('locale', () => {
  6. // 当前语言
  7. const currentLocale = ref(defaultLocale)
  8. // 可用语言列表
  9. const availableLocales = ref(localeList)
  10. // 初始化语言设置
  11. const initLocale = () => {
  12. try {
  13. const storedLocale = uni.getStorageSync('locale')
  14. if (storedLocale) {
  15. currentLocale.value = storedLocale
  16. i18n.global.locale.value = storedLocale
  17. }
  18. } catch (e) {
  19. console.error('Failed to load locale:', e)
  20. }
  21. }
  22. // 切换语言
  23. const setLocale = (locale) => {
  24. if (!locale || !localeList.find(item => item.value === locale)) {
  25. console.error('Invalid locale:', locale)
  26. return false
  27. }
  28. // 如果语言相同,直接返回,避免不必要的更新
  29. if (currentLocale.value === locale) {
  30. return true
  31. }
  32. try {
  33. // 批量更新:先更新 store 状态,再更新 i18n,最后持久化
  34. // 这样可以减少响应式触发次数
  35. currentLocale.value = locale
  36. i18n.global.locale.value = locale
  37. // 异步持久化,不阻塞UI
  38. setTimeout(() => {
  39. try {
  40. uni.setStorageSync('locale', locale)
  41. } catch (e) {
  42. console.error('Failed to save locale:', e)
  43. }
  44. }, 0)
  45. return true
  46. } catch (e) {
  47. console.error('Failed to set locale:', e)
  48. return false
  49. }
  50. }
  51. // 切换到下一个语言
  52. const toggleLocale = () => {
  53. const currentIndex = localeList.findIndex(item => item.value === currentLocale.value)
  54. const nextIndex = (currentIndex + 1) % localeList.length
  55. const nextLocale = localeList[nextIndex].value
  56. return setLocale(nextLocale)
  57. }
  58. // 获取当前语言的显示名称
  59. const getCurrentLocaleName = () => {
  60. const locale = localeList.find(item => item.value === currentLocale.value)
  61. return locale ? locale.label : ''
  62. }
  63. return {
  64. currentLocale,
  65. availableLocales,
  66. initLocale,
  67. setLocale,
  68. toggleLocale,
  69. getCurrentLocaleName
  70. }
  71. })