cwg-language.vue 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <template>
  2. <view class="cwg-language" >
  3. <cwg-dropdown :menu-list="customMenuList" @menuClick="handleMenuClick" showActive :activeKey="lang">
  4. <view class="pc-header-btn cursor-pointer" :data-tooltip="t('vu.tooltip.t101')">
  5. <cwg-icon name="cwg-lang" :color="iconColor " :size="20" />
  6. <text class="lang-text">{{ t(`language.${lang}`) }}</text>
  7. </view>
  8. </cwg-dropdown>
  9. </view>
  10. </template>
  11. <script setup lang="ts">
  12. import { computed } from 'vue'
  13. import { useI18n } from 'vue-i18n'
  14. import { localesList, switchAppLanguage } from '@/locale/index'
  15. import { lang } from '@/composables/config'
  16. const props = defineProps({
  17. iconColor: {
  18. type: String,
  19. default: '#97A1C0'
  20. },
  21. })
  22. const { t, locale } = useI18n()
  23. const customMenuList = computed(() =>
  24. localesList.map((code) => ({
  25. label: t(`language.${code}`),
  26. type: code
  27. })),
  28. )
  29. function handleMenuClick({ value }: { value: any }) {
  30. const type = value?.type ?? value
  31. switchAppLanguage(type, { locale, lang })
  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. .pc-header-btn {
  51. width: auto;
  52. display: flex;
  53. align-items: center;
  54. cursor: pointer;
  55. gap: px2rpx(6);
  56. padding: 0 px2rpx(5);
  57. }
  58. .cwg-language {
  59. :deep(.cwg-dropdown-menu-container) {
  60. left: px2rpx(-40) !important;
  61. right: px2rpx(0) !important;
  62. .menu{
  63. max-height: 80vh;
  64. overflow-y: scroll;
  65. //scrollbar-width: thin;
  66. /* 强制显示滚动条并美化 */
  67. &::-webkit-scrollbar {
  68. width: 4px !important;
  69. height: 4px !important;
  70. display: block !important;
  71. /* 强制在某些webkit浏览器中显示 */
  72. background-color:yellow !important;
  73. }
  74. &::-webkit-scrollbar-track {
  75. background-color: #faf3f3;
  76. border-radius: 4px;
  77. }
  78. &::-webkit-scrollbar-thumb {
  79. background-color:#6a6a6a;
  80. border-radius: 4px;
  81. &:hover {
  82. background-color: #6a6a6a;
  83. }
  84. }
  85. }
  86. }
  87. @media screen and (max-width: 991px) {
  88. :deep(.cwg-dropdown-menu-container) {
  89. right: px2rpx(-20) !important;
  90. }
  91. }
  92. @media screen and (max-width: 768px) {
  93. :deep(.cwg-dropdown-menu-container) {
  94. right: px2rpx(0) !important;
  95. }
  96. }
  97. }
  98. :deep(.cwg-dropdown-menu-container .menu .menu-item) {
  99. min-height: px2rpx(36);
  100. }
  101. :deep(.cwg-dropdown) {
  102. overflow: visible !important;
  103. }
  104. </style>