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.

137 lines
3.2 KiB

  1. <template>
  2. <el-dialog
  3. v-model="dialogVisible"
  4. title="语言切换"
  5. width="300px"
  6. :close-on-click-modal="false"
  7. append-to-body
  8. class="lang-switch-dialog"
  9. >
  10. <el-form label-width="80px">
  11. <el-form-item label="切换语言">
  12. <el-select
  13. v-model="tempLang"
  14. placeholder="请选择语言"
  15. style="width: 100%"
  16. >
  17. <el-option
  18. v-for="item in langOptions"
  19. :key="item.value"
  20. :label="item.label"
  21. :value="item.value"
  22. />
  23. </el-select>
  24. </el-form-item>
  25. </el-form>
  26. <template #footer>
  27. <div class="dialog-footer">
  28. <el-button @click="dialogVisible = false"> </el-button>
  29. <el-button type="primary" @click="handleConfirm"> </el-button>
  30. </div>
  31. </template>
  32. </el-dialog>
  33. </template>
  34. <script setup>
  35. import {computed, ref} from 'vue'
  36. import {useI18n} from 'vue-i18n'
  37. // === 显式引入所有用到的 Element Plus 组件 ===
  38. import {ElButton, ElDialog, ElForm, ElFormItem, ElMessage, ElOption, ElSelect} from 'element-plus'
  39. import request from "@/util/http.js";
  40. import {useAdminStore} from '@/store/index.js';
  41. import {storeToRefs} from "pinia";
  42. const {locale} = useI18n()
  43. // 控制弹窗显示
  44. const dialogVisible = ref(false)
  45. // 真正的当前语言
  46. const currentLang = computed(() => locale.value)
  47. // 临时选择的语言
  48. const tempLang = ref('')
  49. // 语言选项
  50. const langOptions = [
  51. {label: '中文(简体)', value: 'zh-CN'},
  52. {label: '中文(繁體)', value: 'zh-TW'},
  53. {label: '英语', value: 'en'},
  54. {label: 'ภาษาไทย', value: 'th'},
  55. {label: 'Tiếng Việt', value: 'vi'}
  56. ]
  57. // 获取语言显示名称
  58. const getLangLabel = (langCode) => {
  59. const find = langOptions.find(item => item.value === langCode)
  60. return find ? find.label : langCode
  61. }
  62. // 打开弹窗
  63. const open = () => {
  64. tempLang.value = currentLang.value
  65. dialogVisible.value = true
  66. }
  67. // 确认修改
  68. const handleConfirm = async () => {
  69. locale.value = tempLang.value
  70. localStorage.setItem('lang', tempLang.value)
  71. await getMenuTree()
  72. ElMessage.success(`语言已切换为:${getLangLabel(tempLang.value)}`)
  73. dialogVisible.value = false
  74. // 触发页面刷新以重新加载数据
  75. setTimeout(() => {
  76. window.location.reload()
  77. }, 500)
  78. }
  79. defineExpose({
  80. open
  81. })
  82. const adminStore = useAdminStore();
  83. const {adminData} = storeToRefs(adminStore);
  84. // 切换多语言 菜单改变
  85. const getMenuTree = async function () {
  86. // 获取菜单树
  87. try {
  88. const result = await request({
  89. url: '/menu/tree',
  90. data: {
  91. id: adminData.value.roleId,
  92. }
  93. })
  94. if (result.code === 200){
  95. adminStore.setMenuTree(result.data)
  96. }
  97. return result.data // 直接返回接口响应数据
  98. } catch (error) {
  99. console.error('菜单数据请求失败:', error)
  100. // return { code: 500, msg: '获取菜单失败' }
  101. ElMessage.error('网络异常')
  102. adminStore.clearState()
  103. }
  104. }
  105. </script>
  106. <style scoped>
  107. .dialog-footer {
  108. display: flex;
  109. justify-content: center;
  110. gap: 20px;
  111. }
  112. /* :deep(.el-dialog__body) {
  113. height: 220px !important;
  114. overflow-y: auto !important;
  115. } */
  116. </style>