cwg-language.vue 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <template>
  2. <view class="cwg-language">
  3. <cwg-dropdown :menu-list="customMenuList" @menuClick="handleMenuClick">
  4. <view class="pc-header-btn">
  5. <cwg-icon name="cwg-lang" :color="iconColor " :size="20" />
  6. </view>
  7. </cwg-dropdown>
  8. </view>
  9. </template>
  10. <script setup lang="ts">
  11. import { computed } from 'vue'
  12. import { useI18n } from 'vue-i18n'
  13. import { localesList, LANG_MAP } from '@/locale/index'
  14. import { lang } from '@/composables/config'
  15. const props = defineProps({
  16. iconColor: {
  17. type: String,
  18. default: '#97A1C0'
  19. },
  20. })
  21. const { t, locale } = useI18n()
  22. const customMenuList = computed(() =>
  23. localesList.map((code) => ({
  24. label: t(`language.${code}`),
  25. type: code
  26. })),
  27. )
  28. function handleMenuClick({ value }: { value: any }) {
  29. const type = value?.type ?? value
  30. if (!type) return
  31. locale.value = type
  32. lang.value = type
  33. const localeValue = LANG_MAP[type] || 'zh-Hans'
  34. uni.setLocale(localeValue)
  35. }
  36. function getFlagSrc(code: string) {
  37. switch (code) {
  38. case 'en':
  39. return '/static/flag-en.png'
  40. case 'cn':
  41. return '/static/flag-cn.png'
  42. case 'zhHant':
  43. return '/static/flag-zhHant.png'
  44. case 'es':
  45. return '/static/flag-es.png'
  46. default:
  47. return '/static/flag-en.png'
  48. }
  49. }
  50. </script>
  51. <style scoped lang="scss">
  52. @import "@/uni.scss";
  53. .pc-header-btn {
  54. display: flex;
  55. align-items: center;
  56. cursor: pointer;
  57. gap: px2rpx(6);
  58. }
  59. .cwg-language {
  60. @media screen and (max-width: 991px) {
  61. :deep(.cwg-dropdown-menu-container) {
  62. right: px2rpx(-20) !important;
  63. }
  64. }
  65. }
  66. :deep(.cwg-dropdown-menu-container .menu .menu-item) {
  67. min-height: px2rpx(36);
  68. }
  69. :deep(.cwg-dropdown) {
  70. overflow: visible !important;
  71. }
  72. </style>