LanguageDropdown.vue 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <template>
  2. <cwg-dropdown :menu-list="customMenuList" @menuClick="handleMenuClick">
  3. <view class="lang-select">
  4. <image class="img flag" :src="currentFlag" alt="lang" />
  5. <text>{{ currentLabel }}</text>
  6. <text class="arrow">▼</text>
  7. </view>
  8. </cwg-dropdown>
  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 { t, locale } = useI18n()
  16. const currentLang = computed(() => lang.value || locale.value)
  17. const currentLabel = computed(() => t(`language.${currentLang.value}`))
  18. const currentFlag = computed(() => getFlagSrc(currentLang.value))
  19. const customMenuList = computed(() =>
  20. localesList.map((code) => ({
  21. label: t(`language.${code}`),
  22. type: code
  23. })),
  24. )
  25. function handleMenuClick({ value }: { value: any }) {
  26. const type = value?.type ?? value
  27. if (!type) return
  28. locale.value = type
  29. lang.value = type
  30. const localeValue = LANG_MAP[type] || 'zh-Hans'
  31. uni.setLocale(localeValue)
  32. }
  33. function getFlagSrc(code: string) {
  34. switch (code) {
  35. case 'en':
  36. return '/static/flag-en.png'
  37. case 'cn':
  38. return '/static/flag-cn.png'
  39. case 'zhHant':
  40. return '/static/flag-zhHant.png'
  41. case 'es':
  42. return '/static/flag-es.png'
  43. default:
  44. return '/static/flag-en.png'
  45. }
  46. }
  47. </script>
  48. <style scoped lang="scss">
  49. @import "@/uni.scss";
  50. .lang-select {
  51. display: flex;
  52. align-items: center;
  53. background: #f5f7fa;
  54. border-radius: 18px;
  55. padding: 4px 12px;
  56. font-size: 14px;
  57. cursor: pointer;
  58. }
  59. .flag {
  60. width: 22px;
  61. height: 16px;
  62. margin-right: 6px;
  63. }
  64. .arrow {
  65. margin-left: 4px;
  66. font-size: 12px;
  67. }
  68. :deep(.cwg-dropdown-menu-container) {
  69. top: px2rpx(40) !important;
  70. left: 0 !important;
  71. right: auto !important;
  72. z-index: 1000 !important;
  73. }
  74. :deep(.cwg-dropdown-menu-container .menu) {
  75. min-width: px2rpx(180);
  76. }
  77. :deep(.cwg-dropdown-menu-container .menu .menu-item) {
  78. min-height: px2rpx(36);
  79. }
  80. :deep(.cwg-dropdown) {
  81. overflow: visible !important;
  82. }
  83. </style>