|
| 1 | +<template> |
| 2 | + <div class="LanguageSelect ignore"> |
| 3 | + <!-- 使用作用域插槽,将组件内部的数据和方法传递给父组件 --> |
| 4 | + <slot |
| 5 | + :LanguageSelectLanguageList="LanguageSelectLanguageList" |
| 6 | + :LanguageSelectOnChange="LanguageSelectOnChange" |
| 7 | + > |
| 8 | + <!-- 原生 select 实现 --> |
| 9 | + <select |
| 10 | + v-model="language" |
| 11 | + @change="LanguageSelectOnChange" |
| 12 | + class="ignore" |
| 13 | + > |
| 14 | + <option value="" disabled>Please select language</option> |
| 15 | + <option v-for="option in LanguageSelectLanguageList" :key="option.id" :value="option.id"> |
| 16 | + {{ option.name }} |
| 17 | + </option> |
| 18 | + </select> |
| 19 | + </slot> |
| 20 | + </div> |
| 21 | +</template> |
| 22 | + |
| 23 | +<script setup lang="ts"> |
| 24 | +import { ref, onMounted, h } from 'vue'; |
| 25 | +
|
| 26 | +// 定义语言选项类型 |
| 27 | +interface LanguageOption { |
| 28 | + id: string; |
| 29 | + name: string; |
| 30 | +} |
| 31 | +
|
| 32 | +// 选中的语言ID(双向绑定值) |
| 33 | +const language = ref<string | null>(null); |
| 34 | +
|
| 35 | +// 语言选项列表 |
| 36 | +const LanguageSelectLanguageList = ref<LanguageOption[]>([]); |
| 37 | +
|
| 38 | +// 处理语言选择变化 |
| 39 | +const LanguageSelectOnChange = (event: Event) => { |
| 40 | + // 从事件对象中获取选中的值 |
| 41 | + const target = event.target as HTMLSelectElement; |
| 42 | + const value = target.value; |
| 43 | + |
| 44 | + language.value = value; |
| 45 | + window.translate.selectLanguageTag.selectOnChange({ |
| 46 | + target: { |
| 47 | + value: value |
| 48 | + } |
| 49 | + }); |
| 50 | +}; |
| 51 | +
|
| 52 | +onMounted(() => { |
| 53 | + // 保留原有的初始化逻辑 |
| 54 | + if (typeof (translate) == 'object' && typeof (translate.vue3) == 'object' && typeof (translate.vue3.isUse) == 'boolean' && translate.vue3.isUse == true) { |
| 55 | + // 正常,需要的,需要加载多语言切换Select |
| 56 | + } else { |
| 57 | + // 不需要显示 |
| 58 | + return; |
| 59 | + } |
| 60 | +
|
| 61 | + translate.time.log(translate.vue3.isUse); |
| 62 | +
|
| 63 | + // 重写渲染语言下拉列表出现时的函数 |
| 64 | + translate.selectLanguageTag.render = function () { |
| 65 | + if (translate.selectLanguageTag.alreadyRender) { |
| 66 | + return; |
| 67 | + } |
| 68 | + translate.selectLanguageTag.alreadyRender = true; |
| 69 | +
|
| 70 | + // 判断如果不显示select选择语言,直接就隐藏掉 |
| 71 | + if (!translate.selectLanguageTag.show) { |
| 72 | + return; |
| 73 | + } |
| 74 | +
|
| 75 | + // 从服务器加载支持的语言库 |
| 76 | + if (typeof (translate.request.api.language) == 'string' && translate.request.api.language.length > 0) { |
| 77 | + // 从接口加载语种 |
| 78 | + translate.request.post(translate.request.api.language, {}, function (data) { |
| 79 | + if (data.result == 0) { |
| 80 | + console.log('load language list error : ' + data.info); |
| 81 | + return; |
| 82 | + } |
| 83 | + translate.request.api.language = data.list; // 进行缓存 |
| 84 | + translate.selectLanguageTag.customUI(data.list); |
| 85 | + }, null); |
| 86 | + } else if (typeof (translate.request.api.language) == 'object') { |
| 87 | + // 无网络环境下,自定义显示语种 |
| 88 | + translate.selectLanguageTag.customUI(translate.request.api.language); |
| 89 | + } |
| 90 | +
|
| 91 | + // 显示切换语言 |
| 92 | + const TranslateJsSelectLanguages = document.getElementsByClassName('LanguageSelect'); |
| 93 | + for (let li = 0; li < TranslateJsSelectLanguages.length; li++) { |
| 94 | + TranslateJsSelectLanguages[li].style.display = 'block'; |
| 95 | + } |
| 96 | + } |
| 97 | +
|
| 98 | + // 处理语言列表数据 |
| 99 | + translate.selectLanguageTag.customUI = function (externalLanguageList) { |
| 100 | + // 整理允许显示的语种 |
| 101 | + const allowLanguageList: LanguageOption[] = []; |
| 102 | +
|
| 103 | + // 判断 selectLanguageTag.languages 中允许使用哪些 |
| 104 | + if (translate.selectLanguageTag.languages.length > 0) { |
| 105 | + // 设置了自定义显示的语言 |
| 106 | + // 都转小写判断 |
| 107 | + const langs_indexof = (',' + translate.selectLanguageTag.languages + ',').toLowerCase(); |
| 108 | +
|
| 109 | + for (let i = 0; i < externalLanguageList.length; i++) { |
| 110 | + if (langs_indexof.indexOf(',' + externalLanguageList[i].id.toLowerCase() + ',') < 0) { |
| 111 | + // 没发现,那不显示这个语种,调出 |
| 112 | + continue; |
| 113 | + } |
| 114 | + allowLanguageList.push(externalLanguageList[i]); |
| 115 | + } |
| 116 | +
|
| 117 | + } else { |
| 118 | + // 显示所有 |
| 119 | + allowLanguageList.push(...externalLanguageList); |
| 120 | + } |
| 121 | + // 赋予带渲染到界面的语言列表数据 |
| 122 | + LanguageSelectLanguageList.value = allowLanguageList; |
| 123 | +
|
| 124 | + // 显示上一次切换后的语种 |
| 125 | + language.value = translate.language.getCurrent(); |
| 126 | + } |
| 127 | +
|
| 128 | + // 渲染语言下拉列表出现 |
| 129 | + translate.selectLanguageTag.refreshRender(); |
| 130 | +}); |
| 131 | +</script> |
| 132 | + |
| 133 | +<style scoped> |
| 134 | +/* 避免被遮挡无法操作,设置z-index较高 */ |
| 135 | +.LanguageSelect { |
| 136 | + z-index: 2147483583; |
| 137 | + display: none; |
| 138 | +} |
| 139 | +</style> |
0 commit comments