LocaleDropdown.vue 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. <script lang="ts" name="LocaleDropdown" setup>
  2. import { useLocaleStore } from '@/store/modules/locale'
  3. import { useLocale } from '@/hooks/web/useLocale'
  4. import { propTypes } from '@/utils/propTypes'
  5. import { useDesign } from '@/hooks/web/useDesign'
  6. const { getPrefixCls } = useDesign()
  7. const prefixCls = getPrefixCls('locale-dropdown')
  8. defineProps({
  9. color: propTypes.string.def('')
  10. })
  11. const localeStore = useLocaleStore()
  12. const langMap = computed(() => localeStore.getLocaleMap)
  13. const currentLang = computed(() => localeStore.getCurrentLocale)
  14. const setLang = (lang: LocaleType) => {
  15. if (lang === unref(currentLang).lang) return
  16. // 需要重新加载页面让整个语言多初始化
  17. window.location.reload()
  18. localeStore.setCurrentLocale({
  19. lang
  20. })
  21. const { changeLocale } = useLocale()
  22. changeLocale(lang)
  23. }
  24. </script>
  25. <template>
  26. <ElDropdown :class="prefixCls" trigger="click" @command="setLang">
  27. <Icon
  28. :class="$attrs.class"
  29. :color="color"
  30. :size="18"
  31. class="cursor-pointer"
  32. icon="ion:language-sharp"
  33. />
  34. <template #dropdown>
  35. <ElDropdownMenu>
  36. <ElDropdownItem v-for="item in langMap" :key="item.lang" :command="item.lang">
  37. {{ item.name }}
  38. </ElDropdownItem>
  39. </ElDropdownMenu>
  40. </template>
  41. </ElDropdown>
  42. </template>