LanguageDropdown.vue 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <template>
  2. <cwg-dropdown :menu-list="customMenuList" @menuClick="handleMenuClick">
  3. <view class="pc-header-btn">
  4. <cwg-icon name="cwg-lang" color="#141d22" />
  5. </view>
  6. </cwg-dropdown>
  7. </template>
  8. <script setup lang="ts">
  9. import { computed } from 'vue'
  10. import { useI18n } from 'vue-i18n'
  11. import { localesList, LANG_MAP } from '@/locale/index'
  12. import { lang } from '@/composables/config'
  13. const { t, locale } = useI18n()
  14. const currentLang = computed(() => lang.value || locale.value)
  15. const currentLabel = computed(() => t(`language.${currentLang.value}`))
  16. const currentFlag = computed(() => getFlagSrc(currentLang.value))
  17. const customMenuList = computed(() =>
  18. localesList.map((code) => ({
  19. label: t(`language.${code}`),
  20. type: code
  21. })),
  22. )
  23. function handleMenuClick({ value }: { value: any }) {
  24. const type = value?.type ?? value
  25. if (!type) return
  26. locale.value = type
  27. lang.value = type
  28. const localeValue = LANG_MAP[type] || 'zh-Hans'
  29. uni.setLocale(localeValue)
  30. }
  31. function getFlagSrc(code: string) {
  32. switch (code) {
  33. case 'en':
  34. return '/static/flag-en.png'
  35. case 'cn':
  36. return '/static/flag-cn.png'
  37. case 'zhHant':
  38. return '/static/flag-zhHant.png'
  39. case 'es':
  40. return '/static/flag-es.png'
  41. default:
  42. return '/static/flag-en.png'
  43. }
  44. }
  45. </script>
  46. <style scoped lang="scss">
  47. @import "@/uni.scss";
  48. :deep(.cwg-dropdown-menu-container .menu .menu-item) {
  49. min-height: px2rpx(36);
  50. }
  51. :deep(.cwg-dropdown) {
  52. overflow: visible !important;
  53. }
  54. </style>