Browse Source

feat: 物联管理-网格组件-服务器管理:支持多语言

vera_min 1 month ago
parent
commit
31d12c6e79

+ 3 - 3
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-30 19:51:43
+ * @LastEditTime: 2025-08-30 20:34:24
  * @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
  */
@@ -44,8 +44,8 @@ export default {
 		query: "查询",
 		reset: "重置",
 		addCategory: "新增分类",
-		edit: "修 改",
-		add: "添 加",
+		edit: "编辑",
+		add: "新增",
 		cancel: "取 消",
 		delete: "删除"
 	}

+ 66 - 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 20:14:28
+ * @LastEditTime: 2025-08-30 22:20:10
  * @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
  */
@@ -427,5 +427,70 @@ export default {
 		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"
+	},
+	// 服务器管理
+	server: {
+		serverName: "Server Name",
+		keywordPlaceholder: "Please enter search keyword",
+		on: "Enable",
+		off: "Disable",
+		delete: "Delete",
+		unStarted: "Not Started",
+		started: "Started",
+		editServer: "Edit Server",
+		addServer: "Add Server",
+		basicInfo: "Basic Information",
+		name: "Name",
+		namePlaceholder: "Please enter name",
+		type: "Type",
+		typePlaceholder: "Please select type",
+		stickRule: "Packet Handling Rule",
+		separator: "Separator",
+		separatorPlaceholder: "Please enter separator",
+		customScript: "Custom Script",
+		customScriptPlaceholder: "Please enter custom script",
+		fixedLength: "Fixed Length",
+		fixedLengthPlaceholder: "Please enter fixed length",
+		length: "Length",
+		lengthKey: "Length Key",
+		lengthPlaceholder: "Please enter length",
+		offset: "Offset",
+		offsetPlaceholder: "Please enter offset",
+		endian: "Endianness",
+		endianPlaceholder: "Please select endianness",
+		bigEndian: "Big Endian",
+		littleEndian: "Little Endian",
+		addr: "Address",
+		port: "Port",
+		isTls: "Enable TLS",
+		yes: "Yes",
+		no: "No",
+		authType: "Access Method",
+		authTypePlaceholder: "Please select access method",
+		certificate: "Certificate",
+		user: "Username",
+		userPlaceholder: "Please enter username",
+		password: "Password",
+		passwordPlaceholder: "Please enter password",
+		accessTokenPlaceholder: "Please enter Access Token",
+		chooseCertificate: "Select Certificate",
+		certificatePlaceholder: "Please select certificate",
+		enable: "Enable",
+		register: "Registration Package",
+		regex: "Regular Expression",
+		regexPlaceholder: "Please enter regular expression",
+		protocolAdaptation: "Protocol Adaptation",
+		protocol: "Protocol",
+		protocolPlaceholder: "Please select protocol adaptation",
+		protocolParams: "Protocol Parameters",
+		"TCP服务器": "TCP Server",
+		"UDP服务器": "UDP Server",
+		"MQTT 服务": "MQTT Service",
+		"HTTP 服务": "HTTP Service",
+		"WebSocket 服务": "WebSocket Service",
+		"TF100设备与服务通讯协议": "TF100 Device and Service Communication Protocol",
+		"editStatus": "Edit Status",
+		"unknown": "Unknown",
+		"serverDetail": "Server Detail"
 	}
 };

+ 74 - 1
src/i18n/pages/iotmanagerI18n/zh-cn.ts

@@ -1,8 +1,16 @@
 /*
  * @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 22:19:53
+ * @FilePath: /sagoo-admin-ui-dev/src/i18n/pages/iotmanagerI18n/zh-cn.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+/*
+ * @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 20:15:06
+ * @LastEditTime: 2025-08-30 22:09:47
  * @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
  */
@@ -427,5 +435,70 @@ export default {
 		tip1: "开启后会覆盖节点的调试模式配置,所有节点会打印调试日志",
 		description: "说明",
 		nameValidator: "规则名称不能为空"
+	},
+	// 服务器管理
+	server: {
+		serverName: "服务器名称",
+		keywordPlaceholder: "请输入搜索关键字",
+		on: "启 用",
+		off: "禁 用",
+		delete: "删 除",
+		unStarted: "未启动",
+		started: "启动",
+		editServer: "编辑服务器",
+		addServer: "新增服务器",
+		basicInfo: "基本信息",
+		name: "名称",
+		namePlaceholder: "请填写名称",
+		type: "类型",
+		typePlaceholder: "请选择类型",
+		stickRule: "粘拆包规则",
+		separator: "分隔符",
+		separatorPlaceholder: "请填写分隔符",
+		customScript: "自定义脚本",
+		customScriptPlaceholder: "请填写自定义脚本",
+		fixedLength: "固定长度",
+		fixedLengthPlaceholder: "请填写固定长度",
+		length: "长度",
+		lengthKey: "长度字段",
+		lengthPlaceholder: "请填写长度",
+		offset: "偏移量",
+		offsetPlaceholder: "请填写偏移量",
+		endian: "大小端",
+		endianPlaceholder: "请选择大小端",
+		bigEndian: "大端",
+		littleEndian: "小端",
+		addr: "地址",
+		port: "端口号",
+		isTls: "开启TLS",
+		yes: "是",
+		no: "否",
+		authType: "接入方式",
+		authTypePlaceholder: "请选择接入方式",
+		certificate: "证书",
+		user: "用户名",
+		userPlaceholder: "请填写用户名",
+		password: "密码",
+		passwordPlaceholder: "请填写密码",
+		accessTokenPlaceholder: "请填写Aceess Token",
+		chooseCertificate: "选择证书",
+		certificatePlaceholder: "请选择证书",
+		enable: "启用",
+		register: "注册包",
+		regex: "正则表达式",
+		regexPlaceholder: "请填写正则表达式",
+		protocolAdaptation: "协议适配",
+		protocol: "协议",
+		protocolPlaceholder: "请选择协议适配",
+		protocolParams: "协议参数",
+		"TCP服务器": "TCP服务器",
+		"UDP服务器": "UDP服务器",
+		"MQTT 服务": "MQTT 服务",
+		"HTTP 服务": "HTTP 服务",
+		"WebSocket 服务": "WebSocket 服务",
+		"TF100设备与服务通讯协议": "TF100设备与服务通讯协议",
+		"editStatus": "修改状态",
+		"unknown": "未知",
+		"serverDetail": "服务器详情"
 	}
 }

