Эх сурвалжийг харах

系统自带的页面的国际化基本完成(仅仅作为客户可能使用的页面)

Huanyi 1 долоо хоног өмнө
parent
commit
bedd93b422

+ 98 - 0
src/lang/modules/system/dict/en_US.ts

@@ -0,0 +1,98 @@
+// Dictionary Management Module - English Translation
+export default {
+  // Search Form
+  search: {
+    dictName: 'Dictionary Name',
+    dictNamePlaceholder: 'Please enter dictionary name',
+    dictType: 'Dictionary Type',
+    dictTypePlaceholder: 'Please enter dictionary type',
+    dictLabel: 'Dictionary Label',
+    dictLabelPlaceholder: 'Please enter dictionary label',
+    createTime: 'Create Time',
+    startDate: 'Start Date',
+    endDate: 'End Date',
+    search: 'Search',
+    reset: 'Reset'
+  },
+  // Button Operations
+  button: {
+    add: 'Add',
+    edit: 'Edit',
+    delete: 'Delete',
+    export: 'Export',
+    refreshCache: 'Refresh Cache',
+    close: 'Close',
+    submit: 'Submit',
+    cancel: 'Cancel'
+  },
+  // Table Columns
+  table: {
+    dictId: 'Dictionary ID',
+    dictCode: 'Dictionary Code',
+    dictName: 'Dictionary Name',
+    dictType: 'Dictionary Type',
+    dictLabel: 'Dictionary Label',
+    dictValue: 'Dictionary Value',
+    dictSort: 'Dictionary Sort',
+    remark: 'Remark',
+    createTime: 'Create Time',
+    operation: 'Operation'
+  },
+  // Form
+  form: {
+    dictName: 'Dictionary Name',
+    dictNamePlaceholder: 'Please enter dictionary name',
+    dictType: 'Dictionary Type',
+    dictTypePlaceholder: 'Please enter dictionary type',
+    dictLabelZh: 'Chinese Label',
+    dictLabelZhPlaceholder: 'Please enter Chinese label',
+    dictLabelEn: 'English Label',
+    dictLabelEnPlaceholder: 'Please enter English label',
+    dictValue: 'Data Value',
+    dictValuePlaceholder: 'Please enter data value',
+    cssClass: 'CSS Class',
+    cssClassPlaceholder: 'Please enter CSS class',
+    dictSort: 'Display Sort',
+    listClass: 'List Class',
+    remark: 'Remark',
+    remarkPlaceholder: 'Please enter content'
+  },
+  // List Class Options
+  listClassOptions: {
+    default: 'Default',
+    primary: 'Primary',
+    success: 'Success',
+    info: 'Info',
+    warning: 'Warning',
+    danger: 'Danger'
+  },
+  // Dialog Titles
+  dialog: {
+    addType: 'Add Dictionary Type',
+    editType: 'Edit Dictionary Type',
+    addData: 'Add Dictionary Data',
+    editData: 'Edit Dictionary Data'
+  },
+  // Messages
+  message: {
+    deleteTypeConfirm: 'Are you sure you want to delete the dictionary with ID "{ids}"?',
+    deleteDataConfirm: 'Are you sure you want to delete the dictionary with label "{label}"?',
+    deleteSuccess: 'Delete successfully',
+    refreshSuccess: 'Refresh successfully',
+    operationSuccess: 'Operation successful'
+  },
+  // Tooltip
+  tooltip: {
+    edit: 'Edit',
+    delete: 'Delete'
+  },
+  // Validation Rules
+  rule: {
+    dictNameRequired: 'Dictionary name cannot be empty',
+    dictTypeRequired: 'Dictionary type cannot be empty',
+    dictLabelZhRequired: 'Chinese label cannot be empty',
+    dictLabelEnRequired: 'English label cannot be empty',
+    dictValueRequired: 'Data value cannot be empty',
+    dictSortRequired: 'Data sort cannot be empty'
+  }
+};

+ 98 - 0
src/lang/modules/system/dict/zh_CN.ts

