20260903173038

This commit is contained in:
oneao committed 2026-09-03 17:30:39 +08:00
1 parent c8940f6e03
commit 0faf44cffc
55 files changed
+3278 -208

No files matched your search

+9
View File
@@ -2,6 +2,7 @@ import { defineStore } from 'pinia'
import { watch } from 'vue'
import { DEFAULT_PRIMARY } from '@/theme/presets'
import { applyPrimaryColor, applyDarkMode } from '@/theme/index'
import { setLocale as setRuntimeLocale, translate } from '@/utils/translate'
export const useAppStore = defineStore('app', {
state: () => ({
@@ -18,6 +19,11 @@ export const useAppStore = defineStore('app', {
}),
getters: {
// 翻译目录由 utils/translate 维护,store 仅提供旧调用方兼容门面。
t:
() =>
(key, fallback = '') =>
translate(key, fallback),
/** keep-alive 的 include 列表:当前打开页签对应的组件名(去重)。
* 页签关闭时该集合随之缩小,keep-alive 据此销毁对应缓存实例,
* 实现"关闭页签即销毁缓存" */
@@ -45,6 +51,7 @@ export const useAppStore = defineStore('app', {
},
toggleLocale() {
this.locale = this.locale === 'zh-CN' ? 'en-US' : 'zh-CN'
setRuntimeLocale(this.locale)
},
addVisitedTab(tab) {
if (this.visitedTabs.some((t) => t.key === tab.key)) return
@@ -106,6 +113,8 @@ export const useAppStore = defineStore('app', {
export function initThemeSync(pinia) {
const store = useAppStore(pinia)
setRuntimeLocale(store.locale)
watch(
() => store.darkMode,
(val) => applyDarkMode(val),
+94
View File
@@ -0,0 +1,94 @@
import { computed, ref } from 'vue'
import { defineStore } from 'pinia'
import { loadDataApi } from '@/services/api'
/**
* 业务数据多语言配置 store(s_i18n_type 驱动)。
*
* 管理「业务数据要翻译成哪些语言」的语言清单(如菜单名 / 模块名等存 s_i18n 的
* 目标语言),与界面文案翻译(utils/translate 的 t(key, fallback))无关:
* - 界面文案默认走 t() 的 fallback 参数(中文),本 store 不参与;
* - 本 store 只提供业务语言清单,完全以数据库 s_i18n_type 为准,无内置回退。
*
* 用法:
* const langStore = useLanguagesStore()
* await langStore.loadLanguages() // 启动时调用一次
* langStore.languages // 启用的语言(b_canuse=1,按 b_xh 排序)
* langStore.defaultLanguage // b_default=1 那条
* langStore.nonDefaultLanguages // 其余语言(需要存 s_i18n 表)
* langStore.langName('en-US') // 语言编码 → 名称
*/
export const useLanguagesStore = defineStore('languages', () => {
/** 语言清单(s_i18n_type,仅 b_canuse=1,按 b_xh 排序) */
const languages = ref([])
const loading = ref(false)
const loaded = ref(false)
const error = ref('')
let loadingPromise = null
/** 默认语言(b_default=1);无则返回 null */
const defaultLanguage = computed(
() => languages.value.find((l) => Number(l.b_default) === 1) || null,
)
/** 非默认语言(需要走 s_i18n 表的语言) */
const nonDefaultLanguages = computed(() =>
languages.value.filter((l) => Number(l.b_default) !== 1),
)
/** code → 名称;未知编码返回编码本身 */
const langName = computed(
() => (code) => {
const lang = languages.value.find((l) => String(l.b_code) === String(code))
return lang?.b_name || String(code)
},
)
/**
* 加载语言配置。并发调用共享同一请求;加载成功后再次调用直接返回。
* 失败时置 error 且不清空已有列表(保留上次成功数据),由调用方决定重试。
*/
async function loadLanguages(force = false) {
if (!force && loaded.value) return
if (loadingPromise && !force) return loadingPromise
loading.value = true
error.value = ''
loadingPromise = loadDataApi('s_i18n_type', 'b_canuse = 1', 'b_xh ASC, b_id ASC')
.then((res) => {
languages.value = (res.data || []).map((row) => ({
b_id: row.b_id,
b_code: row.b_code,
b_name: row.b_name,
b_canuse: Number(row.b_canuse),
b_default: Number(row.b_default),
b_xh: Number(row.b_xh) || 0,
}))
loaded.value = true
})
.catch((e) => {
error.value = e?.message || String(e)
})
.finally(() => {
loading.value = false
loadingPromise = null
})
return loadingPromise
}
/** 强制重新加载(如 i18n-type 管理页保存后调用,让消费端同步) */
function refresh() {
return loadLanguages(true)
}
return {
languages,
loading,
loaded,
error,
defaultLanguage,
nonDefaultLanguages,
langName,
loadLanguages,
refresh,
}
})