You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
178 lines
4.4 KiB
178 lines
4.4 KiB
<template>
|
|
<el-dialog
|
|
v-model="dialogVisible"
|
|
title="语言切换"
|
|
width="300px"
|
|
:close-on-click-modal="false"
|
|
append-to-body
|
|
class="lang-switch-dialog"
|
|
>
|
|
<el-form label-width="80px">
|
|
<el-form-item label="切换语言">
|
|
<el-select
|
|
v-model="tempLang"
|
|
placeholder="请选择语言"
|
|
style="width: 100%"
|
|
>
|
|
<el-option
|
|
v-for="item in langOptions"
|
|
:key="item.value"
|
|
:label="item.label"
|
|
:value="item.value"
|
|
/>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form>
|
|
|
|
<template #footer>
|
|
<div class="dialog-footer">
|
|
<el-button @click="dialogVisible = false">取 消</el-button>
|
|
<el-button type="primary" @click="handleConfirm">确 定</el-button>
|
|
</div>
|
|
</template>
|
|
</el-dialog>
|
|
</template>
|
|
|
|
<script setup>
|
|
import {computed, ref} from 'vue'
|
|
import {useI18n} from 'vue-i18n'
|
|
// === 显式引入所有用到的 Element Plus 组件 ===
|
|
import {ElButton, ElDialog, ElForm, ElFormItem, ElMessage, ElOption, ElSelect} from 'element-plus'
|
|
import request from "@/util/http.js";
|
|
import {useAdminStore} from '@/store/index.js';
|
|
import {storeToRefs} from "pinia";
|
|
|
|
const {locale} = useI18n()
|
|
|
|
// 控制弹窗显示
|
|
const dialogVisible = ref(false)
|
|
|
|
// 真正的当前语言
|
|
const currentLang = computed(() => locale.value)
|
|
|
|
// 临时选择的语言
|
|
const tempLang = ref('')
|
|
|
|
// 语言选项
|
|
const langOptions = [
|
|
{label: '中文(简体)', value: 'zh-CN'},
|
|
// {label: '中文(繁體)', value: 'zh-TW'},
|
|
{label: 'English', value: 'en'},
|
|
// {label: 'ภาษาไทย', value: 'th'},
|
|
// {label: 'Tiếng Việt', value: 'vi'}
|
|
]
|
|
|
|
// 获取语言显示名称
|
|
const getLangLabel = (langCode) => {
|
|
const find = langOptions.find(item => item.value === langCode)
|
|
return find ? find.label : langCode
|
|
}
|
|
|
|
// 打开弹窗
|
|
const open = () => {
|
|
tempLang.value = currentLang.value
|
|
dialogVisible.value = true
|
|
}
|
|
|
|
|
|
// 确认修改
|
|
const handleConfirm = async () => {
|
|
locale.value = tempLang.value
|
|
localStorage.setItem('lang', tempLang.value)
|
|
|
|
await getMenuTree()
|
|
await selectMarket()
|
|
|
|
ElMessage.success(`语言已切换为:${getLangLabel(tempLang.value)}`)
|
|
dialogVisible.value = false
|
|
// 触发页面刷新以重新加载数据
|
|
setTimeout(() => {
|
|
window.location.reload()
|
|
}, 500)
|
|
}
|
|
|
|
defineExpose({
|
|
open
|
|
})
|
|
|
|
const adminStore = useAdminStore();
|
|
const {adminData} = storeToRefs(adminStore);
|
|
// 切换多语言 菜单改变
|
|
const getMenuTree = async function () {
|
|
// 获取菜单树
|
|
try {
|
|
const result = await request({
|
|
url: '/menu/tree',
|
|
data: {
|
|
id: adminData.value.roleId,
|
|
|
|
}
|
|
})
|
|
if (result.code === 200){
|
|
adminStore.setMenuTree(result.data)
|
|
|
|
}
|
|
|
|
return result.data // 直接返回接口响应数据
|
|
} catch (error) {
|
|
console.error('菜单数据请求失败:', error)
|
|
// return { code: 500, msg: '获取菜单失败' }
|
|
ElMessage.error('网络异常')
|
|
adminStore.clearState()
|
|
}
|
|
}
|
|
|
|
// 获取地区列表 用于映射
|
|
const selectMarket = async function () {
|
|
try {
|
|
const selectMarketResult = await request({ url: '/market/selectMarket' });
|
|
const marketList = {};
|
|
|
|
// 递归遍历树形结构(从子节点开始)
|
|
const traverseTree = (nodes) => {
|
|
nodes.forEach(node => {
|
|
// 存储当前节点的 id 和 name
|
|
marketList[node.id] = node.name;
|
|
// 递归处理子节点
|
|
if (node.children && node.children.length > 0) {
|
|
traverseTree(node.children);
|
|
}
|
|
});
|
|
};
|
|
|
|
// 关键:跳过第一级节点,直接遍历第一级的子节点
|
|
// 假设 selectMarketResult.data 是根节点数组(第一级)
|
|
selectMarketResult.data.forEach(rootNode => {
|
|
// 只处理第一级节点的子节点(从第二级开始遍历)
|
|
if (rootNode.children && rootNode.children.length > 0) {
|
|
traverseTree(rootNode.children);
|
|
}
|
|
});
|
|
|
|
console.log('排除第一级后的地区列表 语言:', marketList);
|
|
adminStore.setMarketList(marketList);
|
|
|
|
// return marketList;
|
|
|
|
} catch (error) {
|
|
console.error('获取地区树失败:', error);
|
|
return {};
|
|
}
|
|
};
|
|
|
|
</script>
|
|
|
|
|
|
<style scoped>
|
|
.dialog-footer {
|
|
display: flex;
|
|
justify-content: center;
|
|
gap: 20px;
|
|
}
|
|
|
|
|
|
/* :deep(.el-dialog__body) {
|
|
height: 220px !important;
|
|
overflow-y: auto !important;
|
|
} */
|
|
</style>
|