@@ -0,0 +1,98 @@
+// 字典管理模块 - 中文翻译
+export default {
+  // 搜索表单
+  search: {
+    dictName: '字典名称',
+    dictNamePlaceholder: '请输入字典名称',
+    dictType: '字典类型',
+    dictTypePlaceholder: '请输入字典类型',
+    dictLabel: '字典标签',
+    dictLabelPlaceholder: '请输入字典标签',
+    createTime: '创建时间',
+    startDate: '开始日期',
+    endDate: '结束日期',
+    search: '搜索',
+    reset: '重置'
+  },
+  // 按钮操作
+  button: {
+    add: '新增',
+    edit: '修改',
+    delete: '删除',
+    export: '导出',
+    refreshCache: '刷新缓存',
+    close: '关闭',
+    submit: '确 定',
+    cancel: '取 消'
+  },
+  // 表格列
+  table: {
+    dictId: '字典编号',
+    dictCode: '字典编码',
+    dictName: '字典名称',
+    dictType: '字典类型',
+    dictLabel: '字典标签',
+    dictValue: '字典键值',
+    dictSort: '字典排序',
+    remark: '备注',
+    createTime: '创建时间',
+    operation: '操作'
+  },
+  // 表单
+  form: {
+    dictName: '字典名称',
+    dictNamePlaceholder: '请输入字典名称',
+    dictType: '字典类型',
+    dictTypePlaceholder: '请输入字典类型',
+    dictLabelZh: '中文标签',
+    dictLabelZhPlaceholder: '请输入中文标签',
+    dictLabelEn: '英文标签',
+    dictLabelEnPlaceholder: '请输入英文标签',
+    dictValue: '数据键值',
+    dictValuePlaceholder: '请输入数据键值',
+    cssClass: '样式属性',
+    cssClassPlaceholder: '请输入样式属性',
+    dictSort: '显示排序',
+    listClass: '回显样式',
+    remark: '备注',
+    remarkPlaceholder: '请输入内容'
+  },
+  // 回显样式选项
+  listClassOptions: {
+    default: '默认',
+    primary: '主要',
+    success: '成功',
+    info: '信息',
+    warning: '警告',
+    danger: '危险'
+  },
+  // 对话框标题
+  dialog: {
+    addType: '添加字典类型',
+    editType: '修改字典类型',
+    addData: '添加字典数据',
+    editData: '修改字典数据'
+  },
+  // 提示信息
+  message: {
+    deleteTypeConfirm: '是否确认删除字典编号为"{ids}"的数据项?',
+    deleteDataConfirm: '是否确认删除字典标签为"{label}"的数据项?',
+    deleteSuccess: '删除成功',
+    refreshSuccess: '刷新成功',
+    operationSuccess: '操作成功'
+  },
+  // Tooltip 提示
+  tooltip: {
+    edit: '修改',
+    delete: '删除'
+  },
+  // 验证规则
+  rule: {
+    dictNameRequired: '字典名称不能为空',
+    dictTypeRequired: '字典类型不能为空',
+    dictLabelZhRequired: '中文标签不能为空',
+    dictLabelEnRequired: '英文标签不能为空',
+    dictValueRequired: '数据键值不能为空',
+    dictSortRequired: '数据顺序不能为空'
+  }
+};

+ 3 - 1
src/lang/modules/system/index.ts

@@ -7,6 +7,7 @@ import tenant from './tenant/zh_CN';
 import tenantPackage from './tenantPackage/zh_CN';
 import menu from './menu/zh_CN';
 import profile from './profile/zh_CN';
