LanguageSelect.vue 1.75 KB
Newer Older
hucy's avatar
hucy committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
<!--
 * 语言选择
  -->
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import { useI18n } from 'vue-i18n';
import { useLocalStorage } from 'src/common/hooks';
import { Langs } from 'src/config/enum';
// interface IDetailProps {
//   type: string;
//   data: any;
// }
// const props = withDefaults(defineProps<IDetailProps>(), {
//   type: '',
//   data: {},
// });

const { locale } = useI18n();
const { getItem, setItem } = useLocalStorage();

const languageLabel = ref('');

onMounted(() => {
  let language = getItem('LANG');
  let languageOpt = { label: '简体中文', value: 'zh-CN' };

  if (language) {
    languageOpt = JSON.parse(language as string);
  } else {
    setItem('LANG', JSON.stringify(languageOpt));
  }

  locale.value = languageOpt.value;
  languageLabel.value = languageOpt.label;
});

function onItemClick(item: any) {
  if (item.value === locale.value) return;

  setItem('LANG', JSON.stringify(item));
  languageLabel.value = item.label;
  locale.value = item.value;
}
</script>
<template>
  <div class="language-select">
    <q-btn-dropdown :label="languageLabel" flat color="#fff" no-caps>
      <q-list>
        <q-item
          clickable
          v-close-popup
          @click="onItemClick(item)"
          v-for="item in Langs"
          :key="item.value"
          :class="{ 'active-sel-item': item.value === $i18n.locale }"
        >
          <q-item-section>
            <q-item-label>{{ item.label }}</q-item-label>
          </q-item-section>
        </q-item>
      </q-list>
    </q-btn-dropdown>
  </div>
</template>

<style lang="scss" scoped>
.language-select {
  box-sizing: border-box;
  height: $header-heigyht;
  line-height: $header-heigyht;
  margin-right: $padding-sm;
}
.active-sel-item {
  color: $primary;
}
</style>