Files
iot-device-management-frontend/apps/web-antd/src/locales/langs/en-US/page.json

392 lines
13 KiB
JSON
Raw Normal View History

{
"auth": {
"login": "Login",
"register": "Register",
"codeLogin": "Code Login",
"qrcodeLogin": "Qr Code Login",
2025-11-10 17:51:10 +08:00
"forgetPassword": "Forget Password",
"profile": "Profile"
},
"dashboard": {
"title": "Dashboard",
"analytics": "Analytics",
"workspace": "Workspace"
2025-03-24 21:30:21 +08:00
},
"action": {
"action": "Action",
"add": "Add",
"edit": "Edit",
"delete": "Delete",
"save": "Save",
"import": "Import",
"export": "Export",
"submit": "Submit",
"cancel": "Cancel",
"confirm": "Confirm",
"reset": "Reset",
2025-05-15 11:49:44 +08:00
"search": "Search",
"more": "More"
2025-05-06 15:44:31 +08:00
},
"tenant": {
"placeholder": "Please select tenant",
"success": "Switch tenant success"
2025-11-06 15:25:11 +08:00
},
"mp": {
"upload": {
"invalidFormat": "Invalid {0} format!",
2025-11-27 09:55:24 +08:00
"maxSize": "{0} size cannot exceed {1}M!",
"image": "Image",
"video": "Video",
"voice": "Voice"
2025-11-06 15:25:11 +08:00
}
},
"iot": {
[F11] 设备查询页 subsystemId 筛选 + 未归属标签 - apps/web-antd/src/api/iot/device/device/index.ts - Device 接口加 subsystemId/subsystemName - 新增 BindSubsystemReqVO + bindDeviceSubsystem (PUT /iot/device/bindSubsystem) - apps/web-antd/src/views/iot/device/device/index.vue - 筛选器:子系统下拉 + 未归属哨兵 -1 (→ queryParams.unassigned=true) - 单设备/批量绑定弹窗,批量 100 台/批 - 行操作 + TableAction 增加"绑定子系统"按钮 (auth: iot:device:update) - apps/web-antd/src/views/iot/device/device/data.ts - useGridColumns 追加"所属子系统"列 (slot: subsystem) - apps/web-antd/src/views/iot/device/device/modules/card-view.vue - 卡片视图加子系统信息行 + 未归属红标签 - Props 透传 subsystems / searchParams.subsystemId / unassigned - apps/web-antd/src/views/iot/device/device/__tests__/device-subsystem-filter.spec.ts - 14 用例: 筛选参数转换 / 未归属标签条件 / 批量分批逻辑 - locales/langs/{zh-CN,en-US}/page.json: iot.device.filter.subsystem.* 12 键同步 - Known Pitfalls 落地: 评审 A2 NULL 醒目红标签 / 哨兵 -1 → unassigned=true / 批量 100 台分批 / iot:device:update 权限 / simple-list 加载静默降级 后端 B11 API 补充契约: - GET /iot/device/page?unassigned=true (subsystemId IS NULL 过滤) - PUT /iot/device/bindSubsystem { deviceId, subsystemId: number | null } - 分页响应 Device 含 subsystemId?: number | null + subsystemName?: string Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 23:02:01 +08:00
"device": {
"filter": {
"subsystem": {
"placeholder": "All Subsystems",
"unassigned": "Unassigned",
"bind": "Bind Subsystem",
"bindTitle": "Bind Subsystem",
"batchBind": "Batch Bind Subsystem",
"batchBindTitle": "Batch Bind Subsystem",
"batchBindSuccess": "{0} device(s) bound successfully",
"bindSuccess": "Bound successfully",
"selectRequired": "Please select a subsystem first",
"selectDeviceTip": "Please select devices first",
"binding": "Binding...",
"batchBindHint": "{0} device(s) selected, max 100 per batch"
}
}
},
[F9/F10] 子系统管理 + 告警正交 5 态列表(UI 骨架 + mock) 两任务并行完成,因同动 router/iot.ts 与 locales/page.json 合并 commit。 F9 子系统管理 + 设备批量绑定: - apps/web-antd/src/api/iot/subsystem/index.ts - apps/web-antd/src/views/iot/subsystem/{list,form,devices}.vue - apps/web-antd/src/views/iot/subsystem/__tests__/subsystem-utils.test.ts (18 用例) - Known Pitfalls: 评审 A6 Redis stats 降级 / A7 403 拦截器 / 批量 100 台 / code regex snake_case - 后端 B10/B11 API 契约: /iot/subsystem/{page,get,create,update,delete,simple-list,device-count} + /iot/device/{batchBindSubsystem,bindSubsystem} + /iot/device/page 加 subsystemId 过滤 F10 告警记录 (评审 C1 正交 5 态): - apps/web-antd/src/views/iot/alarm/record/{list,detail}.vue - apps/web-antd/src/views/iot/alarm/record/{alarm-state,api}.ts - apps/web-antd/src/views/iot/alarm/record/components/{AlarmStateTag,AlarmOperations}.vue - apps/web-antd/src/views/iot/alarm/record/__tests__/AlarmStateTag.spec.ts (12 用例) - 5 态: 活跃·未确认(red) / 活跃·已确认(orange) / 已清除·未确认(gold醒目) / 已清除·已确认(green) / 已归档(default) - Known Pitfalls: C1 5 态必展示 / archived 优先判断 / 30s 轮询 / 严重度颜色映射 - 后端 B12 API 契约: /iot/alarm-record/{page,get,ack,unack,clear,archive,batch-*,history,remark} 共同: - apps/web-antd/src/router/routes/modules/iot.ts 追加 subsystem + alarm 路由 - locales/langs/{zh-CN,en-US}/page.json 追加 iot.subsystem.* + iot.alarm.* note: 路由用顶级路径;项目采用动态菜单机制,菜单注册需后端 menu 表配置(运维侧工作), 前端路由可通过 URL 直接访问。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 22:39:47 +08:00
"subsystem": {
"title": "Subsystem",
"listTitle": "Subsystem List",
"name": "Name",
"namePlaceholder": "Enter subsystem name",
"nameRequired": "Name is required",
"nameTooLong": "Name must not exceed 128 characters",
"code": "Code",
"codePlaceholder": "e.g. security, clean",
"codeRequired": "Code is required",
"codeTooLong": "Code must not exceed 64 characters",
"codeFormat": "Code must start with a lowercase letter and contain only lowercase letters, digits, or underscores",
"codeHelp": "Format: starts with a letter, allows digits and underscores, e.g. clean_01",
"status": "Status",
"statusEnabled": "Enabled",
"statusDisabled": "Disabled",
"statusPlaceholder": "Select status",
"icon": "Icon",
"iconPlaceholder": "Icon URL or iconify name",
"description": "Description",
"descriptionPlaceholder": "Enter description",
"deviceCount": "Devices",
"searchPlaceholder": "Search name / code",
"viewDevices": "View Devices",
"deleteDisabledTip": "Cannot delete: subsystem has {0} device(s)",
"deviceListTitle": "Subsystem Devices",
"deviceName": "Device Name",
"serialNumber": "Serial Number",
"deviceState": "Online State",
"deviceOnline": "Online",
"deviceOffline": "Offline",
"deviceSearchPlaceholder": "Search device name",
"statTotal": "Total Devices",
"statOnline": "Online",
"statAlarm": "Alarming",
"statsNotice": "Stats are provided by Redis cache and may have a short delay (⚠️ A6)",
"batchBind": "Batch Bind Devices",
"batchBindHint": "Max 100 devices per batch",
"bindSuccess": "{0} device(s) bound successfully",
"selectDeviceTip": "Please select devices first",
"unbind": "Remove",
"unbindConfirm": "Remove device \"{0}\" from this subsystem?",
"unbinding": "Removing device...",
"unbindSuccess": "Device removed",
"transferCandidate": "Candidate Devices",
"transferSelected": "Selected Devices"
},
"dag": {
"toolbar": {
"zoomIn": "Zoom In",
"zoomOut": "Zoom Out",
"fitView": "Fit View",
"undo": "Undo (Ctrl+Z)",
"redo": "Redo (Ctrl+Y)",
"save": "Save"
},
"canvas": {
"readonly": "Read-only mode",
"empty": "Drag nodes to canvas to start"
},
"panel": {
"title": "Node Types",
"searchPlaceholder": "Search nodes...",
"loading": "Loading...",
"loadError": "Load failed, please refresh",
"noMatch": "No matching nodes found",
"category": {
"trigger": "Trigger",
"condition": "Condition",
"action": "Action"
[F3] DAG 画布属性面板 + 动态表单机制 主会话(Opus)自做,覆盖任务卡 §2 全部文件。 核心文件: - apps/web-antd/src/views/iot/rule/chain/api/node-metadata.ts - GET /iot/rule/provider/metadata API 封装 - ProviderMetadata/FormCreateSchema/FormCreateRuleItem 类型定义 - apps/web-antd/src/views/iot/rule/chain/stores/selected-node.ts - Pinia store: current 节点 + dirty 标记 + metadata 缓存 - metadataByType O(1) 索引 + getSchemaByType/getMetadataByType 查表 - loadMetadata fetcher 可注入(测试 + 后端未就绪 fallback 到 mock) - apps/web-antd/src/views/iot/rule/chain/components/node-schema/index.ts - 7 种节点 mock schema (device_state/device_property/timer/expression/ property_set/alarm_trigger/notify) - buildMockMetadata() 供 fallback 使用 - apps/web-antd/src/views/iot/rule/chain/components/DynamicNodeForm.vue - @form-create/ant-design-vue 封装,schema 切换自动 resetFields - "i18n:" 前缀约定递归解析 title/placeholder/options.label/validate.message - 过滤 undefined 避免 configuration 写入噪声 - apps/web-antd/src/views/iot/rule/chain/components/DagPropertyPanel.vue - 面板容器:节点名称输入 + DynamicNodeForm - onMounted 加载 metadata,后端失败 fallback 到 mock(node-schema) 测试: - selected-node-store.spec.ts 13 用例(store actions / loadMetadata / getSchemaByType / reset) - node-schema.spec.ts 12 用例(mock schema 覆盖 5+ 种 / buildMockMetadata 映射) i18n: iot.dag.panel.* / iot.dag.field.* / iot.dag.option.* / iot.dag.validate.* zh-CN 与 en-US 同步新增。 Known Pitfalls 落地: - 评审 B5/H2: 模板变量用 ${data.x}/${alarm.x}/${trigger.x} 占位(notify template placeholder 字面展示,禁用旧 $[...] 语法) - form-create schema 切换时调用 fApi.resetFields 防止字段残留 - configuration 过滤 undefined 防止响应式写入 null - iot:subsystem:simple-list 权限 403 由 @vben/request 拦截器统一处理 - TS 严格模式零 any,configuration 类型 Record<string, unknown> 决策 5 双入口: - 本任务仅新建 chain/ 目录的组件 + store + API + mock schema - 路由追加由后续任务处理(项目采用动态菜单机制,静态路由 modules/iot.ts 仅放 hideInMenu 详情页;chain 的 list/edit 菜单由后端 menu 表配置) - 现有 iot/rule/scene/* 保持不变 ✓ 质检: - pnpm test:unit src/views/iot/rule/chain → 48/48 通过 - pnpm lint apps/web-antd/src/views/iot/rule/chain/ → 0 errors - pnpm check:type (web-antd) → chain 目录 0 errors(其他模块预存错误与本任务无关) note: DagPropertyPanel + DynamicNodeForm 的渲染集成测试留给 F7 edit.vue 真实画布 dogfood;本次 unit test 覆盖纯函数与 store。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 23:12:11 +08:00
},
"empty": "Click a node on canvas to configure",
"schemaUnknown": "Unknown node type or metadata not loaded",
"titleEmpty": "Property Panel",
"titleFallback": "Node Configuration",
"nodeLabel": "Node Name",
"nodeLabelPlaceholder": "Enter node name"
},
"field": {
"device": "Device",
"devicePlaceholder": "Select device",
"propertyIdentifier": "Property",
"propertyPlaceholder": "Enter property identifier",
"dataType": "Data Type",
"deviceEvent": "Event",
"cron": "Cron Expression",
"timezone": "Timezone",
"expression": "Expression",
"value": "Value",
"valuePlaceholder": "Enter value",
"alarmName": "Alarm Name",
"alarmMessage": "Alarm Message",
"alarmMessagePlaceholder": "Supports ${data.x} / ${meta.x} / ${alarm.x} / ${trigger.x}",
"severity": "Severity",
"notifyChannel": "Notification Channel",
"notifyRecipients": "Recipients",
"notifyRecipientsPlaceholder": "Multiple recipients separated by commas",
"notifyTemplate": "Message Template"
},
"option": {
"online": "Online",
"offline": "Offline"
},
"validate": {
"deviceRequired": "Please select a device",
"propertyRequired": "Please enter property identifier",
"cronRequired": "Please enter a Cron expression",
"expressionRequired": "Please enter an expression",
"valueRequired": "Please enter a value",
"alarmNameRequired": "Please enter an alarm name"
},
"node": {
"device_state": {
"name": "Device State",
"desc": "Triggered when device goes online/offline"
},
"device_property": {
"name": "Device Property Report",
"desc": "Triggered when device reports property data"
},
"device_event": {
"name": "Device Event",
"desc": "Triggered when device reports an event"
},
"device_service": {
"name": "Device Service Call",
"desc": "Triggered when device service is invoked"
},
"timer": {
"name": "Timer",
"desc": "Triggered by Cron expression on schedule"
},
"expression": {
"name": "Expression",
"desc": "Aviator expression evaluation condition"
},
"time_range": {
"name": "Time Range",
"desc": "Check if current time is within a specified range"
},
"condition_device_state": {
"name": "Device State Check",
"desc": "Check current device online status"
},
"property_set": {
"name": "Set Property",
"desc": "Send property set command to device"
},
"service_invoke": {
"name": "Invoke Service",
"desc": "Invoke device service"
},
"alarm_trigger": {
"name": "Trigger Alarm",
"desc": "Trigger a device alarm"
},
"alarm_clear": {
"name": "Clear Alarm",
"desc": "Clear a device alarm"
},
"notify": {
"name": "Send Notification",
"desc": "Send notification (SMS/Email/Webhook)"
}
}
[F9/F10] 子系统管理 + 告警正交 5 态列表(UI 骨架 + mock) 两任务并行完成,因同动 router/iot.ts 与 locales/page.json 合并 commit。 F9 子系统管理 + 设备批量绑定: - apps/web-antd/src/api/iot/subsystem/index.ts - apps/web-antd/src/views/iot/subsystem/{list,form,devices}.vue - apps/web-antd/src/views/iot/subsystem/__tests__/subsystem-utils.test.ts (18 用例) - Known Pitfalls: 评审 A6 Redis stats 降级 / A7 403 拦截器 / 批量 100 台 / code regex snake_case - 后端 B10/B11 API 契约: /iot/subsystem/{page,get,create,update,delete,simple-list,device-count} + /iot/device/{batchBindSubsystem,bindSubsystem} + /iot/device/page 加 subsystemId 过滤 F10 告警记录 (评审 C1 正交 5 态): - apps/web-antd/src/views/iot/alarm/record/{list,detail}.vue - apps/web-antd/src/views/iot/alarm/record/{alarm-state,api}.ts - apps/web-antd/src/views/iot/alarm/record/components/{AlarmStateTag,AlarmOperations}.vue - apps/web-antd/src/views/iot/alarm/record/__tests__/AlarmStateTag.spec.ts (12 用例) - 5 态: 活跃·未确认(red) / 活跃·已确认(orange) / 已清除·未确认(gold醒目) / 已清除·已确认(green) / 已归档(default) - Known Pitfalls: C1 5 态必展示 / archived 优先判断 / 30s 轮询 / 严重度颜色映射 - 后端 B12 API 契约: /iot/alarm-record/{page,get,ack,unack,clear,archive,batch-*,history,remark} 共同: - apps/web-antd/src/router/routes/modules/iot.ts 追加 subsystem + alarm 路由 - locales/langs/{zh-CN,en-US}/page.json 追加 iot.subsystem.* + iot.alarm.* note: 路由用顶级路径;项目采用动态菜单机制,菜单注册需后端 menu 表配置(运维侧工作), 前端路由可通过 URL 直接访问。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 22:39:47 +08:00
},
"alarm": {
"state": {
"archived": "Archived",
"activeUnacked": "Active·Unacked",
"activeAcked": "Active·Acked",
"clearedUnacked": "Cleared·Unacked",
"clearedAcked": "Cleared·Acked",
"unknown": "Unknown"
},
"severity": {
"critical": "Critical",
"major": "Major",
"minor": "Minor",
"warning": "Warning",
"info": "Info",
"unknown": "Unknown"
},
"list": {
"title": "Alarm Records"
},
"field": {
"alarmName": "Alarm Name",
"severity": "Severity",
"state": "State",
"deviceName": "Device",
"productName": "Product",
"triggerCount": "Trigger Count",
"startTs": "First Triggered",
"endTs": "Last Triggered",
"clearTs": "Cleared At",
"ackTs": "Acked At"
},
"filter": {
"all": "All",
"ackState": "Ack State",
"clearState": "Clear State",
"archived": "Archive",
"unacked": "Unacked",
"acked": "Acked",
"active": "Active",
"cleared": "Cleared",
"excludeArchived": "Exclude Archived",
"allRecords": "All Records",
"onlyArchived": "Archived Only"
},
"op": {
"ack": "Ack",
"unack": "Unack",
"clear": "Clear",
"archive": "Archive",
"noOps": "No Operations",
"confirmTitle": "Confirm",
"ackConfirm": "Acknowledge this alarm?",
"unackConfirm": "Unacknowledge this alarm?",
"clearConfirm": "Clear this alarm?",
"archiveConfirm": "Archive this alarm? No further operations after archiving.",
"batchAck": "Batch Ack",
"batchClear": "Batch Clear",
"batchArchive": "Batch Archive",
"batchAckConfirm": "Acknowledge {count} selected alarm(s)?",
"batchClearConfirm": "Clear {count} selected alarm(s)?",
"batchArchiveConfirm": "Archive {count} selected alarm(s)? No further operations after archiving.",
"selectFirst": "Please select records first",
"ackSuccess": "Acknowledged",
"unackSuccess": "Unacknowledged",
"clearSuccess": "Cleared",
"archiveSuccess": "Archived"
},
"detail": {
"title": "Alarm Detail",
"basicInfo": "Basic Info",
"propagationPath": "Propagation Path",
"details": "Alarm Details",
"remark": "Process Remark",
"remarkPlaceholder": "Enter remark",
"remarkSaved": "Remark saved",
"history": "History",
"noHistory": "No history records"
}
[F7] 规则链列表/编辑页(DAG 画布整合,决策 5 双入口) 整合 F1 DagCanvas + F2 DagNodePanel + F3 DagPropertyPanel + F8 dag-converter 为完整的规则链 v2 编辑体验。 新增: - apps/web-antd/src/views/iot/rule/chain/api/rule-chain.ts - CRUD + enable/disable/deploy/debug/copy API 封装 - apps/web-antd/src/views/iot/rule/chain/stores/rule-chain.ts - Pinia store: meta + nodes + edges + dirty guard + save/deploy 区分新建/更新 - apps/web-antd/src/views/iot/rule/chain/list.vue - 4 维筛选(name/subsystem/type/status)+ 分页 20/50/100 - 启用/禁用乐观 UI + 调试切换 Modal 确认(评审 B8) - WARNING 状态红 Badge + Tooltip 物模型变更原因(评审 E4) - 双入口 Banner Alert 链到 v1 scene 页(决策 5) - hasAccessByCodes iot:rule:{update,delete} 权限 - apps/web-antd/src/views/iot/rule/chain/edit.vue - 三栏布局:DagNodePanel(220) + DagCanvas + DagPropertyPanel(320) - drop 处理: handleDragOver preventDefault / screenToFlowCoordinate / newTempId 新节点临时 ID - nodeClick → selectedNodeStore.setCurrent; paneClick → clear - onBeforeRouteLeave dirty 拦截 + Modal 确认 - readonly 模式: status=ENABLED 默认只读,可"解锁编辑" - 发布: save(若 dirty) → deploy API(Modal 前置确认) - 创建后 router.replace 含真实 ID - apps/web-antd/src/views/iot/rule/chain/__tests__/rule-chain-store.spec.ts (10 用例) 修改: - apps/web-antd/src/router/routes/modules/iot.ts 追加 /iot/rule/chain (顶级) + /iot/rule/chain/edit/:id? (hideInMenu detail) - locales/langs/{zh-CN,en-US}/page.json 补 iot.ruleChain.* 约 80 键 Known Pitfalls 落地: - drop 兼容: handleDragOver 调 e.preventDefault + dropEffect='copy'(Firefox) - 临时 ID: newTempId 生成 new_<uuid>,isTempId 识别 INSERT(F8 约定) - dirty guard: onBeforeRouteLeave 拦截离开 - readonly: status=ENABLED 已发布默认只读,可解锁重新编辑 - 画布双击 nodeDblclick 已透传(DagPropertyPanel 可选聚焦) 决策 5 双入口落实: - 现有 /iot/rule/scene/* (v1 表单) 完全保留 - 新增 /iot/rule/chain/* (v2 DAG) - list.vue 顶部 Alert 给用户两入口引导 质检: - pnpm test:unit src/views/iot/rule/chain → 58/58 通过(累计 F1-F8 测试) - pnpm lint F7 files → 0 errors - pnpm check:type chain → 0 errors 后端 B2 API 契约: - GET /iot/rule-chain/page / get?id= - POST /iot/rule-chain/create PUT update DELETE delete?id= - PUT enable / disable / deploy / debug - POST copy?id= - GET /iot/subsystem/simple-list (F9 提供,F7 筛选器复用) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 23:50:23 +08:00
},
"ruleChain": {
"list": {
"title": "Rule Chain List"
},
"edit": {
"title": "Edit Rule Chain",
"namePlaceholder": "Enter rule chain name",
"nameRequired": "Rule chain name is required",
"loadFailed": "Failed to load rule chain, please retry",
"saveFailed": "Save failed, please retry",
"unsavedTitle": "Unsaved Changes",
"unsavedContent": "Leaving this page will discard unsaved changes. Continue?",
"unsavedLeave": "Leave",
"unsavedBadge": "Unsaved",
"unlockTip": "This rule chain is enabled. Click to unlock for editing.",
"dropHint": "Drag nodes to canvas to start building"
},
"v1Banner": {
"message": "Scene Rules (v1) Migrated",
"description": "v2 Rule Chain DAG is the new orchestration entry. v1 Scene Rules page remains available during the gradual rollout.",
"link": "Go to v1 Scene Rules"
},
"field": {
"name": "Name",
"type": "Type",
"subsystem": "Subsystem",
"bindScope": "Bind Scope",
"product": "Product",
"device": "Device",
"priority": "Priority",
"status": "Status",
"debugMode": "Debug Mode",
"version": "Version",
"updateTime": "Updated At",
"actions": "Actions"
},
"filter": {
"namePlaceholder": "Search name",
"subsystemPlaceholder": "All Subsystems",
"typePlaceholder": "All Types",
"statusPlaceholder": "All Status"
},
"status": {
"enabled": "Enabled",
"disabled": "Disabled",
"warning": "Warning",
"warningHint": "Model changes caused some rules to fail. Please check the rule chain configuration."
},
"type": {
"scene": "Scene Linkage",
"data": "Data Forwarding",
"custom": "Custom"
},
"debug": {
"confirmTitle": "Enable Debug Mode",
"confirmContent": "Debug mode records input/output for each node and may produce large logs affecting performance. Confirm?",
"toggleSuccess": "Debug mode toggled",
"toggleFailed": "Toggle failed, please retry"
},
"action": {
"create": "New Rule Chain",
"enable": "Enable",
"disable": "Disable",
"enableSuccess": "Enabled successfully",
"disableSuccess": "Disabled successfully",
"statusChangeFailed": "Operation failed, please retry",
"deleteConfirm": "Delete this rule chain? This action cannot be undone.",
"deleteSuccess": "Deleted successfully",
"deleteFailed": "Delete failed, please retry",
"copy": "Copy",
"copySuccess": "Copied successfully",
"copyFailed": "Copy failed, please retry",
"deploy": "Deploy",
"deployConfirmTitle": "Confirm Deploy",
"deployConfirmContent": "After deploying, the rule chain will take effect immediately at runtime. Please confirm the configuration is correct.",
"deploySuccess": "Deployed successfully",
"deployFailed": "Deploy failed, please retry",
"saveSuccess": "Saved successfully",
"unlock": "Unlock for Editing",
"back": "Back to List"
}
}
}
}