+import dict from './dict/zh_CN';
 
 export default {
   user,
@@ -16,5 +17,6 @@ export default {
   tenant,
   tenantPackage,
   menu,
-  profile
+  profile,
+  dict
 };

+ 3 - 1
src/lang/modules/system/index_en.ts

@@ -7,6 +7,7 @@ import tenant from './tenant/en_US';
 import tenantPackage from './tenantPackage/en_US';
 import menu from './menu/en_US';
 import profile from './profile/en_US';
+import dict from './dict/en_US';
 
 export default {
   user,
@@ -16,5 +17,6 @@ export default {
   tenant,
   tenantPackage,
   menu,
-  profile
+  profile,
+  dict
 };

+ 2 - 1
src/views/monitor/logininfor/index.vue

@@ -12,7 +12,7 @@
             </el-form-item>
             <el-form-item label="状态" prop="status">
               <el-select v-model="queryParams.status" placeholder="登录状态" clearable>
-                <el-option v-for="dict in sys_common_status" :key="dict.value" :label="dict.label" :value="dict.value" />
+                <el-option v-for="dict in sys_common_status" :key="dict.value" :label="parseI18nName(dict.label)" :value="dict.value" />
               </el-select>
             </el-form-item>
             <el-form-item label="登录时间" style="width: 308px">
@@ -108,6 +108,7 @@
 <script setup name="Logininfor" lang="ts">
 import { list, delLoginInfo, cleanLoginInfo, unlockLoginInfo } from '@/api/monitor/loginInfo';
 import { LoginInfoQuery, LoginInfoVO } from '@/api/monitor/loginInfo/types';
+import { parseI18nName } from '@/utils/i18n';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { sys_device_type } = toRefs<any>(proxy?.useDict('sys_device_type'));

+ 3 - 2
src/views/monitor/operlog/index.vue

@@ -15,12 +15,12 @@
             </el-form-item>
             <el-form-item label="类型" prop="businessType">
               <el-select v-model="queryParams.businessType" placeholder="操作类型" clearable>
-                <el-option v-for="dict in sys_oper_type" :key="dict.value" :label="dict.label" :value="dict.value" />
+                <el-option v-for="dict in sys_oper_type" :key="dict.value" :label="parseI18nName(dict.label)" :value="dict.value" />
               </el-select>
             </el-form-item>
             <el-form-item label="状态" prop="status">
               <el-select v-model="queryParams.status" placeholder="操作状态" clearable>
-                <el-option v-for="dict in sys_common_status" :key="dict.value" :label="dict.label" :value="dict.value" />
+                <el-option v-for="dict in sys_common_status" :key="dict.value" :label="parseI18nName(dict.label)" :value="dict.value" />
               </el-select>
             </el-form-item>
             <el-form-item label="操作时间" style="width: 308px">
@@ -132,6 +132,7 @@
 import { list, delOperlog, cleanOperlog } from '@/api/monitor/operlog';
 import { OperLogForm, OperLogQuery, OperLogVO } from '@/api/monitor/operlog/types';
 import OperInfoDialog from './oper-info-dialog.vue';
+import { parseI18nName } from '@/utils/i18n';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { sys_oper_type, sys_common_status } = toRefs<any>(proxy?.useDict('sys_oper_type', 'sys_common_status'));

+ 5 - 4
src/views/system/client/index.vue

@@ -11,7 +11,7 @@
           </el-form-item>
           <el-form-item label="状态" prop="status">
             <el-select v-model="queryParams.status" placeholder="状态" clearable>
-              <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
+              <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="parseI18nName(dict.label)" :value="dict.value" />
             </el-select>
           </el-form-item>
           <el-form-item>
@@ -93,12 +93,12 @@
         </el-form-item>
         <el-form-item label="授权类型" prop="grantTypeList">
           <el-select v-model="form.grantTypeList" multiple placeholder="请输入授权类型">
-            <el-option v-for="dict in sys_grant_type" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
+            <el-option v-for="dict in sys_grant_type" :key="dict.value" :label="parseI18nName(dict.label)" :value="dict.value"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="设备类型" prop="deviceType">
           <el-select v-model="form.deviceType" placeholder="请输入设备类型">
-            <el-option v-for="dict in sys_device_type" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
+            <el-option v-for="dict in sys_device_type" :key="dict.value" :label="parseI18nName(dict.label)" :value="dict.value"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item prop="activeTimeout" label-width="auto">
@@ -126,7 +126,7 @@
         <el-form-item label="状态">
           <el-radio-group v-model="form.status">
             <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">
-              {{ dict.label }}
+              {{ parseI18nName(dict.label) }}
             </el-radio>
           </el-radio-group>
         </el-form-item>
@@ -144,6 +144,7 @@
 <script setup name="Client" lang="ts">
 import { listClient, getClient, delClient, addClient, updateClient, changeStatus } from '@/api/system/client';
 import { ClientVO, ClientQuery, ClientForm } from '@/api/system/client/types';
+import { parseI18nName } from '@/utils/i18n';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_normal_disable'));

+ 3 - 2
src/views/system/config/index.vue

@@ -12,7 +12,7 @@
             </el-form-item>
             <el-form-item label="系统内置" prop="configType">
               <el-select v-model="queryParams.configType" placeholder="系统内置" clearable>
-                <el-option v-for="dict in sys_yes_no" :key="dict.value" :label="dict.label" :value="dict.value" />
+                <el-option v-for="dict in sys_yes_no" :key="dict.value" :label="parseI18nName(dict.label)" :value="dict.value" />
               </el-select>
             </el-form-item>
             <el-form-item label="创建时间" style="width: 308px">
@@ -105,7 +105,7 @@
         </el-form-item>
         <el-form-item label="系统内置" prop="configType">
           <el-radio-group v-model="form.configType">
-            <el-radio v-for="dict in sys_yes_no" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+            <el-radio v-for="dict in sys_yes_no" :key="dict.value" :value="dict.value">{{ parseI18nName(dict.label) }}</el-radio>
           </el-radio-group>
         </el-form-item>
         <el-form-item label="备注" prop="remark">
@@ -125,6 +125,7 @@
 <script setup name="Config" lang="ts">
 import { listConfig, getConfig, delConfig, addConfig, updateConfig, refreshCache } from '@/api/system/config';
 import { ConfigForm, ConfigQuery, ConfigVO } from '@/api/system/config/types';
+import { parseI18nName } from '@/utils/i18n';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { sys_yes_no } = toRefs<any>(proxy?.useDict('sys_yes_no'));

+ 3 - 2
src/views/system/dept/index.vue

@@ -12,7 +12,7 @@
             </el-form-item>
             <el-form-item :label="t('dept.search.status')" prop="status">
               <el-select v-model="queryParams.status" :placeholder="t('dept.search.statusPlaceholder')" clearable>
-                <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
+                <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="parseI18nName(dict.label)" :value="dict.value" />
               </el-select>
             </el-form-item>
             <el-form-item>
@@ -125,7 +125,7 @@
           <el-col :span="12">
             <el-form-item :label="t('dept.form.status')">
               <el-radio-group v-model="form.status">
-                <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+                <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ parseI18nName(dict.label) }}</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
@@ -147,6 +147,7 @@ import { DeptForm, DeptQuery, DeptVO } from '@/api/system/dept/types';
 import { UserVO } from '@/api/system/user/types';
 import { listUserByDeptId } from '@/api/system/user';
 import { useI18n } from 'vue-i18n';
