多语言优化
This commit is contained in:
@@ -39,6 +39,7 @@
|
||||
<script setup lang="ts">
|
||||
import { computed } from 'vue'
|
||||
import { useDictStore } from '@/store/modules/dict'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
defineOptions({ name: 'SaCheckbox', inheritAttrs: false })
|
||||
|
||||
@@ -69,6 +70,7 @@
|
||||
const modelValue = defineModel<(string | number)[]>()
|
||||
|
||||
const dictStore = useDictStore()
|
||||
const { t, te, locale } = useI18n()
|
||||
|
||||
const canConvertToNumberStrict = (value: any) => {
|
||||
if (value == null) return false
|
||||
@@ -81,9 +83,20 @@
|
||||
}
|
||||
|
||||
const options = computed(() => {
|
||||
// 让字典选项在切换语言时可响应更新
|
||||
locale.value
|
||||
|
||||
const list = dictStore.getByCode(props.dict) || []
|
||||
|
||||
if (!props.valueType) return list
|
||||
if (!props.valueType) {
|
||||
return list.map((item) => {
|
||||
const key = `dict.${props.dict}.${item.value}`
|
||||
return {
|
||||
...item,
|
||||
label: te(key) ? t(key) : item.label
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
return list.map((item) => {
|
||||
let newValue = item.value
|
||||
@@ -101,7 +114,11 @@
|
||||
|
||||
return {
|
||||
...item,
|
||||
value: newValue
|
||||
value: newValue,
|
||||
label: (() => {
|
||||
const key = `dict.${props.dict}.${newValue}`
|
||||
return te(key) ? t(key) : item.label
|
||||
})()
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
@@ -14,12 +14,12 @@
|
||||
:round="round"
|
||||
class="mr-1 last:mr-0"
|
||||
>
|
||||
{{ getData(item)?.label || item }}
|
||||
{{ getDisplayLabel(item) }}
|
||||
</ElTag>
|
||||
</template>
|
||||
<template v-else>
|
||||
<span v-for="(item, index) in normalizedValues" :key="index">
|
||||
{{ getData(item)?.label || item }}{{ index < normalizedValues.length - 1 ? '、' : '' }}
|
||||
{{ getDisplayLabel(item) }}{{ index < normalizedValues.length - 1 ? '、' : '' }}
|
||||
</span>
|
||||
</template>
|
||||
</div>
|
||||
@@ -27,6 +27,7 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { useDictStore } from '@/store/modules/dict'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
defineOptions({ name: 'SaDict' })
|
||||
|
||||
@@ -50,6 +51,7 @@
|
||||
})
|
||||
|
||||
const dictStore = useDictStore()
|
||||
const { t, te, locale } = useI18n()
|
||||
|
||||
// 统一处理 value,转换为数组格式
|
||||
const normalizedValues = computed(() => {
|
||||
@@ -64,6 +66,16 @@
|
||||
// 根据值获取字典数据
|
||||
const getData = (value: string) => dictStore.getDataByValue(props.dict, value)
|
||||
|
||||
const getDisplayLabel = (value: string) => {
|
||||
// 让显示在切换语言时可响应更新
|
||||
locale.value
|
||||
|
||||
const key = `dict.${props.dict}.${value}`
|
||||
if (te(key)) return t(key)
|
||||
|
||||
return getData(value)?.label || value
|
||||
}
|
||||
|
||||
const getColor = (color: string | undefined, type: 'bg' | 'border' | 'text') => {
|
||||
// 如果没有指定颜色,使用默认主色调
|
||||
if (!color) {
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
<script setup lang="ts">
|
||||
import { computed } from 'vue'
|
||||
import { useDictStore } from '@/store/modules/dict'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
defineOptions({ name: 'SaRadio', inheritAttrs: false })
|
||||
|
||||
@@ -82,6 +83,7 @@
|
||||
const modelValue = defineModel<string | number | undefined>()
|
||||
|
||||
const dictStore = useDictStore()
|
||||
const { t, te, locale } = useI18n()
|
||||
|
||||
// 判断能否转成数字
|
||||
const canConvertToNumberStrict = (value: any) => {
|
||||
@@ -97,10 +99,21 @@
|
||||
|
||||
// 核心逻辑:在 computed 中处理数据类型转换
|
||||
const options = computed(() => {
|
||||
// 让字典选项在切换语言时可响应更新
|
||||
locale.value
|
||||
|
||||
const list = dictStore.getByCode(props.dict) || []
|
||||
|
||||
// 如果没有指定 valueType,直接返回原始字典
|
||||
if (!props.valueType) return list
|
||||
if (!props.valueType) {
|
||||
return list.map((item) => {
|
||||
const key = `dict.${props.dict}.${item.value}`
|
||||
return {
|
||||
...item,
|
||||
label: te(key) ? t(key) : item.label
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 如果指定了类型,进行映射转换
|
||||
return list.map((item) => {
|
||||
@@ -119,7 +132,11 @@
|
||||
|
||||
return {
|
||||
...item,
|
||||
value: newValue
|
||||
value: newValue,
|
||||
label: (() => {
|
||||
const key = `dict.${props.dict}.${newValue}`
|
||||
return te(key) ? t(key) : item.label
|
||||
})()
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
<script setup lang="ts">
|
||||
import { computed } from 'vue'
|
||||
import { useDictStore } from '@/store/modules/dict'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
defineOptions({ name: 'SaSelect', inheritAttrs: false })
|
||||
|
||||
@@ -75,6 +76,7 @@
|
||||
const modelValue = defineModel<string | number | Array<string | number>>()
|
||||
|
||||
const dictStore = useDictStore()
|
||||
const { t, te, locale } = useI18n()
|
||||
|
||||
// 判断能否转成数字
|
||||
const canConvertToNumberStrict = (value: any) => {
|
||||
@@ -90,10 +92,21 @@
|
||||
|
||||
// 计算属性:获取字典数据并处理类型转换
|
||||
const options = computed(() => {
|
||||
// 让字典选项在切换语言时可响应更新
|
||||
locale.value
|
||||
|
||||
const list = dictStore.getByCode(props.dict) || []
|
||||
|
||||
// 1. 如果没有指定 valueType,直接返回
|
||||
if (!props.valueType) return list
|
||||
if (!props.valueType) {
|
||||
return list.map((item) => {
|
||||
const key = `dict.${props.dict}.${item.value}`
|
||||
return {
|
||||
...item,
|
||||
label: te(key) ? t(key) : item.label
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 2. 如果指定了类型,进行映射转换
|
||||
return list.map((item) => {
|
||||
@@ -111,7 +124,11 @@
|
||||
|
||||
return {
|
||||
...item,
|
||||
value: newValue
|
||||
value: newValue,
|
||||
label: (() => {
|
||||
const key = `dict.${props.dict}.${newValue}`
|
||||
return te(key) ? t(key) : item.label
|
||||
})()
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user