|
|
@@ -1,6 +1,11 @@
|
|
|
+// directives/vT.js
|
|
|
import { watch } from 'vue'
|
|
|
import { lang } from '@/composables/config'
|
|
|
|
|
|
+/**
|
|
|
+ * 解析绑定值
|
|
|
+ * 支持:'key' 或 ['key', param]
|
|
|
+ */
|
|
|
const parseBinding = (val) => {
|
|
|
if (Array.isArray(val)) {
|
|
|
const [key, ...rest] = val
|
|
|
@@ -11,6 +16,9 @@ const parseBinding = (val) => {
|
|
|
return { key: val, param: undefined }
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * 更新元素的文本内容
|
|
|
+ */
|
|
|
const updateElementText = (el, text) => {
|
|
|
if (!el) return
|
|
|
if (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') {
|
|
|
@@ -22,6 +30,9 @@ const updateElementText = (el, text) => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * 获取全局 i18n 实例
|
|
|
+ */
|
|
|
const getI18n = () => {
|
|
|
return typeof globalThis !== 'undefined' && globalThis.__i18n ? globalThis.__i18n : null
|
|
|
}
|
|
|
@@ -33,31 +44,55 @@ export default {
|
|
|
el._vTKey = key
|
|
|
el._vTParam = param
|
|
|
}
|
|
|
+
|
|
|
const update = () => {
|
|
|
const i18n = getI18n()
|
|
|
const key = el._vTKey
|
|
|
const param = el._vTParam
|
|
|
- if (!key) return
|
|
|
- const text = i18n ? i18n.global.t(key, param) : String(key)
|
|
|
+
|
|
|
+ // 无 key 时显示 --
|
|
|
+ if (!key) {
|
|
|
+ updateElementText(el, '')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ let text = ''
|
|
|
+ if (i18n) {
|
|
|
+ const translated = i18n.global.t(key, param)
|
|
|
+ // 如果翻译结果等于 key 本身,说明未找到翻译,显示 --
|
|
|
+ text = translated === key ? '' : translated
|
|
|
+ } else {
|
|
|
+ text = ''
|
|
|
+ }
|
|
|
+
|
|
|
updateElementText(el, text)
|
|
|
}
|
|
|
+
|
|
|
setState(binding.value)
|
|
|
update()
|
|
|
+
|
|
|
el._vTSetState = setState
|
|
|
el._vTUpdate = update
|
|
|
|
|
|
- el._vTStopWatch = watch(() => lang.value, () => {
|
|
|
- const i18n = getI18n()
|
|
|
- if (i18n?.global?.locale?.value !== undefined) {
|
|
|
- i18n.global.locale.value = lang.value
|
|
|
- }
|
|
|
- update()
|
|
|
- }, { immediate: false, flush: 'sync' })
|
|
|
+ // 监听语言变化,更新文本
|
|
|
+ el._vTStopWatch = watch(
|
|
|
+ () => lang.value,
|
|
|
+ () => {
|
|
|
+ const i18n = getI18n()
|
|
|
+ if (i18n?.global?.locale?.value !== undefined) {
|
|
|
+ i18n.global.locale.value = lang.value
|
|
|
+ }
|
|
|
+ update()
|
|
|
+ },
|
|
|
+ { immediate: false, flush: 'sync' }
|
|
|
+ )
|
|
|
},
|
|
|
+
|
|
|
updated(el, binding) {
|
|
|
if (el._vTSetState) el._vTSetState(binding.value)
|
|
|
if (el._vTUpdate) el._vTUpdate()
|
|
|
},
|
|
|
+
|
|
|
unmounted(el) {
|
|
|
if (el._vTStopWatch) {
|
|
|
el._vTStopWatch()
|
|
|
@@ -68,4 +103,4 @@ export default {
|
|
|
if (el._vTKey) delete el._vTKey
|
|
|
if (el._vTParam) delete el._vTParam
|
|
|
}
|
|
|
-}
|
|
|
+}
|