vp-translation.vue 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. <script setup lang="ts">
  2. import VPLink from '../common/vp-link.vue'
  3. import { useTranslation } from '../../composables/translation'
  4. const { switchLang, languageMap, langs, lang, helpTranslate } = useTranslation()
  5. </script>
  6. <template>
  7. <div class="translation-container">
  8. <ClientOnly>
  9. <ElPopover
  10. :show-arrow="false"
  11. trigger="hover"
  12. popper-class="translation-popup"
  13. >
  14. <template #reference>
  15. <ElIcon :size="24">
  16. <i-ri-translate-2 />
  17. </ElIcon>
  18. </template>
  19. <div
  20. v-for="l in langs"
  21. :key="l"
  22. :class="{ language: true, selected: l === lang }"
  23. @click="switchLang(l)"
  24. >
  25. {{ languageMap[l] }}
  26. </div>
  27. <div class="language">
  28. <VPLink :href="`/${lang}/guide/translation`">
  29. {{ helpTranslate }}
  30. </VPLink>
  31. </div>
  32. </ElPopover>
  33. </ClientOnly>
  34. </div>
  35. </template>
  36. <style lang="scss" scoped>
  37. @use '../../styles/mixins' as *;
  38. .translation-container {
  39. display: none;
  40. height: 24px;
  41. padding: 0 12px;
  42. @include respond-to('md') {
  43. display: block;
  44. }
  45. @at-root .translation-popup.el-popper {
  46. box-shadow: var(--el-box-shadow);
  47. .language {
  48. cursor: pointer;
  49. padding: 0 16px;
  50. line-height: 28px;
  51. &.selected {
  52. color: var(--brand-color);
  53. }
  54. .link-item {
  55. font-weight: 500;
  56. }
  57. }
  58. }
  59. }
  60. </style>