vben
2020-12-07 74e62cbc712bdd4d4826e5fe80f537d87e44ffce
提交 | 用户 | age
5db3ce 1 <!--
V 2  * @Author: Vben
3  * @Description: Multi-language switching component
4 -->
737b1b 5 <template>
V 6   <Dropdown
7     :trigger="['click']"
8     :dropMenuList="localeList"
9     :selectedKeys="selectedKeys"
10     @menuEvent="handleMenuEvent"
e5f8ce 11     overlayClassName="app-locale-picker-overlay"
737b1b 12   >
ba068b 13     <span class="app-local-picker">
V 14       <GlobalOutlined class="app-local-picker__icon" />
15       <span v-if="showText">{{ getLangText }}</span>
16     </span>
737b1b 17   </Dropdown>
V 18 </template>
19 <script lang="ts">
ba068b 20   import { defineComponent, ref, watchEffect, unref, computed } from 'vue';
737b1b 21
V 22   import { Dropdown, DropMenu } from '/@/components/Dropdown';
23   import { GlobalOutlined } from '@ant-design/icons-vue';
24
25   import { useLocale } from '/@/hooks/web/useLocale';
ba068b 26   import { useLocaleSetting } from '/@/hooks/setting/useLocaleSetting';
737b1b 27
V 28   import { LocaleType } from '/@/locales/types';
29
73c8e0 30   import { propTypes } from '/@/utils/propTypes';
V 31
737b1b 32   export default defineComponent({
V 33     name: 'AppLocalPicker',
34     components: { GlobalOutlined, Dropdown },
ba068b 35     props: {
73c8e0 36       // Whether to display text
V 37       showText: propTypes.bool.def(true),
38       // Whether to refresh the interface when changing
39       reload: propTypes.bool,
ba068b 40     },
e5f8ce 41     setup(props) {
737b1b 42       const { localeList } = useLocaleSetting();
V 43       const selectedKeys = ref<string[]>([]);
44
45       const { changeLocale, getLang } = useLocale();
ba068b 46
V 47       const getLangText = computed(() => {
48         const key = selectedKeys.value[0];
49         if (!key) return '';
50         return localeList.find((item) => item.event === key)?.text;
51       });
737b1b 52
V 53       watchEffect(() => {
54         selectedKeys.value = [unref(getLang)];
55       });
56
57       function toggleLocale(lang: LocaleType | string) {
58         changeLocale(lang as LocaleType);
59         selectedKeys.value = [lang as string];
e5f8ce 60         props.reload && location.reload();
737b1b 61       }
V 62
63       function handleMenuEvent(menu: DropMenu) {
64         toggleLocale(menu.event as string);
65       }
66
ba068b 67       return { localeList, handleMenuEvent, selectedKeys, getLangText };
737b1b 68     },
V 69   });
70 </script>
71
74e62c 72 <style lang="less" scoped>
V 73   :global(.app-locale-picker-overlay) {
e5f8ce 74     .ant-dropdown-menu-item {
V 75       min-width: 160px;
76     }
77   }
78
ba068b 79   .app-local-picker {
V 80     display: flex;
81     align-items: center;
737b1b 82     cursor: pointer;
ba068b 83
V 84     &__icon {
85       margin-right: 4px;
86     }
737b1b 87   }
V 88 </style>