zhb 2 miesięcy temu
rodzic
commit
b2110d1c64
1 zmienionych plików z 45 dodań i 10 usunięć
  1. 45 10
      directives/v-t.js

+ 45 - 10
directives/v-t.js

@@ -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
   }
-}
+}