瀏覽代碼

feat: 规则引擎支持多语言

vera_min 1 月之前
父節點
當前提交
7555b404dc

+ 5 - 2
src/i18n/pages/formI18n/en.ts

@@ -2,7 +2,7 @@
  * @Author: vera_min vera_min@163.com
  * @Date: 2025-08-28 16:18:16
  * @LastEditors: vera_min vera_min@163.com
- * @LastEditTime: 2025-08-30 12:49:26
+ * @LastEditTime: 2025-08-30 20:11:51
  * @FilePath: /sagoo-admin-ui-dev/src/i18n/pages/formI18n/en.ts
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -18,7 +18,10 @@ export default {
 		sort: "Sort",
 		parentCategory: "Parent Category",
 		categoryKey: "Category Key",
-		desc: "Description"
+		desc: "Description",
+		name1: "Name",
+		type: "Type",
+		status: "Status",
 	},
 	formI18nPlaceholder: {
 		name: 'Please enter your name',

+ 5 - 2
src/i18n/pages/formI18n/zh-cn.ts

@@ -2,7 +2,7 @@
  * @Author: vera_min vera_min@163.com
  * @Date: 2025-08-02 12:21:54
  * @LastEditors: vera_min vera_min@163.com
- * @LastEditTime: 2025-08-06 18:04:35
+ * @LastEditTime: 2025-08-30 19:51:43
  * @FilePath: /sagoo-admin-ui/src/i18n/pages/formI18n/zh-cn.ts
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -18,7 +18,10 @@ export default {
 		sort: "排序",
 		parentCategory: "上级分类",
 		categoryKey: "分类标识",
-		desc: "描述"
+		desc: "描述",
+		name1: "名称",
+		type: "类型",
+		status: "状态",
 	},
 	formI18nPlaceholder: {
 		name: '请输入姓名',

+ 5 - 2
src/i18n/pages/formI18n/zh-tw.ts

@@ -2,7 +2,7 @@
  * @Author: vera_min vera_min@163.com
  * @Date: 2025-08-02 12:21:54
  * @LastEditors: vera_min vera_min@163.com
- * @LastEditTime: 2025-08-06 18:05:10
+ * @LastEditTime: 2025-08-30 20:12:24
  * @FilePath: /sagoo-admin-ui/src/i18n/pages/formI18n/zh-tw.ts
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -18,7 +18,10 @@ export default {
 		sort: "排序",
 		parentCategory: "上級分類",
 		categoryKey: "分類標識",
-		desc: "描述"
+		desc: "描述",
+		name1: "名稱",
+		type: "類型",
+		status: "狀態",
 	},
 	formI18nPlaceholder: {
 		name: '請輸入姓名',

+ 25 - 1
src/i18n/pages/iotmanagerI18n/en.ts

@@ -2,7 +2,7 @@
  * @Author: vera_min vera_min@163.com
  * @Date: 2025-08-05 12:42:31
  * @LastEditors: vera_min vera_min@163.com
- * @LastEditTime: 2025-08-30 13:38:20
+ * @LastEditTime: 2025-08-30 20:14:28
  * @FilePath: /sagoo-admin-ui/src/i18n/pages/iotmanagerI18n/en.ts
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -403,5 +403,29 @@ export default {
 			defaultCategory: "Default Category",
 			deleteScreenMessage: "This operation will permanently delete the screen: {name}, continue?"
 		}
+	},
+	// 规则引擎
+	ruleEngine: {
+		keywordPlaceholder: "Enter keyword",
+		typePlaceholder: "Select type",
+		statusPlaceholder: "Select status",
+		mainChain: "Main chain",
+		subChain: "Sub chain",
+		all: "All",
+		started: "Started",
+		stopped: "Stopped",
+		addRule: "Add rule",
+		editRule: "Edit rule",
+		stop: "Stop",
+		start: "Start",
+		ruleEdit: "Rule edit",
+		ruleNotExist: "Rule does not exist",
+		deleteRuleMessage: "This operation will permanently delete the rule: {name}, continue?",
+		debugMode: "Debug mode",
+		closeSubChain: "Close: To create a sub chain",
+		namePlaceholder: "Enter name",
+		tip1: "After opening, it will cover the debug mode configuration of the node, and all nodes will print debug logs",
+		description: "Description",
+		nameValidator: "Rule name cannot be empty"
 	}
 };

+ 29 - 5
src/i18n/pages/iotmanagerI18n/zh-cn.ts

@@ -2,7 +2,7 @@
  * @Author: vera_min vera_min@163.com
  * @Date: 2025-08-05 12:42:31
  * @LastEditors: vera_min vera_min@163.com
- * @LastEditTime: 2025-08-30 13:38:05
+ * @LastEditTime: 2025-08-30 20:15:06
  * @FilePath: /sagoo-admin-ui/src/i18n/pages/iotmanagerI18n/zh-cn.ts
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -113,7 +113,7 @@ export default {
 			editFunctionDefinition: "修改功能定义",
 			addFunctionDefinition: "新增功能定义",
 			editOption: "编辑参数",
-			addOption: "新增参数",	
+			addOption: "新增参数",
 			editEventDefinition: "编辑事件定义",
 			addEventDefinition: "新增事件定义",
 			editTagDefinition: "编辑标签定义",
@@ -238,7 +238,7 @@ export default {
 			functionDescription: "请输入功能定义描述",
 			parameterIdentifier: "请输入参数标识",
 			parameterName: "请输入参数名称",
-			parameterDescription: "请输入参数描述", 
+			parameterDescription: "请输入参数描述",
 			eventKey: "请输入事件定义标识",
 			eventName: "请输入事件定义名称",
 			eventDescription: "请输入事件定义描述",
@@ -307,7 +307,7 @@ export default {
 			parameterKey: "参数标识不能为空",
 			eventName: "事件定义名称不能为空",
 			eventNameMax32: "事件定义名称不能超过32个字符",
-			eventNameValidator: "事件定义名称不能包含空格", 
+			eventNameValidator: "事件定义名称不能包含空格",
 			eventKey: "事件定义标识不能为空",
 			eventType: "请选择数据类型",
 			tagKeyName: "标签定义名称不能为空",
@@ -403,5 +403,29 @@ export default {
 			defaultCategory: "默认分类",
 			deleteScreenMessage: "此操作将永久删除大屏:{name}, 是否继续?"
 		}
+	},
+	// 规则引擎
+	ruleEngine: {
+		keywordPlaceholder: "请输入关键字",
+		typePlaceholder: "请选择类型",
+		statusPlaceholder: "请选择状态",
+		mainChain: "主链",
+		subChain: "子链",
+		all: "全部",
+		started: "已启动",
+		stopped: "已停止",
+		addRule: "新增规则编排",
+		editRule: "编辑规则编排",
+		stop: "停止",
+		start: "启动",
+		ruleEdit: "规则编辑",
+		ruleNotExist: "规则不存在",
+		deleteRuleMessage: "此操作将永久删除规则:{name}, 是否继续?",
+		debugMode: "调试模式",
+		closeSubChain: "关闭:为创建子链",
+		namePlaceholder: "输入名称",
+		tip1: "开启后会覆盖节点的调试模式配置,所有节点会打印调试日志",
+		description: "说明",
+		nameValidator: "规则名称不能为空"
 	}
-};
+}

+ 24 - 0
src/i18n/pages/iotmanagerI18n/zh-tw.ts

@@ -403,5 +403,29 @@ export default {
 			defaultCategory: "默認分類",
 			deleteScreenMessage: "此操作將永久刪除大屏:{name}, 是否繼續?"
 		}
+	},
+	// 規則引擎
+	ruleEngine: {
+		keywordPlaceholder: "請輸入關鍵字",
+		typePlaceholder: "請選擇類型",
+		statusPlaceholder: "請選擇狀態",
+		mainChain: "主鏈",
+		subChain: "子鏈",
+		all: "全部",
+		started: "已啟動",
+		stopped: "已停止",
+		addRule: "新增規則編排",
+		editRule: "編輯規則編排",
+		stop: "停止",
+		start: "啟動",
+		ruleEdit: "規則編輯",
+		ruleNotExist: "規則不存在",
+		deleteRuleMessage: "此操作將永久刪除規則:{name}, 是否繼續?",
+		debugMode: "調試模式",
+		closeSubChain: "關閉:為創建子鏈",
+		namePlaceholder: "輸入名稱",
+		tip1: "開啟後會覆蓋節點的調試模式配置,所有節點會打印調試日誌",
+		description: "說明",
+		nameValidator: "規則名稱不能為空"
 	}
 };