+import { parseI18nName } from '@/utils/i18n';
 
 interface DeptOptionsType {
   deptId: number | string;

+ 53 - 51
src/views/system/dict/data.vue

@@ -3,18 +3,18 @@
     <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
-          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
-            <el-form-item label="字典名称" prop="dictType">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="140px">
+            <el-form-item :label="t('dict.search.dictType')" prop="dictType">
               <el-select v-model="queryParams.dictType">
                 <el-option v-for="item in typeOptions" :key="item.dictId" :label="item.dictName" :value="item.dictType" />
               </el-select>
             </el-form-item>
-            <el-form-item label="字典标签" prop="dictLabel">
-              <el-input v-model="queryParams.dictLabel" placeholder="请输入字典标签" clearable @keyup.enter="handleQuery" />
+            <el-form-item :label="t('dict.search.dictLabel')" prop="dictLabel">
+              <el-input v-model="queryParams.dictLabel" :placeholder="t('dict.search.dictLabelPlaceholder')" clearable @keyup.enter="handleQuery" />
             </el-form-item>
             <el-form-item>
-              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
-              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+              <el-button type="primary" icon="Search" @click="handleQuery">{{ t('dict.search.search') }}</el-button>
+              <el-button icon="Refresh" @click="resetQuery">{{ t('dict.search.reset') }}</el-button>
             </el-form-item>
           </el-form>
         </el-card>
@@ -24,21 +24,21 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:dict:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
+            <el-button v-hasPermi="['system:dict:add']" type="primary" plain icon="Plus" @click="handleAdd">{{ t('dict.button.add') }}</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:dict:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()">修改</el-button>
+            <el-button v-hasPermi="['system:dict:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()">{{ t('dict.button.edit') }}</el-button>
           </el-col>
           <el-col :span="1.5">
             <el-button v-hasPermi="['system:dict:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()">
-              删除
+              {{ t('dict.button.delete') }}
             </el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:dict:export']" type="warning" plain icon="Download" @click="handleExport">导出</el-button>
+            <el-button v-hasPermi="['system:dict:export']" type="warning" plain icon="Download" @click="handleExport">{{ t('dict.button.export') }}</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button type="warning" plain icon="Close" @click="handleClose">关闭</el-button>
+            <el-button type="warning" plain icon="Close" @click="handleClose">{{ t('dict.button.close') }}</el-button>
           </el-col>
           <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
         </el-row>
@@ -46,8 +46,8 @@
 
       <el-table v-loading="loading" border :data="dataList" @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55" align="center" />
-        <el-table-column v-if="false" label="字典编码" align="center" prop="dictCode" />
-        <el-table-column label="字典标签" align="center" prop="dictLabel">
+        <el-table-column v-if="false" :label="t('dict.table.dictCode')" align="center" prop="dictCode" />
+        <el-table-column :label="t('dict.table.dictLabel')" align="center" prop="dictLabel">
           <template #default="scope">
             <span
               v-if="(scope.row.listClass === '' || scope.row.listClass === 'default') && (scope.row.cssClass === '' || scope.row.cssClass == null)"
@@ -61,20 +61,20 @@
             >
           </template>
         </el-table-column>
-        <el-table-column label="字典键值" align="center" prop="dictValue" />
-        <el-table-column label="字典排序" align="center" prop="dictSort" />
-        <el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" />
-        <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+        <el-table-column :label="t('dict.table.dictValue')" align="center" prop="dictValue" />
+        <el-table-column :label="t('dict.table.dictSort')" align="center" prop="dictSort" />
+        <el-table-column :label="t('dict.table.remark')" align="center" prop="remark" :show-overflow-tooltip="true" />
+        <el-table-column :label="t('dict.table.createTime')" align="center" prop="createTime" width="180">
           <template #default="scope">
             <span>{{ proxy.parseTime(scope.row.createTime) }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width">
+        <el-table-column :label="t('dict.table.operation')" align="center" width="160" class-name="small-padding fixed-width">
           <template #default="scope">
-            <el-tooltip content="修改" placement="top">
+            <el-tooltip :content="t('dict.tooltip.edit')" placement="top">
               <el-button v-hasPermi="['system:dict:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
             </el-tooltip>
-            <el-tooltip content="删除" placement="top">
+            <el-tooltip :content="t('dict.tooltip.delete')" placement="top">
               <el-button v-hasPermi="['system:dict:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
             </el-tooltip>
           </template>
@@ -86,25 +86,25 @@
     <!-- 添加或修改参数配置对话框 -->
     <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body>
       <el-form ref="dataFormRef" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="字典类型">
+        <el-form-item :label="t('dict.form.dictType')">
           <el-input v-model="form.dictType" :disabled="true" />
         </el-form-item>
-        <el-form-item label="中文标签" prop="dictLabelZh">
-          <el-input v-model="form.dictLabelZh" placeholder="请输入中文标签" />
+        <el-form-item :label="t('dict.form.dictLabelZh')" prop="dictLabelZh">
+          <el-input v-model="form.dictLabelZh" :placeholder="t('dict.form.dictLabelZhPlaceholder')" />
         </el-form-item>
-        <el-form-item label="英文标签" prop="dictLabelEn">
-          <el-input v-model="form.dictLabelEn" placeholder="请输入英文标签" />
+        <el-form-item :label="t('dict.form.dictLabelEn')" prop="dictLabelEn">
+          <el-input v-model="form.dictLabelEn" :placeholder="t('dict.form.dictLabelEnPlaceholder')" />
         </el-form-item>
-        <el-form-item label="数据键值" prop="dictValue">
-          <el-input v-model="form.dictValue" placeholder="请输入数据键值" />
+        <el-form-item :label="t('dict.form.dictValue')" prop="dictValue">
+          <el-input v-model="form.dictValue" :placeholder="t('dict.form.dictValuePlaceholder')" />
         </el-form-item>
-        <el-form-item label="样式属性" prop="cssClass">
-          <el-input v-model="form.cssClass" placeholder="请输入样式属性" />
+        <el-form-item :label="t('dict.form.cssClass')" prop="cssClass">
+          <el-input v-model="form.cssClass" :placeholder="t('dict.form.cssClassPlaceholder')" />
         </el-form-item>
-        <el-form-item label="显示排序" prop="dictSort">
+        <el-form-item :label="t('dict.form.dictSort')" prop="dictSort">
           <el-input-number v-model="form.dictSort" controls-position="right" :min="0" />
         </el-form-item>
-        <el-form-item label="回显样式" prop="listClass">
+        <el-form-item :label="t('dict.form.listClass')" prop="listClass">
           <el-select v-model="form.listClass">
             <el-option
               v-for="item in listClassOptions"
@@ -114,14 +114,14 @@
             ></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="备注" prop="remark">
-          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
+        <el-form-item :label="t('dict.form.remark')" prop="remark">
+          <el-input v-model="form.remark" type="textarea" :placeholder="t('dict.form.remarkPlaceholder')"></el-input>
         </el-form-item>
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
+          <el-button type="primary" @click="submitForm">{{ t('dict.button.submit') }}</el-button>
+          <el-button @click="cancel">{{ t('dict.button.cancel') }}</el-button>
         </div>
       </template>
     </el-dialog>
@@ -136,9 +136,11 @@ import { DictTypeVO } from '@/api/system/dict/type/types';
 import { DictDataForm, DictDataQuery, DictDataVO } from '@/api/system/dict/data/types';
 import { RouteLocationNormalized } from 'vue-router';
 import { parseI18nName } from '@/utils/i18n';
+import { useI18n } from 'vue-i18n';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const route = useRoute();
+const { t } = useI18n();
 
 const dataList = ref<DictDataVO[]>([]);
 const loading = ref(true);
@@ -159,13 +161,13 @@ const dialog = reactive<DialogOption>({
 });
 
 // 数据标签回显样式
-const listClassOptions = ref<Array<{ value: string; label: string }>>([
-  { value: 'default', label: '默认' },
-  { value: 'primary', label: '主要' },
-  { value: 'success', label: '成功' },
-  { value: 'info', label: '信息' },
-  { value: 'warning', label: '警告' },
-  { value: 'danger', label: '危险' }
+const listClassOptions = computed(() => [
+  { value: 'default', label: t('dict.listClassOptions.default') },
+  { value: 'primary', label: t('dict.listClassOptions.primary') },
+  { value: 'success', label: t('dict.listClassOptions.success') },
+  { value: 'info', label: t('dict.listClassOptions.info') },
+  { value: 'warning', label: t('dict.listClassOptions.warning') },
+  { value: 'danger', label: t('dict.listClassOptions.danger') }
 ]);
 
 const initFormData: DictDataForm = {
@@ -189,10 +191,10 @@ const data = reactive<PageData<DictDataForm, DictDataQuery>>({
     dictLabel: ''
   },
   rules: {
-    dictLabelZh: [{ required: true, message: '中文标签不能为空', trigger: 'blur' }],
-    dictLabelEn: [{ required: true, message: '英文标签不能为空', trigger: 'blur' }],
-    dictValue: [{ required: true, message: '数据键值不能为空', trigger: 'blur' }],
-    dictSort: [{ required: true, message: '数据顺序不能为空', trigger: 'blur' }]
+    dictLabelZh: [{ required: true, message: t('dict.rule.dictLabelZhRequired'), trigger: 'blur' }],
+    dictLabelEn: [{ required: true, message: t('dict.rule.dictLabelEnRequired'), trigger: 'blur' }],
+    dictValue: [{ required: true, message: t('dict.rule.dictValueRequired'), trigger: 'blur' }],
+    dictSort: [{ required: true, message: t('dict.rule.dictSortRequired'), trigger: 'blur' }]
   }
 });
 
@@ -260,7 +262,7 @@ const handleAdd = () => {
   reset();
   form.value.dictType = queryParams.value.dictType;
   dialog.visible = true;
-  dialog.title = '添加字典数据';
+  dialog.title = t('dict.dialog.addData');
 };
 /** 多选框选中数据 */
 const handleSelectionChange = (selection: DictDataVO[]) => {
@@ -277,7 +279,7 @@ const handleUpdate = async (row?: DictDataVO) => {
   // 解析国际化标签
   parseDictLabelForEdit(res.data.dictLabel);
   dialog.visible = true;
-  dialog.title = '修改字典数据';
+  dialog.title = t('dict.dialog.editData');
 };
 /** 提交按钮 */
 const submitForm = () => {
@@ -291,7 +293,7 @@ const submitForm = () => {
       const submitData = { ...form.value, dictLabel: dictLabelJson };
       form.value.dictCode ? await updateData(submitData) : await addData(submitData);
       useDictStore().removeDict(queryParams.value.dictType);
-      proxy?.$modal.msgSuccess('操作成功');
+      proxy?.$modal.msgSuccess(t('dict.message.operationSuccess'));
       dialog.visible = false;
       await getList();
     }
@@ -301,10 +303,10 @@ const submitForm = () => {
 const handleDelete = async (row?: DictDataVO) => {
   const dictCodes = row?.dictCode || ids.value;
   const labelText = row ? parseI18nName(row.dictLabel) : dictCodes;
-  await proxy?.$modal.confirm('是否确认删除字典标签为"' + labelText + '"的数据项?');
+  await proxy?.$modal.confirm(t('dict.message.deleteDataConfirm', { label: labelText }));
   await delData(dictCodes);
   await getList();
-  proxy?.$modal.msgSuccess('删除成功');
+  proxy?.$modal.msgSuccess(t('dict.message.deleteSuccess'));
   useDictStore().removeDict(queryParams.value.dictType);
 };
 /** 导出按钮操作 */

+ 41 - 39
src/views/system/dict/index.vue

@@ -3,27 +3,27 @@
     <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
-          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
-            <el-form-item label="字典名称" prop="dictName">
-              <el-input v-model="queryParams.dictName" placeholder="请输入字典名称" clearable @keyup.enter="handleQuery" />
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="140px">
+            <el-form-item :label="t('dict.search.dictName')" prop="dictName">
+              <el-input v-model="queryParams.dictName" :placeholder="t('dict.search.dictNamePlaceholder')" clearable @keyup.enter="handleQuery" />
             </el-form-item>
-            <el-form-item label="字典类型" prop="dictType">
-              <el-input v-model="queryParams.dictType" placeholder="请输入字典类型" clearable @keyup.enter="handleQuery" />
+            <el-form-item :label="t('dict.search.dictType')" prop="dictType">
+              <el-input v-model="queryParams.dictType" :placeholder="t('dict.search.dictTypePlaceholder')" clearable @keyup.enter="handleQuery" />
             </el-form-item>
-            <el-form-item label="创建时间" style="width: 308px">
+            <el-form-item :label="t('dict.search.createTime')" style="width: 308px">
               <el-date-picker
                 v-model="dateRange"
                 value-format="YYYY-MM-DD HH:mm:ss"
                 type="daterange"
                 range-separator="-"
-                start-placeholder="开始日期"
-                end-placeholder="结束日期"
+                :start-placeholder="t('dict.search.startDate')"
+                :end-placeholder="t('dict.search.endDate')"
                 :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
               ></el-date-picker>
             </el-form-item>
             <el-form-item>
-              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
-              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+              <el-button type="primary" icon="Search" @click="handleQuery">{{ t('dict.search.search') }}</el-button>
+              <el-button icon="Refresh" @click="resetQuery">{{ t('dict.search.reset') }}</el-button>
             </el-form-item>
           </el-form>
         </el-card>
@@ -33,21 +33,21 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:dict:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
+            <el-button v-hasPermi="['system:dict:add']" type="primary" plain icon="Plus" @click="handleAdd">{{ t('dict.button.add') }}</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:dict:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()">修改</el-button>
+            <el-button v-hasPermi="['system:dict:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()">{{ t('dict.button.edit') }}</el-button>
           </el-col>
           <el-col :span="1.5">
             <el-button v-hasPermi="['system:dict:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()">
-              删除
+              {{ t('dict.button.delete') }}
             </el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:dict:export']" type="warning" plain icon="Download" @click="handleExport">导出</el-button>
+            <el-button v-hasPermi="['system:dict:export']" type="warning" plain icon="Download" @click="handleExport">{{ t('dict.button.export') }}</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:dict:remove']" type="danger" plain icon="Refresh" @click="handleRefreshCache">刷新缓存</el-button>
+            <el-button v-hasPermi="['system:dict:remove']" type="danger" plain icon="Refresh" @click="handleRefreshCache">{{ t('dict.button.refreshCache') }}</el-button>
           </el-col>
           <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
         </el-row>
@@ -55,27 +55,27 @@
 
       <el-table v-loading="loading" border :data="typeList" @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55" align="center" />
-        <el-table-column v-if="false" label="字典编号" align="center" prop="dictId" />
-        <el-table-column label="字典名称" align="center" prop="dictName" :show-overflow-tooltip="true" />
-        <el-table-column label="字典类型" align="center" :show-overflow-tooltip="true">
+        <el-table-column v-if="false" :label="t('dict.table.dictId')" align="center" prop="dictId" />
+        <el-table-column :label="t('dict.table.dictName')" align="center" prop="dictName" :show-overflow-tooltip="true" />
+        <el-table-column :label="t('dict.table.dictType')" align="center" :show-overflow-tooltip="true">
           <template #default="scope">
             <router-link :to="'/system/dict-data/index/' + scope.row.dictId" class="link-type">
               <span>{{ scope.row.dictType }}</span>
             </router-link>
           </template>
         </el-table-column>
-        <el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" />
-        <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+        <el-table-column :label="t('dict.table.remark')" align="center" prop="remark" :show-overflow-tooltip="true" />
+        <el-table-column :label="t('dict.table.createTime')" align="center" prop="createTime" width="180">
           <template #default="scope">
             <span>{{ proxy.parseTime(scope.row.createTime) }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width">
+        <el-table-column :label="t('dict.table.operation')" align="center" width="160" class-name="small-padding fixed-width">
           <template #default="scope">
-            <el-tooltip content="修改" placement="top">
+            <el-tooltip :content="t('dict.tooltip.edit')" placement="top">
               <el-button v-hasPermi="['system:dict:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
             </el-tooltip>
-            <el-tooltip content="删除" placement="top">
+            <el-tooltip :content="t('dict.tooltip.delete')" placement="top">
               <el-button v-hasPermi="['system:dict:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
             </el-tooltip>
           </template>
@@ -87,20 +87,20 @@
     <!-- 添加或修改参数配置对话框 -->
     <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body>
       <el-form ref="dictFormRef" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="字典名称" prop="dictName">
-          <el-input v-model="form.dictName" placeholder="请输入字典名称" />
+        <el-form-item :label="t('dict.form.dictName')" prop="dictName">
+          <el-input v-model="form.dictName" :placeholder="t('dict.form.dictNamePlaceholder')" />
         </el-form-item>
-        <el-form-item label="字典类型" prop="dictType">
-          <el-input v-model="form.dictType" placeholder="请输入字典类型" />
+        <el-form-item :label="t('dict.form.dictType')" prop="dictType">
+          <el-input v-model="form.dictType" :placeholder="t('dict.form.dictTypePlaceholder')" />
         </el-form-item>
-        <el-form-item label="备注" prop="remark">
-          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
+        <el-form-item :label="t('dict.form.remark')" prop="remark">
+          <el-input v-model="form.remark" type="textarea" :placeholder="t('dict.form.remarkPlaceholder')"></el-input>
         </el-form-item>
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
+          <el-button type="primary" @click="submitForm">{{ t('dict.button.submit') }}</el-button>
+          <el-button @click="cancel">{{ t('dict.button.cancel') }}</el-button>
         </div>
       </template>
     </el-dialog>
@@ -111,8 +111,10 @@
 import { useDictStore } from '@/store/modules/dict';
 import { listType, getType, delType, addType, updateType, refreshCache } from '@/api/system/dict/type';
 import { DictTypeForm, DictTypeQuery, DictTypeVO } from '@/api/system/dict/type/types';
+import { useI18n } from 'vue-i18n';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { t } = useI18n();
 
 const typeList = ref<DictTypeVO[]>([]);
 const loading = ref(true);
@@ -146,8 +148,8 @@ const data = reactive<PageData<DictTypeForm, DictTypeQuery>>({
     dictType: ''
   },
   rules: {
-    dictName: [{ required: true, message: '字典名称不能为空', trigger: 'blur' }],
-    dictType: [{ required: true, message: '字典类型不能为空', trigger: 'blur' }]
+    dictName: [{ required: true, message: t('dict.rule.dictNameRequired'), trigger: 'blur' }],
+    dictType: [{ required: true, message: t('dict.rule.dictTypeRequired'), trigger: 'blur' }]
   }
 });
 
@@ -187,7 +189,7 @@ const resetQuery = () => {
 const handleAdd = () => {
   reset();
   dialog.visible = true;
-  dialog.title = '添加字典类型';
+  dialog.title = t('dict.dialog.addType');
 };
 /** 多选框选中数据 */
 const handleSelectionChange = (selection: DictTypeVO[]) => {
@@ -202,14 +204,14 @@ const handleUpdate = async (row?: DictTypeVO) => {
   const res = await getType(dictId);
   Object.assign(form.value, res.data);
   dialog.visible = true;
-  dialog.title = '修改字典类型';
+  dialog.title = t('dict.dialog.editType');
 };
 /** 提交按钮 */
 const submitForm = () => {
   dictFormRef.value?.validate(async (valid: boolean) => {
     if (valid) {
       form.value.dictId ? await updateType(form.value) : await addType(form.value);
-      proxy?.$modal.msgSuccess('操作成功');
+      proxy?.$modal.msgSuccess(t('dict.message.operationSuccess'));
       dialog.visible = false;
       getList();
     }
@@ -218,10 +220,10 @@ const submitForm = () => {
 /** 删除按钮操作 */
 const handleDelete = async (row?: DictTypeVO) => {
   const dictIds = row?.dictId || ids.value;
-  await proxy?.$modal.confirm('是否确认删除字典编号为"' + dictIds + '"的数据项?');
+  await proxy?.$modal.confirm(t('dict.message.deleteTypeConfirm', { ids: dictIds }));
   await delType(dictIds);
   getList();
-  proxy?.$modal.msgSuccess('删除成功');
+  proxy?.$modal.msgSuccess(t('dict.message.deleteSuccess'));
 };
 /** 导出按钮操作 */
 const handleExport = () => {
@@ -236,7 +238,7 @@ const handleExport = () => {
 /** 刷新缓存按钮操作 */
 const handleRefreshCache = async () => {
   await refreshCache();
-  proxy?.$modal.msgSuccess('刷新成功');
+  proxy?.$modal.msgSuccess(t('dict.message.refreshSuccess'));
   useDictStore().cleanDict();
 };
 

+ 4 - 3
src/views/system/notice/index.vue

@@ -12,7 +12,7 @@
             </el-form-item>
             <el-form-item label="类型" prop="noticeType">
               <el-select v-model="queryParams.noticeType" placeholder="公告类型" clearable>
-                <el-option v-for="dict in sys_notice_type" :key="dict.value" :label="dict.label" :value="dict.value" />
+                <el-option v-for="dict in sys_notice_type" :key="dict.value" :label="parseI18nName(dict.label)" :value="dict.value" />
               </el-select>
             </el-form-item>
             <el-form-item>
@@ -90,14 +90,14 @@
           <el-col :span="12">
             <el-form-item label="公告类型" prop="noticeType">
               <el-select v-model="form.noticeType" placeholder="请选择">
-                <el-option v-for="dict in sys_notice_type" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
+                <el-option v-for="dict in sys_notice_type" :key="dict.value" :label="parseI18nName(dict.label)" :value="dict.value"></el-option>
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="24">
             <el-form-item label="状态">
               <el-radio-group v-model="form.status">
-                <el-radio v-for="dict in sys_notice_status" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+                <el-radio v-for="dict in sys_notice_status" :key="dict.value" :value="dict.value">{{ parseI18nName(dict.label) }}</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
@@ -121,6 +121,7 @@
 <script setup name="Notice" lang="ts">
 import { listNotice, getNotice, delNotice, addNotice, updateNotice } from '@/api/system/notice';
 import { NoticeForm, NoticeQuery, NoticeVO } from '@/api/system/notice/types';
+import { parseI18nName } from '@/utils/i18n';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { sys_notice_status, sys_notice_type } = toRefs<any>(proxy?.useDict('sys_notice_status', 'sys_notice_type'));

+ 2 - 1
src/views/system/oss/config.vue

@@ -114,7 +114,7 @@
         </el-form-item>
         <el-form-item label="是否HTTPS">
           <el-radio-group v-model="form.isHttps">
-            <el-radio v-for="dict in sys_yes_no" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+            <el-radio v-for="dict in sys_yes_no" :key="dict.value" :value="dict.value">{{ parseI18nName(dict.label) }}</el-radio>
           </el-radio-group>
         </el-form-item>
         <el-form-item label="桶权限类型">
@@ -144,6 +144,7 @@
 <script setup name="OssConfig" lang="ts">
 import { listOssConfig, getOssConfig, delOssConfig, addOssConfig, updateOssConfig, changeOssConfigStatus } from '@/api/system/ossConfig';
 import { OssConfigForm, OssConfigQuery, OssConfigVO } from '@/api/system/ossConfig/types';
+import { parseI18nName } from '@/utils/i18n';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { sys_yes_no } = toRefs<any>(proxy?.useDict('sys_yes_no'));

+ 3 - 2
src/views/system/post/index.vue

@@ -51,7 +51,7 @@
                 </el-form-item>
                 <el-form-item :label="t('post.search.status')" prop="status">
                   <el-select v-model="queryParams.status" :placeholder="t('post.search.statusPlaceholder')" clearable>
-                    <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
+                    <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="parseI18nName(dict.label)" :value="dict.value" />
                   </el-select>
                 </el-form-item>
                 <el-form-item>
@@ -150,7 +150,7 @@
             </el-form-item>
             <el-form-item :label="t('post.form.status')" prop="status">
               <el-radio-group v-model="form.status">
-                <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+                <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ parseI18nName(dict.label) }}</el-radio>
               </el-radio-group>
             </el-form-item>
             <el-form-item :label="t('post.form.remark')" prop="remark">
@@ -174,6 +174,7 @@ import { listPost, addPost, delPost, getPost, updatePost, deptTreeSelect } from
 import { PostForm, PostQuery, PostVO } from '@/api/system/post/types';
 import { DeptTreeVO, DeptVO } from '@/api/system/dept/types';
 import { useI18n } from 'vue-i18n';
+import { parseI18nName } from '@/utils/i18n';
 
 const { t } = useI18n();
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;

+ 2 - 2
src/views/system/role/index.vue

@@ -12,7 +12,7 @@
             </el-form-item>
             <el-form-item :label="t('role.search.status')" prop="status">
               <el-select v-model="queryParams.status" :placeholder="t('role.search.statusPlaceholder')" clearable>
-                <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
+                <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="parseI18nName(dict.label)" :value="dict.value" />
               </el-select>
             </el-form-item>
             <el-form-item :label="t('role.search.createTime')" style="width: 308px">
@@ -120,7 +120,7 @@
         </el-form-item>
         <el-form-item :label="t('role.form.status')">
           <el-radio-group v-model="form.status">
-            <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+            <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ parseI18nName(dict.label) }}</el-radio>
           </el-radio-group>
         </el-form-item>
         <el-form-item :label="t('role.form.menuPermission')">

+ 4 - 3
src/views/system/user/index.vue

@@ -36,7 +36,7 @@
 
                 <el-form-item :label="t('user.search.status')" prop="status">
                   <el-select v-model="queryParams.status" :placeholder="t('user.search.statusPlaceholder')" clearable>
-                    <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
+                    <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="parseI18nName(dict.label)" :value="dict.value" />
                   </el-select>
                 </el-form-item>
                 <el-form-item :label="t('user.search.createTime')" style="width: 308px">
@@ -196,14 +196,14 @@
           <el-col :span="12">
             <el-form-item :label="t('user.form.sex')">
               <el-select v-model="form.sex" :placeholder="t('user.form.selectPlaceholder')">
-                <el-option v-for="dict in sys_user_sex" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
+                <el-option v-for="dict in sys_user_sex" :key="dict.value" :label="parseI18nName(dict.label)" :value="dict.value"></el-option>
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item :label="t('user.form.status')">
               <el-radio-group v-model="form.status">
-                <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+                <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ parseI18nName(dict.label) }}</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
@@ -300,6 +300,7 @@ import { optionselect } from '@/api/system/post';
 import { checkPermi } from '@/utils/permission';
 import { useUserStore } from '@/store/modules/user';
 import { useI18n } from 'vue-i18n';
+import { parseI18nName } from '@/utils/i18n';
 
 const router = useRouter();
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;

+ 2 - 1
src/views/workflow/spel/index.vue

@@ -130,7 +130,7 @@
         <el-form-item label="状态" prop="status">
           <el-radio-group v-model="form.status">
             <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">
-              {{ dict.label }}
+              {{ parseI18nName(dict.label) }}
             </el-radio>
           </el-radio-group>
         </el-form-item>
@@ -151,6 +151,7 @@
 <script setup name="Spel" lang="ts">
 import { listSpel, getSpel, delSpel, addSpel, updateSpel } from '@/api/workflow/spel';
 import { SpelVO, SpelQuery, SpelForm } from '@/api/workflow/spel/types';
+import { parseI18nName } from '@/utils/i18n';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { sys_show_hide, sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_show_hide', 'sys_normal_disable'));