v-t.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import { watch } from 'vue'
  2. import { lang } from '@/composables/config'
  3. const parseBinding = (val) => {
  4. if (Array.isArray(val)) {
  5. const [key, ...rest] = val
  6. if (rest.length === 0) return { key, param: undefined }
  7. if (rest.length === 1) return { key, param: rest[0] }
  8. return { key, param: rest }
  9. }
  10. return { key: val, param: undefined }
  11. }
  12. const updateElementText = (el, text) => {
  13. if (!el) return
  14. if (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') {
  15. el.value = text
  16. } else if ('textContent' in el) {
  17. el.textContent = text
  18. } else if ('innerText' in el) {
  19. el.innerText = text
  20. }
  21. }
  22. const getI18n = () => {
  23. return typeof globalThis !== 'undefined' && globalThis.__i18n ? globalThis.__i18n : null
  24. }
  25. export default {
  26. mounted(el, binding) {
  27. const setState = (val) => {
  28. const { key, param } = parseBinding(val)
  29. el._vTKey = key
  30. el._vTParam = param
  31. }
  32. const update = () => {
  33. const i18n = getI18n()
  34. const key = el._vTKey
  35. const param = el._vTParam
  36. if (!key) return
  37. const text = i18n ? i18n.global.t(key, param) : String(key)
  38. updateElementText(el, text)
  39. }
  40. setState(binding.value)
  41. update()
  42. el._vTSetState = setState
  43. el._vTUpdate = update
  44. el._vTStopWatch = watch(() => lang.value, () => {
  45. const i18n = getI18n()
  46. if (i18n?.global?.locale?.value !== undefined) {
  47. i18n.global.locale.value = lang.value
  48. }
  49. update()
  50. }, { immediate: false, flush: 'sync' })
  51. },
  52. updated(el, binding) {
  53. if (el._vTSetState) el._vTSetState(binding.value)
  54. if (el._vTUpdate) el._vTUpdate()
  55. },
  56. unmounted(el) {
  57. if (el._vTStopWatch) {
  58. el._vTStopWatch()
  59. delete el._vTStopWatch
  60. }
  61. if (el._vTUpdate) delete el._vTUpdate
  62. if (el._vTSetState) delete el._vTSetState
  63. if (el._vTKey) delete el._vTKey
  64. if (el._vTParam) delete el._vTParam
  65. }
  66. }