cwg-language.vue 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <template>
  2. <cwg-dropdown :menu-list="customMenuList" @menuClick="handleMenuClick">
  3. <view class="pc-header-btn">
  4. <cwg-icon name="cwg-lang" :color="iconColor" :size="20" />
  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 props = defineProps({
  14. iconColor: {
  15. type: String,
  16. default: '#141d22'
  17. },
  18. })
  19. const { t, locale } = useI18n()
  20. const customMenuList = computed(() =>
  21. localesList.map((code) => ({
  22. label: t(`language.${code}`),
  23. type: code
  24. })),
  25. )
  26. function handleMenuClick({ value }: { value: any }) {
  27. const type = value?.type ?? value
  28. if (!type) return
  29. locale.value = type
  30. lang.value = type
  31. const localeValue = LANG_MAP[type] || 'zh-Hans'
  32. uni.setLocale(localeValue)
  33. }
  34. function getFlagSrc(code: string) {
  35. switch (code) {
  36. case 'en':
  37. return '/static/flag-en.png'
  38. case 'cn':
  39. return '/static/flag-cn.png'
  40. case 'zhHant':
  41. return '/static/flag-zhHant.png'
  42. case 'es':
  43. return '/static/flag-es.png'
  44. default:
  45. return '/static/flag-en.png'
  46. }
  47. }
  48. </script>
  49. <style scoped lang="scss">
  50. @import "@/uni.scss";
  51. .pc-header-btn {
  52. display: flex;
  53. align-items: center;
  54. cursor: pointer;
  55. gap: px2rpx(6);
  56. }
  57. :deep(.cwg-dropdown-menu-container .menu .menu-item) {
  58. min-height: px2rpx(36);
  59. }
  60. :deep(.cwg-dropdown) {
  61. overflow: visible !important;
  62. }
  63. </style>