feat(I18n): Add Ii8n

feat(LocaleDropdown): Add LocaleDropdown Component

feat(store): Add localeStore
This commit is contained in:
kailong321200875
2022-01-03 09:41:34 +08:00
parent 45d657d44c
commit 3810b8c3b2
42 changed files with 1033 additions and 625 deletions

View File

@@ -0,0 +1,3 @@
import Icon from './src/Icon.vue'
export { Icon }

View File

@@ -0,0 +1,86 @@
<script setup lang="ts">
import { computed, unref, ref, watch, nextTick } from 'vue'
import { ElIcon } from 'element-plus'
import { useDesign } from '@/hooks/web/useDesign'
import { propTypes } from '@/utils/propTypes'
import Iconify from '@purge-icons/generated'
const { getPrefixCls } = useDesign()
const prefixCls = getPrefixCls('icon')
const props = defineProps({
// icon name
icon: propTypes.string,
// icon color
color: propTypes.string,
// icon size
size: propTypes.number.def(16)
})
const elRef = ref<ElRef>(null)
const isLocal = computed(() => props.icon.startsWith('icon:'))
const symbolId = computed(() => {
return unref(isLocal) ? `#icon-${props.icon.split('icon:')[1]}` : props.icon
})
const getIconifyStyle = computed(() => {
const { color, size } = props
return {
fontSize: `${size}px`,
color
}
})
async function updateIcon(icon: string) {
if (unref(isLocal)) return
const el = unref(elRef)
if (!el) return
await nextTick()
if (!icon) return
const svg = Iconify.renderSVG(icon, {})
if (svg) {
el.textContent = ''
el.appendChild(svg)
} else {
const span = document.createElement('span')
span.className = 'iconify'
span.dataset.icon = icon
el.textContent = ''
el.appendChild(span)
}
}
watch(
() => props.icon,
(icon: string) => {
updateIcon(icon)
}
)
</script>
<template>
<ElIcon :class="[prefixCls, $attrs.class]" :size="size" :color="color">
<svg v-if="isLocal" aria-hidden="true">
<use :xlink:href="symbolId" />
</svg>
<span v-else ref="elRef" :style="getIconifyStyle">
<span class="iconify" :data-icon="symbolId"></span>
</span>
</ElIcon>
</template>
<style lang="less" scoped>
@prefix-cls: ~'@{namespace}-icon';
.@{prefix-cls} {
display: inline-block;
}
</style>