+ 67 - 2
src/i18n/pages/iotmanagerI18n/zh-tw.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:45
+ * @LastEditTime: 2025-08-30 22:21:06
  * @FilePath: /sagoo-admin-ui/src/i18n/pages/iotmanager/zh-tw.ts
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -381,7 +381,7 @@ export default {
 		formI18nButton: {
 		}
 	},
-		// 组态管理
+	// 组态管理
 	configuration: {
 		// 大屏设计
 		designScreen: {
@@ -427,5 +427,70 @@ export default {
 		tip1: "開啟後會覆蓋節點的調試模式配置,所有節點會打印調試日誌",
 		description: "說明",
 		nameValidator: "規則名稱不能為空"
+	},
+	// 伺服器管理
+	server: {
+		serverName: "伺服器名稱",
+		keywordPlaceholder: "請輸入搜尋關鍵字",
+		on: "啟 用",
+		off: "禁 用",
+		delete: "刪 除",
+		unStarted: "未啟動",
+		started: "啟動",
+		editServer: "編輯伺服器",
+		addServer: "新增伺服器",
+		basicInfo: "基本資訊",
+		name: "名稱",
+		namePlaceholder: "請填寫名稱",
+		type: "類型",
+		typePlaceholder: "請選擇類型",
+		stickRule: "黏拆包規則",
+		separator: "分隔符",
+		separatorPlaceholder: "請填寫分隔符",
+		customScript: "自定義腳本",
+		customScriptPlaceholder: "請填寫自定義腳本",
+		fixedLength: "固定長度",
+		fixedLengthPlaceholder: "請填寫固定長度",
+		length: "長度",
+		lengthKey: "長度欄位",
+		lengthPlaceholder: "請填寫長度",
+		offset: "偏移量",
+		offsetPlaceholder: "請填寫偏移量",
+		endian: "大小端",
+		endianPlaceholder: "請選擇大小端",
+		bigEndian: "大端",
+		littleEndian: "小端",
+		addr: "地址",
+		port: "埠號",
+		isTls: "開啟TLS",
+		yes: "是",
+		no: "否",
+		authType: "接入方式",
+		authTypePlaceholder: "請選擇接入方式",
+		certificate: "憑證",
+		user: "用戶名",
+		userPlaceholder: "請填寫用戶名",
+		password: "密碼",
+		passwordPlaceholder: "請填寫密碼",
+		accessTokenPlaceholder: "請填寫Access Token",
+		chooseCertificate: "選擇憑證",
+		certificatePlaceholder: "請選擇憑證",
+		enable: "啟用",
+		register: "註冊包",
+		regex: "正則表達式",
+		regexPlaceholder: "請填寫正則表達式",
+		protocolAdaptation: "協議適配",
+		protocol: "協議",
+		protocolPlaceholder: "請選擇協議適配",
+		protocolParams: "協議參數",
+		"TCP服務器": "TCP服務器",
+		"UDP服務器": "UDP服務器",
+		"MQTT 服務": "MQTT 服務",
+		"HTTP 服務": "HTTP 服務",
+		"WebSocket 服務": "WebSocket 服務",
+		"TF100设备与服务通讯协议": "TF100設備與服務通訊協議",
+		"editStatus": "修改狀態",
+		"unknown": "未知",
+		"serverDetail": "伺服器詳情"
 	}
 };

+ 8 - 3
src/i18n/pages/tableI18n/en.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:30:08
+ * @LastEditTime: 2025-08-30 20:58:42
  * @FilePath: /sagoo-admin-ui/src/i18n/pages/tableI18n/en.ts
  * @Description: 表格国际化 - 英文
  */
@@ -14,7 +14,11 @@ export default {
 		operation: "Operation",
 		des: "Description",
 		createdAt: "Create Time",
-		updatedAt: "Update Time"
+		updatedAt: "Update Time",
+		name: "Name",
+		type: "Type",
+		addr: "Address",
+		status: "Status",
 	},
 	tableI18nConfirm: {
 		deleteTitle: "Confirm",
@@ -27,7 +31,8 @@ export default {
 		deleteSelectedMessage: "Are you sure you want to delete the selected data?",
 		selectDataFirst: "Please select the data to delete first.",
 		saveSuccess: "Saved successfully",
-		handleSuccess: "Operate successfully"
+		handleSuccess: "Operate successfully",
+		handleFailed: "Operation failed"
 	},
 	tableI18nAction: {
 		detail: "Detail",

+ 5 - 1
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 20:01:55
+ * @LastEditTime: 2025-08-30 20:45:34
  * @FilePath: /sagoo-admin-ui/src/i18n/pages/tableI18n/zh-cn.ts
  * @Description: 表格国际化 - 简体中文
  */
@@ -15,6 +15,10 @@ export default {
 		des: "描述",
 		createdAt: "创建时间",
 		updatedAt: "更新时间",
+		name: "名称",
+		type: "类型",
+		addr: "地址",
+		status: "状态",
 	},
 	tableI18nConfirm: {
 		deleteTitle: "提示",

+ 42 - 23
src/views/iot/network/server/component/list.vue

@@ -1,36 +1,48 @@
 <template>
   <el-table v-loading="loading" :data="data" style="width: 100%">
-    <el-table-column align="center" prop="id" label="ID" width="100" v-col="'id'" />
-    <!-- <el-table-column align="center" prop="server" label="服务器"/> -->
-    <el-table-column align="center" prop="name" label="名称" v-col="'name'" />
-    <el-table-column align="center" prop="types" v-col="'types'" label="类型" :formatter="(a) => typesFormat(a.types)" />
-    <el-table-column align="center" prop="addr" label="地址" v-col="'addr'" />
-    <el-table-column show-overflow-tooltip align="center" prop="createdAt" label="创建时间" width="170" v-col="'createdAt'" />
-    <!-- <el-table-column align="center" prop="last" label="最近上线"/> -->
-    <el-table-column align="center" prop="types" label="状态" v-col="'status'">
+    <!-- ID -->
+    <el-table-column align="center" prop="id" :label="$t('message.tableI18nColumn.id')" width="100" v-col="'id'" />
+    <!-- 名称 -->
+    <el-table-column min-width="140" show-overflow-tooltip align="center" prop="name" :label="$t('message.tableI18nColumn.name')" v-col="'name'" />
+    <!-- 类型 -->
+    <el-table-column min-width="140" show-overflow-tooltip align="center" prop="types" v-col="'types'" :label="$t('message.tableI18nColumn.type')" :formatter="(a:any) => typesFormat(a.types)" />
+    <!-- 地址 -->
+    <el-table-column min-width="140" show-overflow-tooltip align="center" prop="addr" :label="$t('message.tableI18nColumn.addr')" v-col="'addr'" />
+    <!-- 创建时间 -->
+    <el-table-column show-overflow-tooltip align="center" prop="createdAt" :label="$t('message.tableI18nColumn.createdAt')" width="170" v-col="'createdAt'" />
+    <!-- 状态 -->
+    <el-table-column align="center" prop="types" :label="$t('message.tableI18nColumn.status')" v-col="'status'">
       <template #default="scope">
-        <el-tag v-if="!scope.row.status" class="ml-2" type="info">未启动</el-tag>
-        <el-tag v-else class="ml-2" type="success">启动</el-tag>
+        <!-- 未启动 -->
+        <el-tag v-if="!scope.row.status" class="ml-2" type="info">{{ $t('message.server.unStarted') }}</el-tag>
+        <!-- 启动 -->
+        <el-tag v-else class="ml-2" type="success">{{ $t('message.server.started') }}</el-tag>
       </template>
     </el-table-column>
-    <el-table-column align="center" label="操作" width="200" v-col="'auth'">
+    <!-- 操作 -->
+    <el-table-column fixed="right" align="center" :label="$t('message.tableI18nColumn.operation')" width="200" v-col="'auth'">
       <template #default="scope">
-
-        <el-button @click="toDetail(scope.row.id)" size="small" text type="primary" v-auth="'detail'">详情</el-button>
-        <el-button size="small" link key="info" type="info" v-auth="'edit'" @click="toEdit(scope.row.id)">编辑</el-button>
-
-        <el-popover placement="bottom" :width="170" trigger="click">
+        <!-- 详情 -->
+        <el-button @click="toDetail(scope.row.id)" size="small" text type="primary" v-auth="'detail'">{{ $t('message.tableI18nAction.detail') }}</el-button>
+        <!-- 编辑 -->
+        <el-button size="small" link key="info" type="info" v-auth="'edit'" @click="toEdit(scope.row.id)">{{ $t('message.tableI18nAction.edit') }}</el-button>
+        <el-popover placement="bottom" :width="currentLocale == 'en' ? '196px' : '170px'" trigger="click">
           <template #reference>
-            <el-button size="small" text type="primary" class="more-btn" @click="isShowMore = !isShowMore" v-auth="'more'">更多
+            <!-- 更多 -->
+            <el-button size="small" text type="primary" class="more-btn" @click="isShowMore = !isShowMore" v-auth="'more'">
+              {{ $t('message.tableI18nAction.more') }}
               <i style="margin-left: 2px;" :class="isShowMore ? 'fa fa-angle-down' : 'fa fa-angle-up'"></i>
             </el-button>
           </template>
           <div class="more-opearte-wrap">
-            <el-button @click="onChangeStatus(scope.row.id, 1)" :disabled="scope.row.status" link size="small" key="success" type="success" v-auth="'on'">启 用</el-button>
+            <!-- 启 用 -->
+            <el-button @click="onChangeStatus(scope.row.id, 1)" :disabled="scope.row.status" link size="small" key="success" type="success" v-auth="'on'">{{ $t('message.server.on') }}</el-button>
             <el-divider direction="vertical" />
-            <el-button @click="onChangeStatus(scope.row.id, 0)" :disabled="!scope.row.status" link size="small" key="warning" type="warning" v-auth="'off'">禁 用</el-button>
+            <!-- 禁 用 -->
+            <el-button @click="onChangeStatus(scope.row.id, 0)" :disabled="!scope.row.status" link size="small" key="warning" type="warning" v-auth="'off'">{{ $t('message.server.off') }}</el-button>
             <el-divider direction="vertical" />
-            <el-button @click="onRowDel(scope.row)" link size="small" key="danger" type="danger" v-auth="'delete'">删 除</el-button>
+            <!-- 删 除 -->
+            <el-button @click="onRowDel(scope.row)" link size="small" key="danger" type="danger" v-auth="'delete'">{{ $t('message.server.delete') }}</el-button>
           </div>
         </el-popover>
       </template>
@@ -42,11 +54,12 @@
 </template>
 
 <script lang="ts">
-import { toRefs, reactive, onMounted, getCurrentInstance, unref, defineComponent } from 'vue';
+import { toRefs, reactive, onMounted, getCurrentInstance, unref, defineComponent, computed} from 'vue';
 import { ElMessageBox, ElMessage } from 'element-plus';
 import { useRouter } from 'vue-router';
-
 import api from '/@/api/network';
+import { useI18n } from 'vue-i18n';
+
 
 // 定义接口来定义对象的类型
 interface TableDataForm {
@@ -82,6 +95,10 @@ export default defineComponent({
 
     const { network_server_type } = proxy.useDict('network_server_type');
 
+    const { locale} = useI18n();
+
+    const currentLocale = computed(() => locale.value);
+
     const typesFormat = (types: string) => {
       return proxy.selectDictLabel(unref(network_server_type), types);
     };
@@ -101,6 +118,7 @@ export default defineComponent({
     // 改变状态
     const onChangeStatus = (id: number, status: number) => {
       api.server.changeServerStatus({ id: id, status: status }).then(() => {
+        // 已开启 / 已关闭
         ElMessage.success(status ? '已开启' : '已关闭');
         fetchList();
       })
@@ -147,6 +165,7 @@ export default defineComponent({
         .then(() => {
           api.server.deleteItem({ ids: [row.id] }).then(() => {
             fetchList()
+            // 删除成功
             ElMessage.success('删除成功');
           });
         })
@@ -163,6 +182,7 @@ export default defineComponent({
       initTableData();
     });
     return {
+      currentLocale,
       fetchList,
       toDetail,
       toEdit,
@@ -181,6 +201,5 @@ export default defineComponent({
 :deep(div.more-opearte-wrap) {
   flex-direction: row;
   background-color: pink;
-  // padding: 4px!important;
 }
 </style>

+ 38 - 14
src/views/iot/network/server/component/serverDetail.vue

@@ -1,24 +1,47 @@
+<!--
+ * @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 22:13:54
+ * @FilePath: /sagoo-admin-ui-dev/src/views/iot/network/server/component/serverDetail.vue
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+-->
 <!-- 服务器详情页 -->
 <template>
 	<el-descriptions :column="2" border>
-		<el-descriptions-item label="名称">{{ detail.name }}</el-descriptions-item>
-		<el-descriptions-item label="类型">{{ detail.types }}</el-descriptions-item>
-		<el-descriptions-item label="地址">{{ detail.addr }}</el-descriptions-item>
-		<el-descriptions-item label="状态">{{ detail.status ? '启动' : '未启动' }}</el-descriptions-item>
-		<el-descriptions-item label="开启TLS">{{ detail.isTls ? '是' : '否' }}</el-descriptions-item>
-		<el-descriptions-item label="认证方式">
-			{{ detail.authType === 1 ? 'Basic' : detail.authType === 2 ? 'AccessToken' : detail.authType === 3 ? '证书' : '未知' }}
+		<!-- 名称 -->
+		<el-descriptions-item :label="$t('message.server.name')">{{ detail.name }}</el-descriptions-item>
+		<!-- 类型 -->
+		<el-descriptions-item :label="$t('message.server.type')">{{ detail.types }}</el-descriptions-item>
+		<!-- 地址 -->
+		<el-descriptions-item :label="$t('message.server.addr')">{{ detail.addr }}</el-descriptions-item>
+		<!-- 状态 -->
+		<!-- 启动/未启动 -->
+		<el-descriptions-item :label="$t('message.tableI18nColumn.status')">{{ detail.status ?  $t('message.server.started') : $t('message.server.unStarted') }}</el-descriptions-item>
+		<!-- 开启TLS -->
+		<el-descriptions-item :label="$t('message.server.isTls')">{{ detail.isTls ? $t('message.server.yes') : $t('message.server.no') }}</el-descriptions-item>
+		<!-- 认证方式 -->
+		<el-descriptions-item :label="$t('message.server.authType')">
+			<!-- 证书/未知 -->
+			{{ detail.authType === 1 ? 'Basic' : detail.authType === 2 ? 'AccessToken' : detail.authType === 3 ? $t('message.server.certificate') : $t('message.server.unknown') }}
 		</el-descriptions-item>
 		<el-descriptions-item v-if="detail.authType === 2" label="AccessToken">{{ detail.accessToken }}</el-descriptions-item>
-		<el-descriptions-item v-if="detail.authType === 1" label="用户">{{ detail.authUser }}</el-descriptions-item>
-		<el-descriptions-item v-if="detail.authType === 1" label="密码">{{ detail.authPasswd }}</el-descriptions-item>
-		<el-descriptions-item label="正则表达式">{{ detail.register ? JSON.parse(detail.register).regex : '' }}</el-descriptions-item>
-		<el-descriptions-item label="协议">{{ detail.protocol ? JSON.parse(detail.protocol).name : '' }}</el-descriptions-item>
-		<el-descriptions-item label="协议参数">{{ detail.protocol ? JSON.parse(detail.protocol).options : '' }}</el-descriptions-item>
-		<el-descriptions-item label="修改状态">
+		<!-- 用户 -->
+		<el-descriptions-item v-if="detail.authType === 1" :label="$t('message.server.user')">{{ detail.authUser }}</el-descriptions-item>
+		<!-- 密码 -->
+		<el-descriptions-item v-if="detail.authType === 1" :label="$t('message.server.password')">{{ detail.authPasswd }}</el-descriptions-item>
+		<!-- 正则表达式 -->
+		<el-descriptions-item :label="$t('message.server.regex')">{{ detail.register ? JSON.parse(detail.register).regex : '' }}</el-descriptions-item>
+		<!-- 协议 -->
+		<el-descriptions-item :label="$t('message.server.protocol')">{{ detail.protocol ? JSON.parse(detail.protocol).name : '' }}</el-descriptions-item>
+		<!-- 协议参数 -->
+		<el-descriptions-item :label="$t('message.server.protocolParams')">{{ detail.protocol ? JSON.parse(detail.protocol).options : '' }}</el-descriptions-item>
+		<!-- 修改状态 -->
+		<el-descriptions-item :label="$t('message.server.editStatus')">
 			<el-switch :loading="loading" :before-change="onChangeStatus" :active-value="1" :inactive-value="0" size="small" v-model="detail.status" />
 		</el-descriptions-item>
-		<el-descriptions-item label="创建时间">{{ detail.createdAt }}</el-descriptions-item>
+		<!-- 创建时间 -->
+		<el-descriptions-item :label="$t('message.tableI18nColumn.createdAt')">{{ detail.createdAt }}</el-descriptions-item>
 	</el-descriptions>
 </template>
 <script lang="ts" setup>
@@ -44,6 +67,7 @@ const onChangeStatus = () => {
 		api.server
 			.changeServerStatus({ id: props.detail.id, status })
 			.then(() => {
+				// 已启动/未启动
 				ElMessage.success(props.detail.status ? '已启动' : '未启动')
 				emit('update:detail', { ...props.detail, status })
 			})

+ 120 - 63
src/views/iot/network/server/createOrEdit.vue

@@ -1,103 +1,148 @@
 <template>
   <div class="page bg padding border page-full Ipt-2" style="position: relative;">
     <el-tabs v-model="activeName">
-      <el-tab-pane :label="form.id ? '编辑服务器' : '新建服务器'" name="first">
+      <!-- 编辑服务器/新增服务器 -->
+      <el-tab-pane :label="form.id ? $t('message.server.editServer') : $t('message.server.addServer')" name="first">
         <el-collapse v-model="activeViewName">
-          <el-collapse-item title="基本信息" name="1">
+          <!-- 基本信息 -->
+          <el-collapse-item :title="$t('message.server.basicInfo')" name="1">
             <div class="collapse-wrap">
-              <el-form style="width: 600px;margin: 0 auto;" :model="form" label-width="98px">
-                <el-form-item label="名称">
-                  <el-input v-model="form.name" show-word-limit maxlength="20" placeholder="请填写名称" />
+              <el-form :model="form" :label-width="currentLocale == 'en' ? '150px' : '98px'">
+                <!-- 名称 -->
+                <el-form-item :label="$t('message.server.name')">
+                  <!-- 请填写名称 -->
+                  <el-input v-model="form.name" show-word-limit maxlength="20" :placeholder="$t('message.server.namePlaceholder')" />
                 </el-form-item>
-                <el-form-item label="类型">
-                  <el-select v-model="form.types" placeholder="请选择类型">
-                    <el-option v-for="dict in network_server_type" :key="dict.value" :label="dict.label" :value="dict.value">
+                <!-- 类型 -->
+                <el-form-item :label="$t('message.server.type')">
+                  <!-- 请选择类型 -->
+                  <el-select v-model="form.types" :placeholder="$t('message.server.typePlaceholder')" >
+                    <el-option v-for="dict in network_server_type" :key="dict.value" :label="$t('message.server.'+ dict.label)" :value="dict.value">
                     </el-option>
                   </el-select>
                 </el-form-item>
-                <el-form-item v-if="form.types == 'tcp'" label="粘拆包规则">
-                  <el-select @change="initData" v-model="stickValue" placeholder="请选择类型">
+                <!-- 粘拆包规则 -->
+                <el-form-item v-if="form.types == 'tcp'" :label="$t('message.server.stickRule')">
+                  <!-- 请选择类型 -->
+                  <el-select @change="initData" v-model="stickValue" :placeholder="$t('message.server.typePlaceholder')">
                     <el-option v-for="dict in stick_type" :key="dict.value" :label="dict.label" :value="dict.value">
                     </el-option>
                   </el-select>
                 </el-form-item>
                 <el-form-item v-if="form.types == 'tcp' && stickValue">
-                  <el-form-item v-if="stickValue == '分隔符'" class="flex-column" label="分隔符">
-                    <el-input v-model="stickData['delimit,omitempty']" placeholder="请填写分隔符" />
+                  <!-- 分隔符 -->
+                  <el-form-item v-if="stickValue == '分隔符'" class="flex-column" :label="$t('message.server.separator')">
+                    <!-- 请填写分隔符 -->
+                    <el-input v-model="stickData['delimit,omitempty']" :placeholder="$t('message.server.separatorPlaceholder')" />
                   </el-form-item>
-                  <el-form-item v-if="stickValue == '自定义脚本'" class="flex-column" label="自定义脚本">
-                    <el-input v-model="stickData['custom,omitempty']" placeholder="请填写自定义脚本" />
+                  <!-- 自定义脚本 -->
+                  <el-form-item v-if="stickValue == '自定义脚本'" class="flex-column" l:abel="$t('message.server.customScript')">
+                    <!-- 请填写自定义脚本 -->
+                    <el-input v-model="stickData['custom,omitempty']" :placeholder="$t('message.server.customScriptPlaceholder')" />
                   </el-form-item>
-                  <el-form-item v-if="stickValue == '固定长度'" class="flex-column" label="固定长度">
-                    <el-input type="number" v-model="stickData['fixedLen,omitempty']" placeholder="请填写固定长度" />
+                  <!-- 固定长度 -->
+                  <el-form-item v-if="stickValue == '固定长度'" class="flex-column" :label="$t('message.server.fixedLength')">
+                    <!-- 请填写固定长度 -->
+                    <el-input type="number" v-model="stickData['fixedLen,omitempty']" :placeholder="$t('message.server.fixedLengthPlaceholder')" />
                   </el-form-item>
-                  <el-form-item v-if="stickValue == '长度字段'" class="flex-column" label="长度">
-                    <el-input type="number" v-model="stickData['len,omitempty']['len']" placeholder="请填写长度" />
+                  <!-- 长度字段 -->
+                  <el-form-item v-if="stickValue == '长度字段'" class="flex-column" :label="$t('message.server.length')">
+                    <!-- 请填写长度 -->
+                    <el-input type="number" v-model="stickData['len,omitempty']['len']" :placeholder="$t('message.server.lengthPlaceholder')" />
                   </el-form-item>
-                  <el-form-item v-if="stickValue == '长度字段'" class="flex-column" label="偏移量">
-                    <el-input type="number" v-model="stickData['len,omitempty']['offset']" placeholder="请填写偏移量" />
+                  <!-- 偏移量 -->
+                  <el-form-item v-if="stickValue == '长度字段'" class="flex-column" :label="$t('message.server.offset')">
+                    <!-- 请填写偏移量 -->
+                    <el-input type="number" v-model="stickData['len,omitempty']['offset']" :placeholder="$t('message.server.offsetPlaceholder')" />
                   </el-form-item>
-                  <el-form-item v-if="stickValue == '长度字段'" class="flex-column" label="大小端">
-                    <el-select v-model="stickData['len,omitempty']['endian']" placeholder="请选择大小端">
-                      <el-option label="大端" value="大端" />
-                      <el-option label="小端" value="小端" />
+                  <!-- 大小端 -->
+                  <el-form-item v-if="stickValue == '长度字段'" class="flex-column" :label="$t('message.server.endian')">
+                    <!-- 请选择大小端 -->
+                    <el-select v-model="stickData['len,omitempty']['endian']" :placeholder="$t('message.server.endianPlaceholder')">
+                      <!-- 大端 -->
+                      <el-option :label="$t('message.server.bigEndian')" value="大端" />
+                      <!-- 小端 -->
+                      <el-option :label="$t('message.server.littleEndian')" value="小端" />
                     </el-select>
                   </el-form-item>
                 </el-form-item>
-                <el-form-item label="地址">
-                  <el-input v-model="form.addr" placeholder="端口号" />
+                <!-- 地址 -->
+                <el-form-item :label="$t('message.server.addr')">
+                  <!-- 端口号 -->
+                  <el-input v-model="form.addr" :placeholder="$t('message.server.port')" />
                 </el-form-item>
-                <el-form-item label="开启TLS">
+                <!-- 开启TLS -->
+                <el-form-item :label="$t('message.server.isTls')">
                   <el-radio-group v-model="form.isTls" class="ml-4">
-                    <el-radio :label="1">是</el-radio>
-                    <el-radio :label="0">否</el-radio>
+                    <!-- 是 -->
+                    <el-radio :label="1">{{$t('message.server.yes')}}</el-radio>
+                    <!-- 否 -->
+                    <el-radio :label="0">{{$t('message.server.no')}}</el-radio>
                   </el-radio-group>
                 </el-form-item>
-                <el-form-item v-if="form.isTls == 1" label="接入方式">
-                  <el-select @change="authTypeChange" v-model="form.authType" placeholder="选择接入方式">
+                <!-- 接入方式 -->
+                <el-form-item v-if="form.isTls == 1" :label="$t('message.server.authType')">
+                  <!-- 选择接入方式 -->
+                  <el-select @change="authTypeChange" v-model="form.authType" :placeholder="$t('message.server.authTypePlaceholder')">
                     <el-option label="Basic" :value="1" />
                     <el-option label="AccessToken" :value="2" />
-                    <el-option label="证书" :value="3" />
+                    <!-- 证书 -->
+                    <el-option :label="$t('message.server.certificate')" :value="3" />
                   </el-select>
-                  <el-form-item v-if="form.authType == 1" class="flex-column" label="用户名">
-                    <el-input v-model="form.authUser" placeholder="请填写用户名" />
+                  <!-- 用户名 -->
+                  <el-form-item v-if="form.authType == 1" class="flex-column" :label="$t('message.server.user')">
+                    <!-- 请填写用户名 -->
+                    <el-input v-model="form.authUser" :placeholder="$t('message.server.userPlaceholder')" />
                   </el-form-item>
-                  <el-form-item v-if="form.authType == 1" class="flex-column" label="密码">
-                    <el-input v-model="form.authPasswd" placeholder="请填写密码" />
+                  <!-- 密码 -->
+                  <el-form-item v-if="form.authType == 1" class="flex-column" :label="$t('message.server.password')">
+                    <!-- 请填写密码 -->
+                    <el-input v-model="form.authPasswd" :placeholder="$t('message.server.passwordPlaceholder')" />
                   </el-form-item>
                   <el-form-item v-if="form.authType == 2" class="flex-column" label="Aceess Token">
-                    <el-input v-model="form.accessToken" placeholder="请填写Aceess Token" />
+                    <!-- 请填写Aceess Token -->
+                    <el-input v-model="form.accessToken" :placeholder="$t('message.server.accessTokenPlaceholder')" />
                   </el-form-item>
                 </el-form-item>
-                <el-form-item v-if="form.isTls == 1 && form.authType == 3" label="选择证书">
-                  <el-select v-model="form.certificateId" placeholder="请选择证书">
+                <!-- 选择证书 -->
+                <el-form-item v-if="form.isTls == 1 && form.authType == 3" :label="$t('message.server.chooseCertificate')">
+                  <!-- 请选择证书 -->
+                  <el-select v-model="form.certificateId" :placeholder="$t('message.server.certificatePlaceholder')">
                     <el-option v-for="item in certificateList" :key="item.id" :label="item.name" :value="item.id">
                     </el-option>
                   </el-select>
                 </el-form-item>
-                <el-form-item label="启用">
+                <!-- 启用 -->
+                <el-form-item :label="$t('message.server.enable')">
                   <el-switch :active-value="1" :inactive-value="0" v-model="form.status" />
                 </el-form-item>
               </el-form>
             </div>
           </el-collapse-item>
-          <el-collapse-item title="注册包" name="2">
-            <el-form style="width: 600px;margin: 0 auto;" :model="form" label-width="98px">
-              <el-form-item label="正则表达式">
-                <el-input v-model="form.register.regex" placeholder="请填写名称" />
+          <!-- 注册包 -->
+          <el-collapse-item :title="$t('message.server.register')" name="2">
+            <el-form :model="form" :label-width="currentLocale == 'en' ? '150px' : '98px'">
+              <!-- 正则表达式 -->
+              <el-form-item :label="$t('message.server.regex')">
+                <!-- 请填写正则表达式 -->
+                <el-input v-model="form.register.regex" :placeholder="$t('message.server.regexPlaceholder')" />
               </el-form-item>
             </el-form>
           </el-collapse-item>
-          <el-collapse-item title="协议适配" name="3">
-            <el-form style="width: 600px;margin: 0 auto;" :model="form" label-width="98px">
-              <el-form-item label="协议">
-                <el-select v-model="form.protocol.name" placeholder="请选择协议适配">
-                  <el-option v-for="dict in messageData" :key="dict.types" :label="dict.title" :value="dict.name"></el-option>
+          <!-- 协议适配 -->
+          <el-collapse-item :title="$t('message.server.protocolAdaptation')" name="3">
+            <el-form :model="form"  :label-width="currentLocale == 'en' ? '150px' : '98px'">
+              <!-- 协议 -->
+              <el-form-item :label="$t('message.server.protocol')">
+                <!-- 请选择协议适配 -->
+                <el-select v-model="form.protocol.name" :placeholder="$t('message.server.protocolPlaceholder')">
+                  <el-option v-for="dict in messageData" :key="dict.types" :label="$t('message.server.'+dict.title)" :value="dict.name"></el-option>
                   <!-- 增加系统默认的mqtt选项 -->
                   <el-option label="Sagoo Mqtt" value="SagooMqtt"> </el-option>
                 </el-select>
               </el-form-item>
-              <el-form-item label="协议参数">
+              <!-- 协议参数 -->
+              <el-form-item :label="$t('message.server.protocolParams')">
                 <codeEditor class="params" ref="mirrorRef" :mode="resourceModalPro.mode" :content="resourceModalPro.content">
                 </codeEditor>
               </el-form-item>
@@ -107,19 +152,26 @@
       </el-tab-pane>
     </el-tabs>
     <div style="position: absolute;right:20px;top: 14px;">
-      <el-button size="small" @click="$router.replace('/iotmanager/network/server')">取消</el-button>
-      <el-button @click="submit" size="small" type="primary">提交</el-button>
+      <!-- 取消 -->
+      <el-button size="small" @click="$router.replace('/iotmanager/network/server')">{{ $t('message.formI18nButton.cancel') }}</el-button>
+      <!-- 编辑/新增 -->
+      <el-button @click="submit" size="small" type="primary">{{ form.id ? $t('message.formI18nButton.edit') : $t('message.formI18nButton.add') }}</el-button>
     </div>
   </div>
 </template>
 <script lang="ts" setup name="serverCreateOrEdit">
-import { watch, onMounted, ref, getCurrentInstance, nextTick } from 'vue';
+import { watch, onMounted, ref, getCurrentInstance, nextTick, computed } from 'vue';
 import { ElMessage } from 'element-plus';
 import { useRoute, useRouter } from 'vue-router';
 import api from '/@/api/network';
 import api2 from '/@/api/system';
 import deviceApi from '/@/api/device'
 import codeEditor from "/@/components/codeEditor/index.vue"
+import { useI18n } from 'vue-i18n';
+// 国际化
+const { locale, t } = useI18n();
+
+const currentLocale = computed(() => locale.value);
 
 const { proxy } = getCurrentInstance() as any;
 const route = useRoute();
@@ -137,20 +189,24 @@ const stickData = ref({
   }
 });
 const stick_type = ref([
+  // 分隔符
   {
-    label: "分隔符",
+    label: t('message.server.separator'),
     value: "分隔符"
   },
+  // 自定义脚本
   {
-    label: "自定义脚本",
+    label: t('message.server.customScript'),
     value: "自定义脚本"
   },
+  // 固定长度
   {
-    label: "固定长度",
+    label: t('message.server.fixedLength'),
     value: "固定长度"
   },
+  // 长度字段
   {
-    label: "长度字段",
+    label: t('message.server.lengthKey'),
     value: "长度字段"
   }
 ]);
@@ -158,8 +214,8 @@ const resourceModalPro = ref({
   mode: '',
   content: ''
 });
-const messageData = ref([]);
-const certificateList = ref([]);
+const messageData = ref<any>([]);
+const certificateList = ref<any>([]);
 const activeViewName = ref(['1', '2', '3']);
 const form = ref<any>({
   id: '',
@@ -267,15 +323,15 @@ const submit = () => {
     params.protocol.options = eval("(" + mirrorRef.value.getValue() + ")")
   }
   if(params.id) {
-    // editItem
+    // 编辑成功
     api.server.editItem(params).then(() => {
-      ElMessage.success('修改成功')
+      ElMessage.success('编辑成功')
       goBack()
     });
   }else {
-    // addItem
+    // 新增成功
     api.server.addItem(params).then(() => {
-      ElMessage.success('添加成功')
+      ElMessage.success('新增成功')
       goBack()
     });
   }
@@ -323,6 +379,7 @@ const getCertificateList = () => {
 const getMessageData = () => {
   deviceApi.product.getTypesAll({ types: 'protocol' }).then((res: any) => {
     messageData.value = res || [];
+    console.log(messageData.value)
   });
 }
 

+ 2 - 1
src/views/iot/network/server/detail.vue

@@ -1,7 +1,8 @@
 <template>
 	<div class="page bg border padding Ipt-2" style="position: relative;">
 		<el-tabs v-model="activeName" @tab-click="handleClick">
-			<el-tab-pane label="服务器详情" name="first">
+			<!-- 服务器详情 -->
+			<el-tab-pane :label="$t('message.server.serverDetail')" name="first">
 				<serverDetail v-model:detail="detail" />
 			</el-tab-pane>
 			<!-- <el-tab-pane label="相关详情" name="second">相关详情</el-tab-pane>

+ 16 - 4
src/views/iot/network/server/index.vue

@@ -1,23 +1,35 @@
+<!--
+ * @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 22:14:42
+ * @FilePath: /sagoo-admin-ui-dev/src/views/iot/network/server/index.vue
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+-->
 <template>
   <div class="page">
     <el-card shadow="never">
       <el-form inline label-width="auto" @keyup.enter="searchData">
-        <el-form-item label="服务器名称">
-          <el-input style="width: 200px;" class="search-input" v-model="key" placeholder="请输入搜索关键字" clearable>
+        <!-- 服务器名称 -->
+        <el-form-item :label="$t('message.server.serverName')">
+          <!-- 请输入搜索关键字 -->
+          <el-input style="width: 210px;" class="search-input" v-model="key" :placeholder="$t('message.server.keywordPlaceholder')" clearable>
           </el-input>
         </el-form-item>
         <el-form-item>
+          <!-- 查询 -->
           <el-button type="primary" class="ml10" v-auth="'query'" @click="searchData">
             <el-icon>
               <ele-Search />
             </el-icon>
-            查询
+            {{ $t('message.formI18nButton.query') }}
           </el-button>
+          <!-- 新增 -->
           <el-button @click="toPage" type="primary" v-auth="'add'" class="ml10">
             <el-icon>
               <ele-FolderAdd />
             </el-icon>
-            新建
+            {{ $t('message.formI18nButton.add') }}
           </el-button>
         </el-form-item>
       </el-form>