Spaces:
Sleeping
Sleeping
| <template> | |
| <div class="lang-switcher" role="group" :aria-label="t('nav.langZh')"> | |
| <button | |
| v-for="item in SUPPORTED_LOCALES" | |
| :key="item.value" | |
| type="button" | |
| class="lang-btn" | |
| :class="{ 'lang-btn--active': locale === item.value }" | |
| @click="switchLocale(item.value)" | |
| > | |
| {{ t(item.labelKey) }} | |
| </button> | |
| </div> | |
| </template> | |
| <script setup lang="ts"> | |
| import { computed } from 'vue' | |
| import { useI18n } from 'vue-i18n' | |
| import { setAppLocale, SUPPORTED_LOCALES, type AppLocale } from '../i18n' | |
| const { t, locale: i18nLocale } = useI18n() | |
| const locale = computed(() => i18nLocale.value as AppLocale) | |
| const switchLocale = (next: AppLocale) => { | |
| if (next === locale.value) return | |
| setAppLocale(next) | |
| } | |
| </script> | |
| <style scoped> | |
| .lang-switcher { | |
| display: inline-flex; | |
| border: 1px solid var(--ramex-border); | |
| border-radius: var(--ramex-radius); | |
| overflow: hidden; | |
| } | |
| .lang-btn { | |
| padding: 0.35rem 0.65rem; | |
| font-size: 0.75rem; | |
| font-weight: 500; | |
| color: var(--ramex-text-secondary); | |
| background: transparent; | |
| border: none; | |
| cursor: pointer; | |
| transition: background 0.15s ease, color 0.15s ease; | |
| } | |
| .lang-btn:hover { | |
| color: var(--ramex-text); | |
| background: var(--ramex-bg-subtle); | |
| } | |
| .lang-btn--active { | |
| color: var(--ramex-text); | |
| font-weight: 600; | |
| background: var(--ramex-bg-subtle); | |
| } | |
| </style> | |