+ 4 - 3
src/i18n/pages/tableI18n/zh-cn.ts

@@ -2,7 +2,7 @@
  * @Author: vera_min vera_min@163.com
  * @Date: 2025-08-06 01:16:57
  * @LastEditors: vera_min vera_min@163.com
- * @LastEditTime: 2025-08-30 13:29:37
+ * @LastEditTime: 2025-08-30 20:01:55
  * @FilePath: /sagoo-admin-ui/src/i18n/pages/tableI18n/zh-cn.ts
  * @Description: 表格国际化 - 简体中文
  */
@@ -14,7 +14,7 @@ export default {
 		operation: "操作",
 		des: "描述",
 		createdAt: "创建时间",
-		updatedAt: "更新时间"
+		updatedAt: "更新时间",
 	},
 	tableI18nConfirm: {
 		deleteTitle: "提示",
@@ -27,7 +27,8 @@ export default {
 		deleteSelectedMessage: "你确定要删除所选数据?",
 		selectDataFirst: "请选择要删除的数据。",
 		saveSuccess: "保存成功",
-		handleSuccess: "操作成功"
+		handleSuccess: "操作成功",
+		handleFailed: "操作失败"
 	},
 	tableI18nAction: {
 		detail: "详情",

+ 37 - 19
src/views/iot/rule-engine/edit.vue

@@ -1,31 +1,41 @@
 <template>
-  <el-dialog class="api-edit" v-model="showDialog" :title="`${formData.id ? '编辑' : '新增'}`" width="600px" :close-on-click-modal="false" :close-on-press-escape="false">
-    <el-form ref="formRef" :model="formData" :rules="ruleForm" label-width="80px">
-      <el-form-item label="名称" prop="name">
-        <el-input v-model.trim="formData.name" placeholder="输入名称" />
+  <!-- 编辑规则编排/新增规则编排 -->
+  <el-dialog class="api-edit" v-model="showDialog" :title="`${formData.id ? $t('message.ruleEngine.editRule') : $t('message.ruleEngine.addRule')}`" width="600px" :close-on-click-modal="false" :close-on-press-escape="false">
+    <el-form ref="formRef" :model="formData" :rules="ruleForm" :label-width="currentLocale == 'en' ? '100px' : '80px'">
+      <!-- 名称 -->
+      <el-form-item :label="$t('message.formI18nLabel.name1')" prop="name">
+        <!-- 输入名称 -->
+        <el-input v-model.trim="formData.name" :placeholder="$t('message.ruleEngine.namePlaceholder')" />
       </el-form-item>
-      <el-form-item label="主规则链" prop="types">
-        <el-switch v-model="formData.types" :active-value="1" :inactive-value="0" active-text="关闭:为创建子链"></el-switch>
+      <!-- 主规则链 -->
+      <el-form-item :label="$t('message.ruleEngine.mainChain')" prop="types">
+        <!-- 关闭:为创建子链 -->
+        <el-switch v-model="formData.types" :active-value="1" :inactive-value="0" :active-text="$t('message.ruleEngine.closeSubChain')"></el-switch>
       </el-form-item>
-      <el-form-item label="调试模式" prop="status">
+      <!-- 调试模式 -->
+      <el-form-item :label="$t('message.ruleEngine.debugMode')" prop="status">
         <el-switch v-model="formData.status" :active-value="2" :inactive-value="0"></el-switch>
-        开启后会覆盖节点的调试模式配置,所有节点会打印调试日志
+        <!-- 开启后会覆盖节点的调试模式配置,所有节点会打印调试日志 -->
+        {{ $t('message.ruleEngine.tip1') }}
       </el-form-item>
-      <el-form-item label="说明" prop="expound">
+      <!-- 描述 -->
+      <el-form-item :label="$t('message.ruleEngine.description')" prop="expound">
         <el-input v-model="formData.expound" type="textarea" :rows="5" />
       </el-form-item>
     </el-form>
     <template #footer>
       <div class="dialog-footer">
-        <el-button @click="showDialog = false">取消</el-button>
-        <el-button type="primary" @click="onSubmit">确定</el-button>
+        <!-- 取消 -->
+        <el-button @click="showDialog = false">{{ $t('message.tableI18nAction.cancel') }}</el-button>
+        <!-- 编辑/新增 -->
+        <el-button type="primary" @click="onSubmit">{{formData.id ? $t('message.tableI18nAction.edit') : $t('message.tableI18nAction.add') }}</el-button>
       </div>
     </template>
   </el-dialog>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive, nextTick } from "vue";
+import { ref, reactive, nextTick, computed } from "vue";
 import api from "/@/api/rule";
 import axios from "axios";
 import { ruleRequired } from "/@/utils/validator";
@@ -33,6 +43,11 @@ import { ElMessage } from "element-plus";
 import { getToken } from "/@/utils/auth";
 import { v4 as uuid } from "uuid";
 import { getRuleServerOrigin } from "/@/utils/origin";
+import { useI18n } from 'vue-i18n';
+// 国际化
+const { locale, t } = useI18n();
+
+const currentLocale = computed(() => locale.value);
 
 const emit = defineEmits(["getList"]);
 
@@ -65,9 +80,10 @@ const formData = reactive({
   ...baseForm,
 });
 
-const ruleForm = {
-  name: [ruleRequired("规则名称不能为空")],
-};
+const ruleForm = computed(() => ({
+  // 规则名称不能为空
+  name: [ruleRequired(t('message.ruleEngine.nameValidator'))],
+}));
 
 const onSubmit = async () => {
   await formRef.value.validate();
@@ -102,7 +118,8 @@ const onSubmit = async () => {
     } else {
       // 找到规则
       const { data } = (await axios.get(getRuleServerOrigin("/api/v1/rules/" + formData.flowId), { headers }).catch(() => {
-        ElMessage.error("规则不存在");
+        // 规则不存在
+        ElMessage.error(t('message.ruleEngine.ruleNotExist'));
       })) as any;
 
       // 修改名称和说明
@@ -135,7 +152,8 @@ const onSubmit = async () => {
       const flow = flows.find((item: any) => item.id === formData.flowId);
 
       if (!flow) {
-        ElMessage.error("规则不存在");
+        // 规则不存在
+        ElMessage.error(t('message.ruleEngine.ruleNotExist'));
         return;
       }
 
@@ -149,8 +167,8 @@ const onSubmit = async () => {
   const theApi = formData.id ? api.edit : api.add;
 
   await theApi(formData);
-
-  ElMessage.success("操作成功");
+  // 操作成功
+  ElMessage.success(t('message.tableI18nConfirm.handleSuccess'));
   resetForm();
   showDialog.value = false;
   emit("getList");

+ 88 - 43
src/views/iot/rule-engine/index.vue

@@ -2,27 +2,40 @@
   <div class="page">
     <el-card shadow="never">
       <el-form inline>
-        <el-form-item label="名称">
-          <el-input v-model="searchParams.keyWord" placeholder="请输入关键字" clearable @keyup.enter="handleSearch" />
+        <!-- 名称 -->
+        <el-form-item :label="$t('message.formI18nLabel.name1')">
+          <!-- 请输入关键字 -->
+          <el-input v-model="searchParams.keyWord" :placeholder="$t('message.ruleEngine.keywordPlaceholder')" clearable @keyup.enter="handleSearch" />
         </el-form-item>
-        <el-form-item label="类型">
-          <el-select v-model="searchParams.types" placeholder="请选择类型" clearable @clear="() => (searchParams.types = -1)" @change="handleSearch">
-            <el-option label="主链" :value="1" />
-            <el-option label="子链" :value="2" />
-            <el-option label="全部" :value="-1" />
+        <!-- 类型 -->
+        <el-form-item :label="$t('message.formI18nLabel.type')">
+          <!-- 请选择类型 -->
+          <el-select v-model="searchParams.types" :placeholder="$t('message.ruleEngine.typePlaceholder')" clearable @clear="() => (searchParams.types = -1)" @change="handleSearch">
+            <!-- 主链 -->
+            <el-option :label="$t('message.ruleEngine.mainChain')" :value="1" />
+            <!-- 子链 -->
+            <el-option :label="$t('message.ruleEngine.subChain')" :value="2" />
+            <!-- 全部 -->
+            <el-option :label="$t('message.ruleEngine.all')" :value="-1" />
           </el-select>
         </el-form-item>
-        <el-form-item label="状态">
-          <el-select v-model="searchParams.status" placeholder="请选择状态" clearable @clear="() => (searchParams.status = -1)" @change="handleSearch">
-            <el-option label="已启动" :value="1" />
-            <el-option label="已停止" :value="0" />
-            <el-option label="全部" :value="-1" />
+        <!-- 状态 -->
+        <el-form-item :label="$t('message.formI18nLabel.status')">
+          <!-- 请选择状态 -->
+          <el-select v-model="searchParams.status" :placeholder="$t('message.ruleEngine.statusPlaceholder')" clearable @clear="() => (searchParams.status = -1)" @change="handleSearch">
+            <!-- 已启动 -->
+            <el-option :label="$t('message.ruleEngine.started')" :value="1" />
+            <!-- 已停止 -->
+            <el-option :label="$t('message.ruleEngine.stopped')" :value="0" />
+            <!-- 全部 -->
+            <el-option :label="$t('message.ruleEngine.all')" :value="-1" />
           </el-select>
         </el-form-item>
         <el-form-item>
+          <!-- 查询 -->
           <el-button type="primary" @click="handleSearch">
             <el-icon><ele-Search /></el-icon>
-            搜索
+            {{$t('message.formI18nButton.query')}}
           </el-button>
           <!-- <el-button @click="handleReset">
             <el-icon><ele-Refresh /></el-icon>
@@ -30,38 +43,55 @@
           </el-button> -->
         </el-form-item>
         <el-form-item>
+          <!-- 新增规则编排 -->
           <el-button type="primary" v-auth="'add'" @click="addOrEdit()">
             <el-icon>
               <ele-FolderAdd />
             </el-icon>
-            新增规则编排
+            {{ $t('message.ruleEngine.addRule') }}
           </el-button>
         </el-form-item>
       </el-form>
       <el-table :data="tableData" style="width: 100%" v-loading="loading">
-        <el-table-column type="index" label="序号" width="80" align="center" />
-        <el-table-column prop="types" label="类型" width="70" align="center">
+        <!-- 序号 -->
+        <el-table-column type="index" :label="$t('message.tableI18nColumn.index')" width="80" align="center" />
+        <!-- 类型 -->
+        <el-table-column prop="types" :label="$t('message.formI18nLabel.type')" width="70" align="center">
           <template #default="scope">
-            <el-tag size="small" v-if="scope.row.types == 1">主链</el-tag>
-            <el-tag type="success" size="small" v-else>子链</el-tag>
+            <!-- 主链 -->
+            <el-tag size="small" v-if="scope.row.types == 1">{{$t('message.ruleEngine.mainChain')}}</el-tag>
+            <!-- 子链 -->
+            <el-tag type="success" size="small" v-else>{{$t('message.ruleEngine.subChain')}}</el-tag>
           </template>
         </el-table-column>
-        <el-table-column prop="name" label="名称" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="expound" label="说明" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="createdAt" label="创建时间" min-width="100" align="center"></el-table-column>
-        <el-table-column prop="status" label="状态" width="100" align="center">
+        <!-- 名称 -->
+        <el-table-column prop="name" :label="$t('message.formI18nLabel.name1')" show-overflow-tooltip></el-table-column>
+        <!-- 描述 -->
+        <el-table-column prop="expound" :label="$t('message.formI18nLabel.desc')" show-overflow-tooltip></el-table-column>
+        <!-- 创建时间 -->
+        <el-table-column prop="createdAt" :label="$t('message.tableI18nColumn.createdAt')" min-width="100" align="center"></el-table-column>
+        <!-- 状态 -->
+        <el-table-column prop="status" :label="$t('message.formI18nLabel.status')" width="100" align="center">
           <template #default="scope">
-            <el-tag type="success" size="small" v-if="scope.row.status == 1">已启动</el-tag>
-            <el-tag type="info" size="small" v-else>已停止</el-tag>
+            <!-- 已启动 -->
+            <el-tag type="success" size="small" v-if="scope.row.status == 1">{{$t('message.ruleEngine.started')}}</el-tag>
+            <!-- 已停止 -->
+            <el-tag type="info" size="small" v-else>{{$t('message.ruleEngine.stopped')}}</el-tag>
           </template>
         </el-table-column>
-        <el-table-column label="操作" width="200" align="center">
+        <!-- 操作 -->
+        <el-table-column :label="$t('message.tableI18nColumn.operation')" width="200" align="center">
           <template #default="scope">
-            <el-button size="small" text type="info" v-auth="'startOrStop'" v-if="scope.row.status" @click="setStatus(scope.row, 0)">停止</el-button>
-            <el-button size="small" text type="primary" v-auth="'startOrStop'" v-else @click="setStatus(scope.row, 1)">启动</el-button>
-            <el-button size="small" text type="primary" v-auth="'edit'" @click="addOrEdit(scope.row)">编辑</el-button>
-            <el-button size="small" text type="warning" @click="edit(scope.row)">规则编辑</el-button>
-            <el-button size="small" text type="info" v-auth="'del'" @click="onDel(scope.row)">删除</el-button>
+            <!-- 停止 -->
+            <el-button size="small" text type="info" v-auth="'startOrStop'" v-if="scope.row.status" @click="setStatus(scope.row, 0)">{{ $t('message.ruleEngine.stop') }}</el-button>
+            <!-- 启动 -->
+            <el-button size="small" text type="primary" v-auth="'startOrStop'" v-else @click="setStatus(scope.row, 1)">{{ $t('message.ruleEngine.start') }}</el-button>
+            <!-- 编辑 -->
+            <el-button size="small" text type="primary" v-auth="'edit'" @click="addOrEdit(scope.row)">{{ $t('message.tableI18nAction.edit') }}</el-button>
+            <!-- 规则编辑 -->
+            <el-button size="small" text type="warning" @click="edit(scope.row)">{{ $t('message.ruleEngine.ruleEdit') }}</el-button>
+            <!-- 删除 -->
+            <el-button size="small" text type="info" v-auth="'del'" @click="onDel(scope.row)">{{ $t('message.tableI18nAction.delete') }}</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -72,7 +102,7 @@
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive, watch } from "vue";
+import { ref, reactive, watch, computed } from "vue";
 import api from "/@/api/rule";
 import { ElMessageBox, ElMessage } from "element-plus";
 import { useSearch } from "/@/hooks/useCommon";
@@ -80,7 +110,11 @@ import EditForm from "./edit.vue";
 import axios from "axios";
 import { getToken } from "/@/utils/auth";
 import { getRuleServerOrigin } from "/@/utils/origin";
+import { useI18n } from 'vue-i18n';
+// 国际化
+const { locale, t } = useI18n();
 
+const currentLocale = computed(() => locale.value);
 const editFormRef = ref();
 
 // 规则引擎模式 node-red、 sagoo-rule
@@ -157,15 +191,18 @@ const setStatus = async (row: any, status: number) => {
         api
           .setStatus(row.id, status)
           .then(() => {
-            ElMessage.success("操作成功");
+            // 操作成功
+            ElMessage.success(t('message.tableI18nConfirm.handleSuccess'));
             getList();
           })
           .catch(() => {
-            ElMessage.error("操作失败");
+            // 操作失败
+            ElMessage.error(t('message.tableI18nConfirm.handleFailed'));
           });
       })
       .catch(() => {
-        ElMessage.error("操作失败");
+        // 操作失败
+        ElMessage.error(t('message.tableI18nConfirm.handleFailed'));
       });
   } else {
     // 找到所有规则
@@ -174,7 +211,8 @@ const setStatus = async (row: any, status: number) => {
     const flow = flows.find((item: any) => item.id === row.flowId);
 
     if (!flow) {
-      ElMessage.error("规则不存在");
+      // 规则不存在
+      ElMessage.error(t('message.ruleEngine.ruleNotExist'));
       return;
     }
 
@@ -185,11 +223,13 @@ const setStatus = async (row: any, status: number) => {
     api
       .setStatus(row.id, status)
       .then(() => {
-        ElMessage.success("操作成功");
+        // 操作成功
+        ElMessage.success(t('message.tableI18nConfirm.handleSuccess'));
         getList();
       })
       .catch(() => {
-        ElMessage.error("操作失败");
+        // 操作失败
+        ElMessage.error(t('message.tableI18nConfirm.handleFailed'));
       });
   }
 };
@@ -207,14 +247,18 @@ const edit = async (row: any) => {
 };
 
 const onDel = (row: any) => {
-  ElMessageBox.confirm(`此操作将删除:“${row.name}”,是否继续?`, "提示", {
-    confirmButtonText: "确认",
-    cancelButtonText: "取消",
-    type: "warning",
+  // 此操作将删除:“${row.name}”,是否继续?
+  ElMessageBox.confirm(
+    t('message.ruleEngine.deleteRuleMessage', { name: row.name }),
+    t('message.tableI18nConfirm.deleteTitle'), {
+    confirmButtonText: t('message.tableI18nConfirm.confirmText'),
+    cancelButtonText: t('message.tableI18nConfirm.cancelText'),
+    type: 'warning',
   }).then(async () => {
     if (model == "sagoo-rule") {
       await axios.delete(getRuleServerOrigin("/api/v1/rules/" + row.flowId), { headers }).catch(() => {
-        ElMessage.error("规则不存在");
+        // 规则不存在
+        ElMessage.error(t('message.ruleEngine.ruleNotExist'));
       });
     } else if (model == "node-red") {
       // 找到所有规则
@@ -241,7 +285,8 @@ const onDel = (row: any) => {
     }
 
     await api.del([row.id as string]);
-    ElMessage.success("删除成功");
+    // 删除成功
+    ElMessage.success(t('message.tableI18nConfirm.deleteSuccess'));
     getList();
   });
 };

+ 12 - 2
src/views/iot/rule-engine/log.vue

@@ -1,8 +1,18 @@
+<!--
+ * @Author: vera_min vera_min@163.com
+ * @Date: 2025-08-28 16:18:16
+ * @LastEditors: vera_min vera_min@163.com
+ * @LastEditTime: 2025-08-30 20:11:16
+ * @FilePath: /sagoo-admin-ui-dev/src/views/iot/rule-engine/log.vue
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+-->
 <template>
 	<el-card shadow="never" class="page">
 		<el-table :data="tableData" style="width: 100%" row-key="id" v-loading="loading">
-			<el-table-column prop="id" label="ID" width="100" show-overflow-tooltip v-col="'id'"></el-table-column>
-			<el-table-column label="操作" align="center"></el-table-column>
+			<!-- ID -->
+			<el-table-column prop="id" :label="$t('message.tableI18nColumn.id')" width="100" show-overflow-tooltip v-col="'id'"></el-table-column>
+			<!-- 操作 -->
+			<el-table-column :label="$t('message.tableI18nColumn.operation')" align="center"></el-table-column>
 		</el-table>
 		<pagination v-if="params.total" :total="params.total" v-model:page="params.pageNum" v-model:limit="params.pageSize" @pagination="getList()" />
 	</el-card>