Переглянути джерело

Merge pull request #256 from crush394/next-dev

next-dev translate
Lind 4 роки тому
батько
коміт
fdc80afa7c
44 змінених файлів з 807 додано та 518 видалено
  1. 0 6
      src/app.tsx
  2. 1 1
      src/locales/en-US/menu.ts
  3. 85 49
      src/locales/en-US/pages.ts
  4. 70 30
      src/locales/zh-CN/pages.ts
  5. 2 165
      src/pages/Analysis/DeviceChart/index.tsx
  6. 0 2
      src/pages/cloud/Onenet/index.tsx
  7. 2 2
      src/pages/device/Alarm/index.tsx
  8. 3 3
      src/pages/device/Category/index.tsx
  9. 9 9
      src/pages/device/Command/index.tsx
  10. 3 3
      src/pages/device/Firmware/index.tsx
  11. 128 89
      src/pages/device/Instance/Detail/Config/Tags/index.tsx
  12. 68 9
      src/pages/device/Instance/Detail/Info/index.tsx
  13. 30 7
      src/pages/device/Instance/Detail/Metadata/ItemDetail/index.tsx
  14. 30 6
      src/pages/device/Instance/Detail/Metadata/ItemParam/index.tsx
  15. 45 6
      src/pages/device/Instance/Detail/Metadata/index.tsx
  16. 13 2
      src/pages/device/Instance/Detail/Running/index.tsx
  17. 79 44
      src/pages/device/Instance/Detail/index.tsx
  18. 7 7
      src/pages/device/Instance/index.tsx
  19. 2 2
      src/pages/device/Product/Detail/BaseInfo/index.tsx
  20. 75 11
      src/pages/device/Product/Detail/index.tsx
  21. 9 4
      src/pages/device/Product/index.tsx
  22. 2 2
      src/pages/edge/Device/index.tsx
  23. 21 6
      src/pages/edge/Product/index.tsx
  24. 1 1
      src/pages/link/Gateway/index.tsx
  25. 1 1
      src/pages/link/Protocol/index.tsx
  26. 1 1
      src/pages/link/Type/index.tsx
  27. 2 2
      src/pages/log/Access/index.tsx
  28. 1 1
      src/pages/log/System/index.tsx
  29. 21 6
      src/pages/media/Cascade/index.tsx
  30. 6 3
      src/pages/media/Device/index.tsx
  31. 2 2
      src/pages/notice/Config/index.tsx
  32. 1 1
      src/pages/rule-engine/Scene/index.tsx
  33. 2 2
      src/pages/simulator/Device/index.tsx
  34. 3 3
      src/pages/system/DataSource/index.tsx
  35. 3 3
      src/pages/system/OpenAPI/index.tsx
  36. 14 2
      src/pages/system/Org/NodeTemplate/index.tsx
  37. 18 4
      src/pages/system/Org/Save/index.tsx
  38. 30 7
      src/pages/system/Org/index.tsx
  39. 2 2
      src/pages/system/Permission/index.tsx
  40. 5 2
      src/pages/system/Role/index.tsx
  41. 2 2
      src/pages/system/Tenant/index.tsx
  42. 5 5
      src/pages/system/User/index.tsx
  43. 2 2
      src/pages/visualization/Configuration/index.tsx
  44. 1 1
      src/pages/visualization/Screen/index.tsx

+ 0 - 6
src/app.tsx

@@ -148,12 +148,6 @@ export const layout: RunTimeLayoutConfig = ({ initialState }) => {
           <Link to="/umi/plugin/openapi" target="_blank">
             <LinkOutlined />
             <span>OpenAPI 文档</span>
-            {/* <span>
-          { intl.formatMessage({
-                  id: 'pages.searchTable.new',
-                  defaultMessage: '新建',
-                 })}
-          </span> */}
           </Link>,
           <Link to="/~docs">
             <BookOutlined />

+ 1 - 1
src/locales/en-US/menu.ts

@@ -11,7 +11,7 @@ export default {
   'menu.system.open-api': 'OpenAPI',
   'menu.system.permission': 'Permission',
   'menu.system.tenant': 'Tenant',
-  'menu.system.datasource': 'Data Source',
+  'menu.system.datasource': 'DataSource',
   'menu.device': 'Device',
   'menu.device.product': 'Product',
   'menu.device.product-detail': 'ProductDetail',

+ 85 - 49
src/locales/en-US/pages.ts

@@ -26,6 +26,7 @@ export default {
   'pages.data.option.error': 'Operation failed!',
   'pages.data.option.detail': 'Detail',
   'pages.data.option.download': 'Download',
+  'pages.data.option.record': 'Records',
   'pages.searchTable.new': 'New',
   'pages.searchTable.titleStatus': 'Status',
   'pages.searchTable.titleStatus.all': 'All',
@@ -34,11 +35,14 @@ export default {
   'pages.searchTable.titleOption': 'Option',
   'pages.table.username': 'userName',
   'pages.table.name': 'Name',
-  'pages.table.equipmentName': 'Equipment Name',
+  'pages.table.deviceName': 'Device Name',
+  'pages.table.productName': 'Product Name',
   'pages.table.describe': 'Describe',
   'pages.table.description': 'Explain',
-  'pages.table.type': 'Type',
   'pages.table.provider': 'Provider',
+  'pages.table.type': 'Type',
+  'pages.table.deviceId': 'Device ID',
+
   // 统计分析
   'pages.analysis.cpu': 'CPU Usage',
   'pages.analysis.jvm': 'JVM Memory',
@@ -49,8 +53,8 @@ export default {
   'pages.system.user.name': 'name',
   'pages.system.user.password': 'password',
   'pages.system.user.confirmPassword': 'confirmPassword',
-  'pages.system.userName.tip': 'If the username is too long, it will automatically shrink',
-  'pages.system.user.name.tips': 'Names that are too long automatically shrink',
+  'pages.system.userName.tips': 'If the username is too long, it will automatically shrink',
+  'pages.system.name.tips': 'Names that are too long automatically shrink',
   // 角色管理
   'pages.system.role': 'Role',
   'pages.system.role.id': 'ID',
@@ -58,7 +62,7 @@ export default {
   // 系统设置-权限管理
   'pages.system.permission': 'Permission',
   'pages.system.permission.id': 'ID',
-  'pages.system.permission.name.tip': 'If the name is too long, it will automatically shrink',
+  'pages.system.permission.name.tips': 'If the name is too long, it will automatically shrink',
   'pages.system.permission.add': 'Add Entry',
   'pages.system.permission.addInformation': 'Basic Information',
   'pages.system.permission.addConfiguration': 'Operation Configuration',
@@ -69,11 +73,15 @@ export default {
   'pages.system.permission.addDataView': 'Data View',
   // 系统设置-机构管理
   'pages.system.org': 'Organization',
-  'pages.system.org.code': 'Code',
+  'pages.system.org.encoding': 'Code',
   'pages.system.org.count': 'Count',
+  'pages.system.org.add.orderNumber': 'Order Number',
+  'pages.system.org.option.bindUser': 'Bind User',
+  'pages.system.org.option.permission': 'Permission Distribution',
+  'pages.system.org.option.add': 'Add the lower',
   // 系统设置-第三方平台
   'pages.system.openApi': 'OpenAPI',
-  'pages.system.openApi.passWord': 'passWord',
+  'pages.system.openApi.password': 'password',
   'pages.system.openApi.ipWhileList': 'ipWhileList',
   // 系统设置-租户管理
   'pages.system.tenant': 'Tenant',
@@ -81,82 +89,115 @@ export default {
   'pages.system.tenant.avatar': 'Avatar',
   'pages.system.tenant.members': 'Members',
   // 系统设置-数据源管理
-  'pages.system.datasource.': 'Data Source',
+  'pages.system.datasource.': 'DataSource',
 
   // 设备管理-产品
-  'pages.device.product': 'Product',
-  'pages.device.product.list': 'Product List',
+  'pages.device.product': 'Product Manage',
   'pages.device.product.status.published': 'Published',
   'pages.device.product.status.unpublished': 'Unpublished',
   'pages.device.product.status.all': 'All',
   'pages.device.productDetail': 'ProductDetail',
+  'pages.device.productDetail.id': 'Product ID',
+  'pages.device.productDetail.classifiedName': 'Classified Name',
+  'pages.device.productDetail.protocolName': 'Message Protocol',
+  'pages.device.productDetail.transportProtocol': 'Link Protocol',
+  'pages.device.productDetail.createTime': 'Create Time',
+  'pages.device.productDetail.base': 'Configuration Information',
+  'pages.device.productDetail.metadata': 'Metadata',
+  'pages.device.productDetail.alarm': 'Alarm Set',
+  'pages.device.productDetail.setting': 'Application Settings',
+  'pages.device.productDetail.disable': 'Disable',
   // 设备管理-产品分类
-  'pages.device.category': 'Product Classification',
+  'pages.device.category': 'Category Manage',
   'pages.device.category.id': 'Classification ID',
-  'pages.device.category.logotype': 'Logotype',
+  'pages.device.category.key': 'Key',
   'pages.device.category.name': 'Classification Name',
+  'pages.device.category.addClass': 'Add Subclasses',
   // 设备管理-设备
-  'pages.device.instance': 'Equipment',
-  'pages.device.instance.management': 'Equipment Management',
-  'pages.device.instance.productName': 'Product Name',
+  'pages.device.instance': 'Instance Manage',
   'pages.device.instance.registrationTime': 'Registration Time',
-  'pages.device.instance.status.notEnabled': 'Not Enabled',
+  'pages.device.instance.status.notActive': 'Not Active',
   'pages.device.instance.status.offLine': 'Off Line',
   'pages.device.instance.status.onLine': 'On Line',
-  'pages.device.instance.describe': 'Explain',
+  'pages.device.instanceDetail.deviceType': 'Device Type',
+  'pages.device.instanceDetail.transportProtocol': 'Link Protocol',
+  'pages.device.instanceDetail.protocolName': 'Message Protocol',
+  'pages.device.instanceDetail.createTime': 'Create Time',
+  'pages.device.instanceDetail.registerTime': 'Register Time',
+  'pages.device.instanceDetail.lastTimeOnline': 'Last Time Online',
+  'pages.device.instanceDetail.property': 'Property',
+  'pages.device.instanceDetail.events': 'Events',
+  'pages.device.instanceDetail.function': 'Functions',
+  'pages.device.instanceDetail.tags': 'Tags',
+  'pages.device.instanceDetail.save': 'Save',
+  'pages.device.instanceDetail.detail': 'Detail',
+  'pages.device.instanceDetail.detail.sort': 'Sort',
+  'pages.device.instanceDetail.detail.value': 'Value',
+  'pages.device.instanceDetail.detail.tags': 'Tags',
+  'pages.device.instanceDetail.detail.addTags': 'Add Tags',
+  'pages.device.instanceDetail.running': 'Running',
+  'pages.device.instanceDetail.running.status': 'Device Status',
+  'pages.device.instanceDetail.running.onlineTime': 'Online Time',
+  'pages.device.instanceDetail.metadata': 'Metadata',
+  'pages.device.instanceDetail.metadata.logotype': 'Logotype',
+  'pages.device.instanceDetail.metadata.attributeName': 'Attribute Name',
+  'pages.device.instanceDetail.metadata.parameterName': 'Parameter Name',
+  'pages.device.instanceDetail.metadata.dataType': 'Data Type',
+  'pages.device.instanceDetail.metadata.readOnly': 'ReadOnly',
+  'pages.device.instanceDetail.metadata.unit': 'Unit',
+  'pages.device.instanceDetail.metadata.readOnly.yes': 'Yes',
+  'pages.device.instanceDetail.metadata.readOnly.no': 'No',
+  'pages.device.instanceDetail.functions': 'Functions',
+  'pages.device.instanceDetail.log': 'Log',
+  'pages.device.instanceDetail.alarm': 'Alarm',
+  'pages.device.instanceDetail.visualization': 'Visualization',
+  'pages.device.instanceDetail.shadow': 'Shadow',
   // 设备管理-指令下发
   'pages.device.command': 'Command',
-  'pages.device.command.id': 'Device ID',
   'pages.device.command.type': 'Instruction Type',
-  'pages.device.command.type.readAttributes': 'Read Attributes',
-  'pages.device.command.type.setProperties': 'Set Properties',
-  'pages.device.command.type.callAttribute': 'Call Attribute',
+  'pages.device.command.type.readProperty': 'READ_PROPERTY',
+  'pages.device.command.type.writeProperty': 'WRITE_PROPERTY',
+  'pages.device.command.type.invokeFunction': 'INVOKE_FUNCTION',
   'pages.device.command.option.send': 'Resend',
-  'pages.device.command.status.waiting': 'Waiting',
-  'pages.device.command.status.failed ': 'Failed to send',
-  'pages.device.command.status.succeed': 'Sent successfully',
-  'pages.device.command.errorMessage': 'Error Message',
+  'pages.device.command.status.wait': 'Wait',
+  'pages.device.command.status.sendError': 'Send Error',
+  'pages.device.command.status.success': 'Success',
+  'pages.device.command.lastError': 'Last Error',
   'pages.device.command.sendTime': 'Send Time',
   // 设备管理-固件升级
   'pages.device.firmware': 'Firmware',
-  'pages.device.firmware.name': 'Firmware Name',
-  'pages.device.firmware.version': 'Firmware version',
-  'pages.device.firmware.products': 'Products',
-  'pages.device.firmware.signature': 'Signature Method',
-  'pages.device.firmware.creationTime': 'Creation Time',
+  'pages.device.firmware.name': 'Name',
+  'pages.device.firmware.version': 'Version',
+  'pages.device.firmware.productName': 'Product Name',
+  'pages.device.firmware.signMethod': 'Sign Method',
+  'pages.device.firmware.createTime': 'Create Time',
   // 设备管理-告警记录
-  'pages.device.alarm': 'Alarm',
-  'pages.device.alarm.id': 'Device ID',
+  'pages.device.alarm': 'Alarm Record',
   'pages.device.alarm.name': 'Alarm Name',
   'pages.device.alarm.time': 'Alarm Time',
-  'pages.device.alarm.status': 'Processing State',
+  'pages.device.alarm.status': 'State',
   'pages.device.alarm.option.dispose': 'Dispose',
   'pages.device.alarm.option.data': 'Alarm Data',
   // 设备接入
   'pages.link.certificate': 'Certificate',
   'pages.link.protocol': 'Protocol',
-  'pages.link.component': 'Network components',
+  'pages.link.component': 'Component Manage',
   'pages.link.gateway': 'Gateway',
   'pages.link.opcua': 'OPC UA',
   'pages.link.type': 'Type',
-  'pages.link.provider': 'Provider',
   'pages.link.option.debug': 'Debug',
-  'pages.link.option.record': 'Record',
   // 通知管理
   'pages.notice.config': 'Config',
-  'pages.notice.config.provider': 'Provider',
   'pages.notice.config.type': 'Type',
   'pages.notice.template': 'Template',
-  'pages.notice.option.download': 'Download Configuration',
   'pages.notice.option.debug': 'Debug',
-  'pages.notice.option.record': 'Notification Records',
 
   // 规则引擎
   'pages.ruleEngine.instance': 'Instance',
   'pages.ruleEngine.sqlRule': 'SQL Rule',
   'pages.ruleEngine.sqlRule.time': 'Create Time',
   'pages.ruleEngine.scene': 'Scene',
-  'pages.ruleEngine.scene.trigger': 'Trigger',
+  'pages.ruleEngine.scene.triggers': 'Triggers',
   'pages.ruleEngine.option.detail': 'Detail',
   'pages.ruleEngine.option.start': 'Start',
   'pages.ruleEngine.option.restart': 'Restart',
@@ -167,23 +208,20 @@ export default {
   'pages.visualization.screen': 'Screen',
   'pages.visualization.configuration': 'Configuration',
   'pages.visualization.option.addClass': 'Add Subclasses',
-  'pages.visualization.option.record': 'Notification Records',
   'pages.visualization.option.copy': 'Copy',
 
   // 模拟测试
   'pages.simulator.device': 'Device',
-  'pages.simulator.device.networkType': 'Type',
 
   // 日志管理-访问日志
   'pages.log.access': 'Access Log',
-  'pages.log.access.requestPath': 'Request Path',
-  'pages.log.access.describe': 'Explain',
+  'pages.log.access.url': 'Url',
   'pages.log.access.requestTime': 'Request Time',
   'pages.log.access.requestTimeConsuming': 'Request Time Consuming',
   'pages.log.access.requestUser': 'Request User',
   // 日志管理-系统日志
   'pages.log.system': 'System Log',
-  'pages.log.system.thread': 'Thread',
+  'pages.log.system.threadName': 'Thread Name',
   'pages.log.system.level': 'Level',
   'pages.log.system.logContent': 'Log Content',
   'pages.log.system.serviceName': 'Service Name',
@@ -207,13 +245,11 @@ export default {
   'pages.media.device.manufacturer': 'Manufacturer',
   'pages.media.device.model': 'Model',
   'pages.media.device.firmware': 'Firmware',
-  'pages.media.device.networkType': 'Type',
   'pages.media.device': 'Device',
   'pages.media.reveal': 'Reveal',
   'pages.media.cascade': 'Cascade',
 
   // 边缘网关
-  'pages.edge.product': 'Product',
-  'pages.edge.device': 'Device',
-  'pages.edge.device.productName': 'Product Name',
+  'pages.edge.product': 'Product Manage',
+  'pages.edge.device': 'Device Manage',
 };

+ 70 - 30
src/locales/zh-CN/pages.ts

@@ -26,6 +26,7 @@ export default {
   'pages.data.option.error': '操作失败!',
   'pages.data.option.detail': '详情',
   'pages.data.option.download': '下载',
+  'pages.data.option.record': '通知记录',
   'pages.searchTable.new': '新建',
   'pages.searchTable.titleStatus': '状态',
   'pages.searchTable.titleStatus.all': '全部',
@@ -34,10 +35,13 @@ export default {
   'pages.searchTable.titleOption': '操作',
   'pages.table.username': '用户名',
   'pages.table.name': '名称',
-  'pages.table.equipmentName': '设备名称',
+  'pages.table.deviceName': '设备名称',
+  'pages.table.productName': '产品名称',
   'pages.table.describe': '描述',
   'pages.table.description': '说明',
   'pages.table.provider': '服务商',
+  'pages.table.type': '类型',
+  'pages.table.deviceId': '设备ID',
 
   // 统计分析
   'pages.analysis.cpu': 'CPU使用率',
@@ -50,7 +54,7 @@ export default {
   'pages.system.user.password': '密码',
   'pages.system.user.confirmPassword': '确认密码',
   'pages.system.userName.tips': '用户名过长会自动收缩',
-  'pages.system.user.name.tips': '姓名过长会自动收缩',
+  'pages.system.name.tips': '姓名过长会自动收缩',
   // 角色管理
   'pages.system.role': '角色管理',
   'pages.system.role.id': '标识',
@@ -69,11 +73,15 @@ export default {
   'pages.system.permission.addDataView': '数据视图',
   // 系统设置-机构管理
   'pages.system.org': '机构管理',
-  'pages.system.org.code': '编码',
+  'pages.system.org.encoding': '编码',
   'pages.system.org.count': '下级数量',
+  'pages.system.org.add.orderNumber': '序号',
+  'pages.system.org.option.bindUser': '绑定用户',
+  'pages.system.org.option.permission': '权限分配',
+  'pages.system.org.option.add': '添加下级',
   // 系统设置-第三方平台
   'pages.system.openApi': '第三方平台',
-  'pages.system.openApi.passWord': '密码',
+  'pages.system.openApi.password': '密码',
   'pages.system.openApi.ipWhileList': 'IP白名单',
   // 系统设置-租户管理
   'pages.system.tenant': '租户管理',
@@ -85,48 +93,86 @@ export default {
 
   // 设备管理-产品
   'pages.device.product': '产品',
-  'pages.device.product.list': '产品列表',
   'pages.device.product.status.published': '已发布',
   'pages.device.product.status.unpublished': '未发布',
   'pages.device.product.status.all': '全部',
   'pages.device.productDetail': '产品详情',
+  'pages.device.productDetail.id': '产品ID',
+  'pages.device.productDetail.classifiedName': '所属品类',
+  'pages.device.productDetail.protocolName': '消息协议',
+  'pages.device.productDetail.transportProtocol': '链接协议',
+  'pages.device.productDetail.createTime': '创建时间',
+  'pages.device.productDetail.base': '配置信息',
+  'pages.device.productDetail.metadata': '物模型',
+  'pages.device.productDetail.alarm': '告警设置',
+  'pages.device.productDetail.setting': '应用设置',
+  'pages.device.productDetail.disable': '停用',
   // 设备管理-产品分类
   'pages.device.category': '产品分类',
   'pages.device.category.id': '分类ID',
-  'pages.device.category.logotype': '标识',
+  'pages.device.category.key': '标识',
   'pages.device.category.name': '分类名称',
   'pages.device.category.addClass': '添加子分类',
   // 设备管理-设备
   'pages.device.instance': '设备',
-  'pages.device.instance.management': '设备管理',
-  'pages.device.instance.productName': '产品名称',
   'pages.device.instance.registrationTime': '注册时间',
-  'pages.device.instance.status.notEnabled': '未启用',
+  'pages.device.instance.status.notActive': '未启用',
   'pages.device.instance.status.offLine': '离线',
   'pages.device.instance.status.onLine': '在线',
+  'pages.device.instanceDetail.deviceType': '设备类型',
+  'pages.device.instanceDetail.transportProtocol': '链接协议',
+  'pages.device.instanceDetail.protocolName': '消息协议',
+  'pages.device.instanceDetail.createTime': '创建时间',
+  'pages.device.instanceDetail.registerTime': '注册时间',
+  'pages.device.instanceDetail.lastTimeOnline': '最后上线时间',
+  'pages.device.instanceDetail.property': '属性',
+  'pages.device.instanceDetail.events': '事件',
+  'pages.device.instanceDetail.function': '功能',
+  'pages.device.instanceDetail.tags': '标签',
+  'pages.device.instanceDetail.save': '保存',
+  'pages.device.instanceDetail.detail': '实例信息',
+  'pages.device.instanceDetail.detail.sort': '排序',
+  'pages.device.instanceDetail.detail.value': '值',
+  'pages.device.instanceDetail.detail.tags': '标签',
+  'pages.device.instanceDetail.detail.addTags': '添加标签',
+  'pages.device.instanceDetail.running': '运行状态',
+  'pages.device.instanceDetail.running.status': '设备状态',
+  'pages.device.instanceDetail.running.onlineTime': '上线时间',
+  'pages.device.instanceDetail.metadata': '物模型',
+  'pages.device.instanceDetail.metadata.logotype': '属性标识',
+  'pages.device.instanceDetail.metadata.attributeName': '属性名称',
+  'pages.device.instanceDetail.metadata.parameterName': '参数名称',
+  'pages.device.instanceDetail.metadata.dataType': '数据类型',
+  'pages.device.instanceDetail.metadata.readOnly': '只读',
+  'pages.device.instanceDetail.metadata.readOnly.yes': '是',
+  'pages.device.instanceDetail.metadata.readOnly.no': '否',
+  'pages.device.instanceDetail.metadata.unit': '单位',
+  'pages.device.instanceDetail.functions': '设备功能',
+  'pages.device.instanceDetail.log': '日志管理',
+  'pages.device.instanceDetail.alarm': '告警设置',
+  'pages.device.instanceDetail.visualization': '可视化',
+  'pages.device.instanceDetail.shadow': '设备影子',
   // 设备管理-指令下发
   'pages.device.command': '指令下发',
-  'pages.device.command.id': '设备ID',
   'pages.device.command.type': '指令类型',
-  'pages.device.command.type.readAttributes': '读取属性',
-  'pages.device.command.type.setProperties': '设置属性',
-  'pages.device.command.type.callAttribute': '调用属性',
+  'pages.device.command.type.readProperty': '读取属性',
+  'pages.device.command.type.writeProperty': '设置属性',
+  'pages.device.command.type.invokeFunction': '调用属性',
   'pages.device.command.option.send': '重新发送',
-  'pages.device.command.status.waiting': '等待中',
-  'pages.device.command.status.failed ': '发送失败',
-  'pages.device.command.status.succeed': '发送成功',
-  'pages.device.command.errorMessage': '错误信息',
+  'pages.device.command.status.wait': '等待中',
+  'pages.device.command.status.sendError': '发送失败',
+  'pages.device.command.status.success': '发送成功',
+  'pages.device.command.lastError': '错误信息',
   'pages.device.command.sendTime': '发送时间',
   // 设备管理-固件升级
   'pages.device.firmware': '固件升级',
   'pages.device.firmware.name': '固件名称',
   'pages.device.firmware.versions': '固件版本',
-  'pages.device.firmware.products': '所属产品',
-  'pages.device.firmware.signature': '签名方式',
-  'pages.device.firmware.creationTime': '创建时间',
+  'pages.device.firmware.productName': '所属产品',
+  'pages.device.firmware.signMethod': '签名方式',
+  'pages.device.firmware.createTime': '创建时间',
   // 设备管理-告警记录
   'pages.device.alarm': '告警记录',
-  'pages.device.alarm.id': '设备ID',
   'pages.device.alarm.name': '告警名称',
   'pages.device.alarm.time': '告警时间',
   'pages.device.alarm.status': '处理状态',
@@ -140,20 +186,18 @@ export default {
   'pages.link.opcua': 'OPC UA',
   'pages.link.type': 'Type',
   'pages.link.option.debug': '调试',
-  'pages.link.option.record': '通知记录',
   // 通知管理
   'pages.notice.config': '通知配置',
   'pages.notice.config.type': '通知类型',
   'pages.notice.template': '通知模板',
   'pages.notice.option.debug': '调试',
-  'pages.notice.option.record': '通知记录',
 
   // 规则引擎
   'pages.ruleEngine.instance': '规则实例',
   'pages.ruleEngine.sqlRule': '数据转发',
   'pages.ruleEngine.sqlRule.time': '创建时间',
   'pages.ruleEngine.scene': '场景联动',
-  'pages.ruleEngine.scene.trigger': '触发方式',
+  'pages.ruleEngine.scene.triggers': '触发方式',
   'pages.ruleEngine.option.detail': '查看',
   'pages.ruleEngine.option.start': '启动',
   'pages.ruleEngine.option.restart': '重启',
@@ -164,22 +208,20 @@ export default {
   'pages.visualization.screen': '大屏管理',
   'pages.visualization.configuration': '组态管理',
   'pages.visualization.option.addClass': '添加子分类',
-  'pages.visualization.option.record': '通知记录',
   'pages.visualization.option.copy': '复制',
 
   // 模拟测试
   'pages.simulator.device': '设备模拟器',
-  'pages.simulator.device.networkType': '类型',
 
   // 日志管理-访问日志
   'pages.log.access': '访问日志',
-  'pages.log.access.requestPath': '请求路径',
+  'pages.log.access.url': '请求路径',
   'pages.log.access.requestTime': '请求时间',
   'pages.log.access.requestTimeConsuming': '请求耗时',
   'pages.log.access.requestUser': '请求用户',
   // 日志管理-系统日志
   'pages.log.system': '系统日志',
-  'pages.log.system.thread': '线程',
+  'pages.log.system.threadName': '线程',
   'pages.log.system.level': '级别',
   'pages.log.system.logContent': '日志内容',
   'pages.log.system.serviceName': '服务名',
@@ -203,7 +245,6 @@ export default {
   'pages.media.device.manufacturer': '设备厂家',
   'pages.media.device.model': '型号',
   'pages.media.device.firmware': '固件版本',
-  'pages.media.device.networkType': '类型',
   'pages.media.device': '视频设备',
   'pages.media.reveal': '分屏展示',
   'pages.media.cascade': '国标级联',
@@ -211,5 +252,4 @@ export default {
   // 边缘网关
   'pages.edge.product': '产品',
   'pages.edge.device': '设备',
-  'pages.edge.device.productName': '产品名称',
 };

+ 2 - 165
src/pages/Analysis/DeviceChart/index.tsx

@@ -1,167 +1,4 @@
-import { StatisticCard } from '@ant-design/pro-card';
-import { service } from '@/pages/Analysis';
-import { useEffect } from 'react';
-import { groupBy, map } from 'rxjs/operators';
-import { mergeMap, of, toArray, zip } from 'rxjs';
-import moment from 'moment';
-import { model } from '@formily/reactive';
-import { observer } from '@formily/react';
-import { Column } from '@ant-design/charts';
-import { Badge, Col, Row } from 'antd';
-import { SyncOutlined } from '@ant-design/icons';
-
-type DeviceChartType = {
-  deviceOnline: number;
-  aggOnline: Record<string, any>[];
-  deviceCount: number;
-  deviceNotActive: number;
+const DeviceChart = () => {
+  return <div>DeviceChart</div>;
 };
-const DeviceChartModel = model<DeviceChartType>({
-  deviceCount: 0,
-  aggOnline: [],
-  deviceOnline: 0,
-  deviceNotActive: 0,
-});
-const DeviceChart = observer(() => {
-  const getDeviceData = () => {
-    const requestParams = [
-      // 设备状态信息-在线
-      {
-        dashboard: 'device',
-        object: 'status',
-        measurement: 'record',
-        dimension: 'current',
-        group: 'deviceOnline',
-        params: {
-          state: 'online',
-        },
-      }, // 设备状态信息-总数
-      {
-        dashboard: 'device',
-        object: 'status',
-        measurement: 'record',
-        dimension: 'current',
-        group: 'deviceCount',
-      }, // 设备状态信息-未激活
-      {
-        dashboard: 'device',
-        object: 'status',
-        measurement: 'record',
-        dimension: 'current',
-        group: 'deviceNotActive',
-        params: {
-          state: 'notActive',
-        },
-      }, // 设备状态信息-历史在线
-      {
-        dashboard: 'device',
-        object: 'status',
-        measurement: 'record',
-        dimension: 'aggOnline',
-        group: 'aggOnline',
-        params: {
-          limit: 20,
-          time: '1d',
-          format: 'yyyy-MM-dd',
-        },
-      },
-    ];
-    service
-      .getMulti(requestParams)
-      .pipe(
-        mergeMap(
-          (item) =>
-            item.result as {
-              group: string;
-              data: Record<string, any>;
-              formatData?: { x: unknown; y: unknown };
-            }[],
-        ),
-        groupBy((item) => item.group),
-        mergeMap((group$) =>
-          zip(
-            of(group$.key),
-            group$.pipe(
-              map((item) =>
-                item.group === 'aggOnline'
-                  ? {
-                      x: moment(new Date(item.data.timeString)).format('YYYY-MM-DD'),
-                      y: Number(item.data.value),
-                    }
-                  : item.data.value,
-              ),
-              toArray(),
-            ),
-          ),
-        ),
-        map((item) =>
-          item[0] === 'aggOnline' ? [item[0], item[1].reverse()] : [item[0], ...item[1]],
-        ),
-      )
-      .subscribe((data) => {
-        // eslint-disable-next-line prefer-destructuring
-        DeviceChartModel[data[0]] = data[1];
-      });
-  };
-
-  useEffect(() => {
-    getDeviceData();
-  }, []);
-
-  return (
-    <StatisticCard
-      title="设备统计"
-      extra={<SyncOutlined onClick={() => getDeviceData()} />}
-      chart={
-        <Column
-          width={200}
-          height={180}
-          xField="x"
-          yField="y"
-          label={{
-            position: 'middle',
-            style: {
-              fill: '#FFFFFF',
-              opacity: 0.6,
-            },
-          }}
-          xAxis={{
-            label: {
-              autoHide: true,
-              autoRotate: false,
-            },
-          }}
-          meta={{
-            x: { alias: '日期' },
-            y: { alias: '数量' },
-          }}
-          data={DeviceChartModel.aggOnline}
-        />
-      }
-      footer={
-        <Row>
-          <Col span={8}>
-            <>
-              {' '}
-              <Badge status="warning" text="未激活" />
-              {DeviceChartModel.deviceNotActive}
-            </>
-          </Col>
-          <Col span={8}>
-            <>
-              {' '}
-              <Badge status="processing" text="总数" />· {DeviceChartModel.deviceCount}
-            </>
-          </Col>
-          <Col span={8}>
-            <>
-              <Badge status="success" text="在线" /> {DeviceChartModel.deviceOnline}
-            </>
-          </Col>
-        </Row>
-      }
-    />
-  );
-});
-
 export default DeviceChart;

+ 0 - 2
src/pages/cloud/Onenet/index.tsx

@@ -82,8 +82,6 @@ const Onenet = () => {
               defaultMessage: `确认${record.state.value === 'disabled' ? '启' : '禁'}用?`,
             })}
             onConfirm={async () => {
-              // const state = record.state.value === 'disabled' ? 'enable' : 'disable';
-              // await service.changeStatus(record.id, state);
               message.success(
                 intl.formatMessage({
                   id: 'pages.data.option.success',

+ 2 - 2
src/pages/device/Alarm/index.tsx

@@ -21,14 +21,14 @@ const Alarm = () => {
     },
     {
       title: intl.formatMessage({
-        id: 'pages.device.alarm.id',
+        id: 'pages.table.deviceId',
         defaultMessage: '设备ID',
       }),
       dataIndex: 'deviceId',
     },
     {
       title: intl.formatMessage({
-        id: 'pages.table.equipmentName',
+        id: 'pages.table.deviceName',
         defaultMessage: '设备名称',
       }),
       dataIndex: 'deviceName',

+ 3 - 3
src/pages/device/Category/index.tsx

@@ -3,11 +3,11 @@ import Service from '@/pages/device/Category/service';
 import type { ProColumns } from '@jetlinks/pro-table';
 import { EditOutlined, MinusOutlined, PlusOutlined } from '@ant-design/icons';
 import { Tooltip } from 'antd';
-import { useIntl } from '@@/plugin-locale/localeExports';
 import { useRef } from 'react';
 import type { ActionType } from '@jetlinks/pro-table';
 import BaseCrud from '@/components/BaseCrud';
 import type { ISchema } from '@formily/json-schema';
+import { useIntl } from '@@/plugin-locale/localeExports';
 
 const service = new Service('device/category');
 const Category = () => {
@@ -26,7 +26,7 @@ const Category = () => {
     },
     {
       title: intl.formatMessage({
-        id: 'pages.device.category.logotype',
+        id: 'pages.device.category.key',
         defaultMessage: '标识',
       }),
       align: 'left',
@@ -118,7 +118,7 @@ const Category = () => {
       },
       key: {
         title: intl.formatMessage({
-          id: 'pages.device.category.logotype',
+          id: 'pages.device.category.key',
           defaultMessage: '标识',
         }),
         'x-decorator': 'FormItem',

+ 9 - 9
src/pages/device/Command/index.tsx

@@ -22,14 +22,14 @@ const Command = () => {
     },
     {
       title: intl.formatMessage({
-        id: 'pages.device.command.id',
+        id: 'pages.table.deviceId',
         defaultMessage: '设备ID',
       }),
       dataIndex: 'deviceId',
     },
     {
       title: intl.formatMessage({
-        id: 'pages.table.equipmentName',
+        id: 'pages.table.deviceName',
         defaultMessage: '设备名称',
       }),
       dataIndex: 'deviceName',
@@ -43,21 +43,21 @@ const Command = () => {
       filters: [
         {
           text: intl.formatMessage({
-            id: 'pages.device.command.type.readAttributes',
+            id: 'pages.device.command.type.readProperty',
             defaultMessage: '读取属性',
           }),
           value: 'READ_PROPERTY',
         },
         {
           text: intl.formatMessage({
-            id: 'pages.device.command.type.setProperties',
+            id: 'pages.device.command.type.writeProperty',
             defaultMessage: '设置属性',
           }),
           value: 'WRITE_PROPERTY',
         },
         {
           text: intl.formatMessage({
-            id: 'pages.device.command.type.callAttribute',
+            id: 'pages.device.command.type.invokeFunction',
             defaultMessage: '调用属性',
           }),
           value: 'INVOKE_FUNCTION',
@@ -73,21 +73,21 @@ const Command = () => {
       filters: [
         {
           text: intl.formatMessage({
-            id: 'pages.device.command.status.waiting',
+            id: 'pages.device.command.status.wait',
             defaultMessage: '等待中',
           }),
           value: 'wait',
         },
         {
           text: intl.formatMessage({
-            id: 'pages.device.command.status.failed ',
+            id: 'pages.device.command.status.sendError',
             defaultMessage: '发送失败',
           }),
           value: 'sendError',
         },
         {
           text: intl.formatMessage({
-            id: 'pages.device.command.status.succeed',
+            id: 'pages.device.command.status.success',
             defaultMessage: '发送成功',
           }),
           value: 'success',
@@ -97,7 +97,7 @@ const Command = () => {
     },
     {
       title: intl.formatMessage({
-        id: 'pages.device.command.errorMessage',
+        id: 'pages.device.command.lastError',
         defaultMessage: '错误信息',
       }),
       dataIndex: 'lastError',

+ 3 - 3
src/pages/device/Firmware/index.tsx

@@ -37,21 +37,21 @@ const Firmware = () => {
     },
     {
       title: intl.formatMessage({
-        id: 'pages.device.firmware.products',
+        id: 'pages.device.firmware.productName',
         defaultMessage: '所属产品',
       }),
       dataIndex: 'productName',
     },
     {
       title: intl.formatMessage({
-        id: 'pages.device.firmware.signature',
+        id: 'pages.device.firmware.signMethod',
         defaultMessage: '签名方式',
       }),
       dataIndex: 'signMethod',
     },
     {
       title: intl.formatMessage({
-        id: 'pages.device.firmware.creationTime',
+        id: 'pages.device.firmware.createTime',
         defaultMessage: '创建时间',
       }),
       dataIndex: 'createTime',

+ 128 - 89
src/pages/device/Instance/Detail/Config/Tags/index.tsx

@@ -2,6 +2,7 @@ import { createSchemaField, FormProvider, observer } from '@formily/react';
 import { Editable, FormItem, Input, ArrayTable } from '@formily/antd';
 import { createForm } from '@formily/core';
 import { Card } from 'antd';
+import { useIntl } from '@@/plugin-locale/localeExports';
 
 const SchemaField = createSchemaField({
   components: {
@@ -13,113 +14,151 @@ const SchemaField = createSchemaField({
 });
 const form = createForm();
 
-const schema = {
-  type: 'object',
-  properties: {
-    array: {
-      type: 'array',
-      'x-decorator': 'FormItem',
-      'x-component': 'ArrayTable',
-      'x-component-props': {
-        pagination: { pageSize: 10 },
-        scroll: { x: '100%' },
-      },
-      items: {
-        type: 'object',
-        properties: {
-          column1: {
-            type: 'void',
-            'x-component': 'ArrayTable.Column',
-            'x-component-props': { width: 50, title: '排序', align: 'center' },
-            properties: {
-              sort: {
-                type: 'void',
-                'x-component': 'ArrayTable.SortHandle',
+const Tags = observer(() => {
+  const intl = useIntl();
+  const schema = {
+    type: 'object',
+    properties: {
+      array: {
+        type: 'array',
+        'x-decorator': 'FormItem',
+        'x-component': 'ArrayTable',
+        'x-component-props': {
+          pagination: { pageSize: 10 },
+          scroll: { x: '100%' },
+        },
+        items: {
+          type: 'object',
+          properties: {
+            column1: {
+              type: 'void',
+              'x-component': 'ArrayTable.Column',
+              'x-component-props': {
+                width: 50,
+                title: intl.formatMessage({
+                  id: 'pages.device.instanceDetail.detail.sort',
+                  defaultMessage: '排序',
+                }),
+                align: 'center',
               },
-            },
-          },
-          column3: {
-            type: 'void',
-            'x-component': 'ArrayTable.Column',
-            'x-component-props': { width: 200, title: 'ID' },
-            properties: {
-              a1: {
-                type: 'string',
-                'x-decorator': 'Editable',
-                'x-component': 'Input',
+              properties: {
+                sort: {
+                  type: 'void',
+                  'x-component': 'ArrayTable.SortHandle',
+                },
               },
             },
-          },
-          column4: {
-            type: 'void',
-            'x-component': 'ArrayTable.Column',
-            'x-component-props': { width: 200, title: '名称' },
-            properties: {
-              a2: {
-                type: 'string',
-                'x-decorator': 'FormItem',
-                'x-component': 'Input',
+            column3: {
+              type: 'void',
+              'x-component': 'ArrayTable.Column',
+              'x-component-props': { width: 200, title: 'ID' },
+              properties: {
+                a1: {
+                  type: 'string',
+                  'x-decorator': 'Editable',
+                  'x-component': 'Input',
+                },
               },
             },
-          },
-          column5: {
-            type: 'void',
-            'x-component': 'ArrayTable.Column',
-            'x-component-props': { width: 200, title: '值' },
-            properties: {
-              a3: {
-                type: 'string',
-                'x-decorator': 'FormItem',
-                'x-component': 'Input',
+            column4: {
+              type: 'void',
+              'x-component': 'ArrayTable.Column',
+              'x-component-props': {
+                width: 200,
+                title: intl.formatMessage({
+                  id: 'pages.table.name',
+                  defaultMessage: '名称',
+                }),
+              },
+              properties: {
+                a2: {
+                  type: 'string',
+                  'x-decorator': 'FormItem',
+                  'x-component': 'Input',
+                },
               },
             },
-          },
-          column6: {
-            type: 'void',
-            'x-component': 'ArrayTable.Column',
-            'x-component-props': {
-              title: '操作',
-              dataIndex: 'operations',
-              width: 200,
-              fixed: 'right',
+            column5: {
+              type: 'void',
+              'x-component': 'ArrayTable.Column',
+              'x-component-props': {
+                width: 200,
+                title: intl.formatMessage({
+                  id: 'pages.device.instanceDetail.detail.value',
+                  defaultMessage: '值',
+                }),
+              },
+              properties: {
+                a3: {
+                  type: 'string',
+                  'x-decorator': 'FormItem',
+                  'x-component': 'Input',
+                },
+              },
             },
-            properties: {
-              item: {
-                type: 'void',
-                'x-component': 'FormItem',
-                properties: {
-                  remove: {
-                    type: 'void',
-                    'x-component': 'ArrayTable.Remove',
-                  },
-                  moveDown: {
-                    type: 'void',
-                    'x-component': 'ArrayTable.MoveDown',
-                  },
-                  moveUp: {
-                    type: 'void',
-                    'x-component': 'ArrayTable.MoveUp',
+            column6: {
+              type: 'void',
+              'x-component': 'ArrayTable.Column',
+              'x-component-props': {
+                title: intl.formatMessage({
+                  id: 'pages.data.option',
+                  defaultMessage: '操作',
+                }),
+                dataIndex: 'operations',
+                width: 200,
+                fixed: 'right',
+              },
+              properties: {
+                item: {
+                  type: 'void',
+                  'x-component': 'FormItem',
+                  properties: {
+                    remove: {
+                      type: 'void',
+                      'x-component': 'ArrayTable.Remove',
+                    },
+                    moveDown: {
+                      type: 'void',
+                      'x-component': 'ArrayTable.MoveDown',
+                    },
+                    moveUp: {
+                      type: 'void',
+                      'x-component': 'ArrayTable.MoveUp',
+                    },
                   },
                 },
               },
             },
           },
         },
-      },
-      properties: {
-        add: {
-          type: 'void',
-          'x-component': 'ArrayTable.Addition',
-          title: '添加标签',
+        properties: {
+          add: {
+            type: 'void',
+            'x-component': 'ArrayTable.Addition',
+            title: intl.formatMessage({
+              id: 'pages.device.instanceDetail.detail.value',
+              defaultMessage: '添加标签',
+            }),
+          },
         },
       },
     },
-  },
-};
-
-const Tags = observer(() => {
+  };
   return (
-    <Card title="标签" extra={<a>保存</a>}>
+    <Card
+      title={intl.formatMessage({
+        id: 'pages.device.instanceDetail.tags',
+        defaultMessage: '标签',
+      })}
+      extra={
+        <a>
+          {intl.formatMessage({
+            id: 'pages.device.instanceDetail.save',
+            defaultMessage: '保存',
+          })}
+        </a>
+      }
+    >
       <FormProvider form={form}>
         <SchemaField schema={schema} />
       </FormProvider>

+ 68 - 9
src/pages/device/Instance/Detail/Info/index.tsx

@@ -2,26 +2,85 @@ import { Descriptions } from 'antd';
 import { InstanceModel } from '@/pages/device/Instance';
 import moment from 'moment';
 import { observer } from '@formily/react';
+import { useIntl } from '@@/plugin-locale/localeExports';
 
 const Info = observer(() => {
+  const intl = useIntl();
   return (
     <>
       <Descriptions size="small" column={3}>
-        <Descriptions.Item label="设备ID">{InstanceModel.detail?.id}</Descriptions.Item>
-        <Descriptions.Item label="产品名称">{InstanceModel.detail?.name}</Descriptions.Item>
-        <Descriptions.Item label="设备类型">
+        <Descriptions.Item
+          label={intl.formatMessage({
+            id: 'pages.table.deviceId',
+            defaultMessage: '设备ID',
+          })}
+        >
+          {InstanceModel.detail?.id}
+        </Descriptions.Item>
+        <Descriptions.Item
+          label={intl.formatMessage({
+            id: 'pages.table.productName',
+            defaultMessage: '产品名称',
+          })}
+        >
+          {InstanceModel.detail?.name}
+        </Descriptions.Item>
+        <Descriptions.Item
+          label={intl.formatMessage({
+            id: 'pages.device.instanceDetail.deviceType',
+            defaultMessage: '设备类型',
+          })}
+        >
           {InstanceModel.detail?.deviceType?.text}
         </Descriptions.Item>
-        <Descriptions.Item label="链接协议">{InstanceModel.detail?.protocolName}</Descriptions.Item>
-        <Descriptions.Item label="消息协议">{InstanceModel.detail?.transport}</Descriptions.Item>
-        <Descriptions.Item label="创建时间">
+        <Descriptions.Item
+          label={intl.formatMessage({
+            id: 'pages.device.instanceDetail.transportProtocol',
+            defaultMessage: '链接协议',
+          })}
+        >
+          {InstanceModel.detail?.protocolName}
+        </Descriptions.Item>
+        <Descriptions.Item
+          label={intl.formatMessage({
+            id: 'pages.device.instanceDetail.protocolName',
+            defaultMessage: '消息协议',
+          })}
+        >
+          {InstanceModel.detail?.transport}
+        </Descriptions.Item>
+        <Descriptions.Item
+          label={intl.formatMessage({
+            id: 'pages.device.instanceDetail.createTime',
+            defaultMessage: '创建时间',
+          })}
+        >
           {moment(InstanceModel.detail?.createTime).format('YYYY-MM-DD HH:mm:ss')}
         </Descriptions.Item>
-        <Descriptions.Item label="注册时间">{InstanceModel.detail?.createTime}</Descriptions.Item>
-        <Descriptions.Item label="最后上线时间">
+        <Descriptions.Item
+          label={intl.formatMessage({
+            id: 'pages.device.instanceDetail.registerTime',
+            defaultMessage: '注册时间',
+          })}
+        >
           {InstanceModel.detail?.createTime}
         </Descriptions.Item>
-        <Descriptions.Item label="说明">{InstanceModel.detail?.description}</Descriptions.Item>
+        <Descriptions.Item
+          label={intl.formatMessage({
+            id: 'pages.device.instanceDetail.lastTimeOnline',
+            defaultMessage: '最后上线时间',
+          })}
+        >
+          {InstanceModel.detail?.createTime}
+        </Descriptions.Item>
+        <Descriptions.Item
+          label={intl.formatMessage({
+            id: 'pages.table.description',
+            defaultMessage: '说明',
+          })}
+        >
+          {InstanceModel.detail?.description}
+        </Descriptions.Item>
       </Descriptions>
     </>
   );

+ 30 - 7
src/pages/device/Instance/Detail/Metadata/ItemDetail/index.tsx

@@ -17,8 +17,10 @@ import {
   Radio,
 } from '@formily/antd';
 import type { MetadataItem } from '@/pages/device/Product/typings';
+import { useIntl } from '@@/plugin-locale/localeExports';
 
 const ItemDetail = observer(() => {
+  const intl = useIntl();
   const form = createForm<MetadataItem>({
     validateFirst: true,
     initialValues: InstanceModel.metadataItem,
@@ -43,21 +45,30 @@ const ItemDetail = observer(() => {
     properties: {
       id: {
         type: 'string',
-        title: '属性标识',
+        title: intl.formatMessage({
+          id: 'pages.device.instanceDetail.metadata.logotype',
+          defaultMessage: '',
+        }),
         required: true,
         'x-decorator': 'FormItem',
         'x-component': 'Input',
       },
       name: {
         type: 'string',
-        title: '属性名称',
+        title: intl.formatMessage({
+          id: 'pages.device.instanceDetail.metadata.attributeName',
+          defaultMessage: '属性名称',
+        }),
         required: true,
         'x-decorator': 'FormItem',
         'x-component': 'Input',
       },
       dataType: {
         type: 'string',
-        title: '数据类型',
+        title: intl.formatMessage({
+          id: 'pages.device.instanceDetail.metadata.dataType',
+          defaultMessage: '数据类型',
+        }),
         required: true,
         'x-decorator': 'FormItem',
         'x-component': 'Select',
@@ -77,14 +88,23 @@ const ItemDetail = observer(() => {
       },
       readOnly: {
         type: 'string',
-        title: '只读',
+        title: intl.formatMessage({
+          id: 'pages.device.instanceDetail.metadata.readOnly',
+          defaultMessage: '只读',
+        }),
         enum: [
           {
-            label: '是',
+            label: intl.formatMessage({
+              id: 'pages.device.instanceDetail.metadata.readOnly.yes',
+              defaultMessage: '是',
+            }),
             value: 1,
           },
           {
-            label: '否',
+            label: intl.formatMessage({
+              id: 'pages.device.instanceDetail.metadata.readOnly.no',
+              defaultMessage: '否',
+            }),
             value: 2,
           },
         ],
@@ -94,7 +114,10 @@ const ItemDetail = observer(() => {
       description: {
         type: 'string',
         required: true,
-        title: '描述',
+        title: intl.formatMessage({
+          id: 'pages.table.describe',
+          defaultMessage: '描述',
+        }),
         'x-decorator': 'FormItem',
         'x-component': 'Input.TextArea',
       },

+ 30 - 6
src/pages/device/Instance/Detail/Metadata/ItemParam/index.tsx

@@ -20,8 +20,10 @@ import type { Unit } from '@/pages/device/Instance/typings';
 import type { ISchema } from '@formily/json-schema';
 import ProCard from '@ant-design/pro-card';
 import { useState } from 'react';
+import { useIntl } from '@@/plugin-locale/localeExports';
 
 const ItemParam = observer(() => {
+  const intl = useIntl();
   const [cardId, setCardId] = useState<string>('');
   const form = createForm({
     validateFirst: true,
@@ -73,21 +75,30 @@ const ItemParam = observer(() => {
     properties: {
       id: {
         type: 'string',
-        title: '参数标识',
+        title: intl.formatMessage({
+          id: 'pages.device.instanceDetail.metadata.logotype',
+          defaultMessage: '属性标识',
+        }),
         required: true,
         'x-decorator': 'FormItem',
         'x-component': 'Input',
       },
       name: {
         type: 'string',
-        title: '参数名称',
+        title: intl.formatMessage({
+          id: 'pages.device.instanceDetail.metadata.parameterName',
+          defaultMessage: '参数名称',
+        }),
         required: true,
         'x-decorator': 'FormItem',
         'x-component': 'Input',
       },
       type: {
         type: 'string',
-        title: '数据类型',
+        title: intl.formatMessage({
+          id: 'pages.device.instanceDetail.metadata.dataType',
+          defaultMessage: '数据类型',
+        }),
         required: true,
         'x-decorator': 'FormItem',
         'x-component': 'Select',
@@ -155,7 +166,10 @@ const ItemParam = observer(() => {
       },
       unit: {
         type: 'string',
-        title: '单位',
+        title: intl.formatMessage({
+          id: 'pages.device.instanceDetail.metadata.unit',
+          defaultMessage: '单位',
+        }),
         required: true,
         'x-decorator': 'FormItem',
         'x-component': 'Select',
@@ -163,7 +177,10 @@ const ItemParam = observer(() => {
       },
       description: {
         type: 'string',
-        title: '描述',
+        title: intl.formatMessage({
+          id: 'pages.table.describe',
+          defaultMessage: '描述',
+        }),
         required: true,
         'x-decorator': 'FormItem',
         'x-component': 'Input.TextArea',
@@ -179,7 +196,14 @@ const ItemParam = observer(() => {
   };
   return (
     <ProCard
-      extra={<a onClick={saveParam}>保存</a>}
+      extra={
+        <a onClick={saveParam}>
+          {intl.formatMessage({
+            id: 'pages.device.instanceDetail.save',
+            defaultMessage: '保存',
+          })}
+        </a>
+      }
       bordered={true}
       colSpan={500}
       style={{ height: '40vh', marginRight: 10 }}

+ 45 - 6
src/pages/device/Instance/Detail/Metadata/index.tsx

@@ -7,8 +7,10 @@ import ItemList from '@/pages/device/Instance/Detail/Metadata/ItemList';
 import ItemDetail from '@/pages/device/Instance/Detail/Metadata/ItemDetail';
 import ItemParam from '@/pages/device/Instance/Detail/Metadata/ItemParam';
 import { useEffect } from 'react';
+import { useIntl } from '@@/plugin-locale/localeExports';
 
 const Metadata = observer(() => {
+  const intl = useIntl();
   const metadata = JSON.parse(InstanceModel.detail.metadata as string) as DeviceMetadata;
   useEffect(() => {
     InstanceModel.params = new Set<string>(['test']);
@@ -19,7 +21,14 @@ const Metadata = observer(() => {
         tabPosition: 'left',
       }}
     >
-      <ProCard.TabPane tab="属性" key="property" style={{ overflowX: 'auto' }}>
+      <ProCard.TabPane
+        tab={intl.formatMessage({
+          id: 'pages.device.instanceDetail.property',
+          defaultMessage: '属性',
+        })}
+        key="property"
+        style={{ overflowX: 'auto' }}
+      >
         <Row gutter={[16, 16]} style={{ height: '50vh' }} wrap={false}>
           <Col span={6}>
             <ProCard
@@ -31,7 +40,12 @@ const Metadata = observer(() => {
                   </Col>
                   <Col span={2} />
                   <Col span={4} style={{ alignItems: 'center' }}>
-                    <a>新增</a>
+                    <a>
+                      {intl.formatMessage({
+                        id: 'pages.data.option.add',
+                        defaultMessage: '新增',
+                      })}
+                    </a>
                   </Col>
                 </Row>
               }
@@ -42,7 +56,14 @@ const Metadata = observer(() => {
           </Col>
           <Col span={5}>
             <ProCard
-              extra={<a>保存</a>}
+              extra={
+                <a>
+                  {intl.formatMessage({
+                    id: 'pages.device.instanceDetail.save',
+                    defaultMessage: '保存',
+                  })}
+                </a>
+              }
               bordered={true}
               style={{ height: '40vh', marginRight: 10 }}
             >
@@ -57,13 +78,31 @@ const Metadata = observer(() => {
           ))}
         </Row>
       </ProCard.TabPane>
-      <ProCard.TabPane tab="事件" key="events">
+      <ProCard.TabPane
+        tab={intl.formatMessage({
+          id: 'pages.device.instanceDetail.events',
+          defaultMessage: '事件',
+        })}
+        key="events"
+      >
         事件
       </ProCard.TabPane>
-      <ProCard.TabPane tab="功能" key="functions">
+      <ProCard.TabPane
+        tab={intl.formatMessage({
+          id: 'pages.device.instanceDetail.function',
+          defaultMessage: '功能',
+        })}
+        key="functions"
+      >
         功能
       </ProCard.TabPane>
-      <ProCard.TabPane tab="标签" key="tags">
+      <ProCard.TabPane
+        tab={intl.formatMessage({
+          id: 'pages.device.instanceDetail.tags',
+          defaultMessage: '标签',
+        })}
+        key="tags"
+      >
         标签
       </ProCard.TabPane>
     </ProCard>

+ 13 - 2
src/pages/device/Instance/Detail/Running/index.tsx

@@ -3,13 +3,18 @@ import ProCard from '@ant-design/pro-card';
 import { SyncOutlined } from '@ant-design/icons';
 import { Badge, Col, message, Row } from 'antd';
 import type { DeviceMetadata } from '@/pages/device/Product/typings';
+import { useIntl } from '@@/plugin-locale/localeExports';
 
 const Running = () => {
+  const intl = useIntl();
   const metadata = JSON.parse(InstanceModel.detail.metadata as string) as DeviceMetadata;
   return (
     <ProCard style={{ marginTop: 8 }} gutter={[16, 16]} wrap>
       <ProCard
-        title="设备状态"
+        title={intl.formatMessage({
+          id: 'pages.device.instanceDetail.running.status',
+          defaultMessage: '设备状态',
+        })}
         extra={<SyncOutlined onClick={() => message.success('刷新')} />}
         layout="default"
         bordered
@@ -21,7 +26,13 @@ const Running = () => {
             <Col span={24}>
               <Badge status="success" text={<span style={{ fontSize: 25 }}>在线</span>} />
             </Col>
-            <Col span={24}>上线时间: 2021-8-20 12:20:33</Col>
+            <Col span={24}>
+              {intl.formatMessage({
+                id: 'pages.device.instanceDetail.running.onlineTime',
+                defaultMessage: '在线时间',
+              })}
+              : 2021-8-20 12:20:33
+            </Col>
           </Row>
         </div>
       </ProCard>

+ 79 - 44
src/pages/device/Instance/Detail/index.tsx

@@ -12,50 +12,10 @@ import Alarm from '@/pages/device/Instance/Detail/Alarm';
 import Info from '@/pages/device/Instance/Detail/Info';
 import Functions from '@/pages/device/Instance/Detail/Functions';
 import Running from '@/pages/device/Instance/Detail/Running';
+import { useIntl } from '@@/plugin-locale/localeExports';
 
-const list = [
-  {
-    key: 'detail',
-    tab: '实例信息',
-    component: <Config />,
-  },
-  {
-    key: 'running',
-    tab: '运行状态',
-    component: <Running />,
-  },
-  {
-    key: 'metadata',
-    tab: '物模型',
-    component: <Metadata />,
-  },
-  {
-    key: 'functions',
-    tab: '设备功能',
-    component: <Functions />,
-  },
-  {
-    key: 'log',
-    tab: '日志管理',
-    component: <Log />,
-  },
-  {
-    key: 'alarm',
-    tab: '告警设置',
-    component: <Alarm />,
-  },
-  {
-    key: 'visualization',
-    tab: '可视化',
-    component: null,
-  },
-  {
-    key: 'shadow',
-    tab: '设备影子',
-    component: null,
-  },
-];
 const InstanceDetail = observer(() => {
+  const intl = useIntl();
   const [tab, setTab] = useState<string>('detail');
   const getDetail = (id: string) => {
     service.detail(id).then((response) => {
@@ -71,6 +31,73 @@ const InstanceDetail = observer(() => {
     }
   }, []);
 
+  const list = [
+    {
+      key: 'detail',
+      tab: intl.formatMessage({
+        id: 'pages.device.instanceDetail.detail',
+        defaultMessage: '实例信息',
+      }),
+      component: <Config />,
+    },
+    {
+      key: 'running',
+      tab: intl.formatMessage({
+        id: 'pages.device.instanceDetail.running',
+        defaultMessage: '运行状态',
+      }),
+      component: <Running />,
+    },
+    {
+      key: 'metadata',
+      tab: intl.formatMessage({
+        id: 'pages.device.instanceDetail.metadata',
+        defaultMessage: '物模型',
+      }),
+      component: <Metadata />,
+    },
+    {
+      key: 'functions',
+      tab: intl.formatMessage({
+        id: 'pages.device.instanceDetail.functions',
+        defaultMessage: '设备功能',
+      }),
+      component: <Functions />,
+    },
+    {
+      key: 'log',
+      tab: intl.formatMessage({
+        id: 'pages.device.instanceDetail.log',
+        defaultMessage: '日志管理',
+      }),
+      component: <Log />,
+    },
+    {
+      key: 'alarm',
+      tab: intl.formatMessage({
+        id: 'pages.device.instanceDetail.alarm',
+        defaultMessage: '告警设置',
+      }),
+      component: <Alarm />,
+    },
+    {
+      key: 'visualization',
+      tab: intl.formatMessage({
+        id: 'pages.device.instanceDetail.visualization',
+        defaultMessage: '可视化',
+      }),
+      component: null,
+    },
+    {
+      key: 'shadow',
+      tab: intl.formatMessage({
+        id: 'pages.device.instanceDetail.shadow',
+        defaultMessage: '设备影子',
+      }),
+      component: null,
+    },
+  ];
+
   return (
     <PageContainer
       onBack={history.goBack}
@@ -79,9 +106,17 @@ const InstanceDetail = observer(() => {
       content={<Info />}
       extra={[
         statusMap[0],
-        <Button key="2">停用</Button>,
+        <Button key="2">
+          {intl.formatMessage({
+            id: 'pages.device.productDetail.disable',
+            defaultMessage: '停用',
+          })}
+        </Button>,
         <Button key="1" type="primary">
-          应用配置
+          {intl.formatMessage({
+            id: 'pages.device.productDetail.setting',
+            defaultMessage: '应用配置',
+          })}
         </Button>,
       ]}
     >

+ 7 - 7
src/pages/device/Instance/index.tsx

@@ -12,11 +12,11 @@ import {
   EyeOutlined,
   PlayCircleOutlined,
 } from '@ant-design/icons';
-import { useIntl } from '@@/plugin-locale/localeExports';
 import { CurdModel } from '@/components/BaseCrud/model';
 import { model } from '@formily/reactive';
 import Service from '@/pages/device/Instance/service';
 import type { MetadataItem } from '@/pages/device/Product/typings';
+import { useIntl } from '@@/plugin-locale/localeExports';
 
 const statusMap = new Map();
 statusMap.set('在线', 'success');
@@ -56,7 +56,7 @@ const Instance = () => {
     },
     {
       title: intl.formatMessage({
-        id: 'pages.table.equipmentName',
+        id: 'pages.table.deviceName',
         defaultMessage: '设备名称',
       }),
       dataIndex: 'name',
@@ -64,7 +64,7 @@ const Instance = () => {
     },
     {
       title: intl.formatMessage({
-        id: 'pages.device.instance.productName',
+        id: 'pages.table.productName',
         defaultMessage: '产品名称',
       }),
       dataIndex: 'productName',
@@ -92,7 +92,7 @@ const Instance = () => {
       filters: [
         {
           text: intl.formatMessage({
-            id: 'pages.device.instance.status.notEnabled',
+            id: 'pages.device.instance.status.notActive',
             defaultMessage: '未启用',
           }),
           value: 'notActive',
@@ -163,7 +163,7 @@ const Instance = () => {
         <a href={record.id} target="_blank" rel="noopener noreferrer" key="view">
           <Popconfirm
             title={intl.formatMessage({
-              id: 'pages.data.option.disable.tips',
+              id: 'pages.data.option.disabled.tips',
               defaultMessage: '确认禁用?',
             })}
             onConfirm={async () => {
@@ -182,7 +182,7 @@ const Instance = () => {
           >
             <Tooltip
               title={intl.formatMessage({
-                id: `pages.data.option.${record.state.value ? 'disable' : 'enable'}`,
+                id: `pages.data.option.${record.state.value ? 'disabled' : 'enabled'}`,
                 defaultMessage: record.state.value ? '禁用' : '启用',
               })}
             >
@@ -202,7 +202,7 @@ const Instance = () => {
         columns={columns}
         service={service}
         title={intl.formatMessage({
-          id: 'pages.device.instance.management',
+          id: 'pages.device.instance',
           defaultMessage: '设备管理',
         })}
         schema={schema}

+ 2 - 2
src/pages/device/Product/Detail/BaseInfo/index.tsx

@@ -4,7 +4,7 @@ import { Form, FormItem, FormGrid, Password, FormLayout, PreviewText, Input } fr
 import { createForm } from '@formily/core';
 import { Card, Empty } from 'antd';
 import type { ISchema } from '@formily/json-schema';
-import { useEffect, useState } from 'react';
+import { SetStateAction, useEffect, useState } from 'react';
 import type { ConfigMetadata, ConfigProperty } from '@/pages/device/Product/typings';
 
 const componentMap = {
@@ -24,7 +24,7 @@ const BaseInfo = observer(() => {
 
   useEffect(() => {
     if (id) {
-      service.getConfigMetadata(id).then((config) => {
+      service.getConfigMetadata(id).then((config: { result: SetStateAction<ConfigMetadata[]> }) => {
         setMetadata(config.result);
       });
     }

+ 75 - 11
src/pages/device/Product/Detail/index.tsx

@@ -5,8 +5,10 @@ import BaseInfo from '@/pages/device/Product/Detail/BaseInfo';
 import { observer } from '@formily/react';
 import { productModel, statusMap } from '@/pages/device/Product';
 import { useEffect } from 'react';
+import { useIntl } from '@@/plugin-locale/localeExports';
 
 const ProductDetail = observer(() => {
+  const intl = useIntl();
   useEffect(() => {
     if (!productModel.current) history.goBack();
   }, []);
@@ -16,37 +18,99 @@ const ProductDetail = observer(() => {
       extraContent={<Space size={24} />}
       content={
         <Descriptions size="small" column={2}>
-          <Descriptions.Item label="产品ID">{productModel.current?.id}</Descriptions.Item>
-          <Descriptions.Item label="产品名称">{productModel.current?.name}</Descriptions.Item>
-          <Descriptions.Item label="所属品类">
+          <Descriptions.Item
+            label={intl.formatMessage({
+              id: 'pages.device.category',
+              defaultMessage: '产品ID',
+            })}
+          >
+            {productModel.current?.id}
+          </Descriptions.Item>
+          <Descriptions.Item
+            label={intl.formatMessage({
+              id: 'pages.table.productName',
+              defaultMessage: '产品名称',
+            })}
+          >
+            {productModel.current?.name}
+          </Descriptions.Item>
+          <Descriptions.Item
+            label={intl.formatMessage({
+              id: 'pages.device.productDetail.classifiedName',
+              defaultMessage: '所属品类',
+            })}
+          >
             {productModel.current?.classifiedName}
           </Descriptions.Item>
-          <Descriptions.Item label="消息协议">
+          <Descriptions.Item
+            label={intl.formatMessage({
+              id: 'pages.device.productDetail.protocolName',
+              defaultMessage: '消息协议',
+            })}
+          >
             {productModel.current?.protocolName}
           </Descriptions.Item>
-          <Descriptions.Item label="链接协议">
+          <Descriptions.Item
+            label={intl.formatMessage({
+              id: 'pages.device.productDetail.transportProtocol',
+              defaultMessage: '链接协议',
+            })}
+          >
             {productModel.current?.transportProtocol}
           </Descriptions.Item>
-          <Descriptions.Item label="创建时间">{productModel.current?.createTime}</Descriptions.Item>
+          <Descriptions.Item
+            label={intl.formatMessage({
+              id: 'pages.device.productDetail.createTime',
+              defaultMessage: '创建时间',
+            })}
+          >
+            {productModel.current?.createTime}
+          </Descriptions.Item>
         </Descriptions>
       }
       extra={[
         statusMap[productModel.current?.state || 0],
-        <Button key="2">停用</Button>,
+        <Button key="2">
+          {intl.formatMessage({
+            id: 'pages.device.productDetail.disable',
+            defaultMessage: '停用',
+          })}
+        </Button>,
         <Button key="1" type="primary">
-          应用配置
+          {intl.formatMessage({
+            id: 'pages.device.productDetail.setting',
+            defaultMessage: '应用配置',
+          })}
         </Button>,
       ]}
     >
       <Card>
         <Tabs defaultActiveKey={'base'}>
-          <Tabs.TabPane tab={'配置信息'} key={'base'}>
+          <Tabs.TabPane
+            tab={intl.formatMessage({
+              id: 'pages.device.productDetail.base',
+              defaultMessage: '配置信息',
+            })}
+            key={'base'}
+          >
             <BaseInfo />
           </Tabs.TabPane>
-          <Tabs.TabPane tab={'物模型'} key={'metadata'}>
+          <Tabs.TabPane
+            tab={intl.formatMessage({
+              id: 'pages.device.productDetail.metadata',
+              defaultMessage: '物模型',
+            })}
+            key={'metadata'}
+          >
             物模型
           </Tabs.TabPane>
-          <Tabs.TabPane tab={'告警设置'} key={'alarm'}>
+          <Tabs.TabPane
+            tab={intl.formatMessage({
+              id: 'pages.device.productDetail.alarm',
+              defaultMessage: '告警设置',
+            })}
+            key={'alarm'}
+          >
             告警设置
           </Tabs.TabPane>
         </Tabs>

+ 9 - 4
src/pages/device/Product/index.tsx

@@ -11,13 +11,13 @@ import {
   MinusOutlined,
   PlayCircleOutlined,
 } from '@ant-design/icons';
-import { useIntl } from '@@/plugin-locale/localeExports';
 import { lastValueFrom } from 'rxjs';
 import Service from '@/pages/device/Product/service';
 import { observer } from '@formily/react';
 import { model } from '@formily/reactive';
 import encodeQuery from '@/utils/encodeQuery';
 import { Link } from 'umi';
+import { useIntl } from '@@/plugin-locale/localeExports';
 
 export const service = new Service('device-product');
 export const statusMap = {
@@ -50,7 +50,7 @@ const Product = observer(() => {
           }}
           rowKey={'id'}
           headerTitle={intl.formatMessage({
-            id: 'pages.device.product.list',
+            id: 'pages.device.product',
             defaultMessage: '产品列表',
           })}
           request={async (params = {}) => {
@@ -175,14 +175,19 @@ const Product = observer(() => {
                   <a key="download">
                     <DownloadOutlined
                       onClick={() => {
-                        message.success('下载');
+                        message.success(
+                          `${intl.formatMessage({
+                            id: 'pages.data.option.download',
+                            defaultMessage: '下载',
+                          })}`,
+                        );
                       }}
                     />
                   </a>
                 </Tooltip>,
                 <Tooltip
                   title={intl.formatMessage({
-                    id: `pages.data.option.${record.state ? 'disable' : 'enable'}`,
+                    id: `pages.data.option.${record.state ? 'disabled' : 'enabled'}`,
                     defaultMessage: record.state ? '禁用' : '启用',
                   })}
                   key={'state'}

+ 2 - 2
src/pages/edge/Device/index.tsx

@@ -1,5 +1,4 @@
 import { PageContainer } from '@ant-design/pro-layout';
-import { useIntl } from '@@/plugin-locale/localeExports';
 import { useRef } from 'react';
 import type { ActionType, ProColumns } from '@jetlinks/pro-table';
 import { Tooltip } from 'antd';
@@ -7,6 +6,7 @@ import { ArrowDownOutlined, BugOutlined, EditOutlined, MinusOutlined } from '@an
 import BaseCrud from '@/components/BaseCrud';
 import BaseService from '@/utils/BaseService';
 import type { DeviceItem } from '@/pages/edge/Device/typings';
+import { useIntl } from '@@/plugin-locale/localeExports';
 
 export const service = new BaseService<DeviceItem>('device/instance');
 const Device = () => {
@@ -41,7 +41,7 @@ const Device = () => {
     {
       dataIndex: 'productName',
       title: intl.formatMessage({
-        id: 'pages.edge.device.productName',
+        id: 'pages.table.productName',
         defaultMessage: '产品名称',
       }),
     },

+ 21 - 6
src/pages/edge/Product/index.tsx

@@ -1,12 +1,12 @@
 import { PageContainer } from '@ant-design/pro-layout';
 import BaseService from '@/utils/BaseService';
-import { useIntl } from '@@/plugin-locale/localeExports';
 import { useRef } from 'react';
 import type { ActionType, ProColumns } from '@jetlinks/pro-table';
 import { Tooltip } from 'antd';
 import { ArrowDownOutlined, BugOutlined, EditOutlined, MinusOutlined } from '@ant-design/icons';
 import BaseCrud from '@/components/BaseCrud';
 import type { ProductItem } from '@/pages/edge/Product/typings';
+import { useIntl } from '@@/plugin-locale/localeExports';
 
 export const service = new BaseService<ProductItem>('edge/product');
 const Product = () => {
@@ -21,18 +21,30 @@ const Product = () => {
     },
     {
       dataIndex: 'name',
-      title: '名称',
+      title: intl.formatMessage({
+        id: 'pages.table.name',
+        defaultMessage: '名称',
+      }),
     },
     {
       dataIndex: 'model',
-      title: '型号',
+      title: intl.formatMessage({
+        id: 'pages.media.device.model',
+        defaultMessage: '型号',
+      }),
     },
     {
       dataIndex: 'manufacturer',
-      title: '厂家',
+      title: intl.formatMessage({
+        id: 'pages.media.device.manufacturer',
+        defaultMessage: '厂家',
+      }),
     },
     {
-      title: '操作',
+      title: intl.formatMessage({
+        id: 'pages.data.option',
+        defaultMessage: '操作',
+      }),
       valueType: 'option',
       align: 'center',
       width: 200,
@@ -88,7 +100,10 @@ const Product = () => {
       <BaseCrud
         columns={columns}
         service={service}
-        title="通知配置"
+        title={intl.formatMessage({
+          id: 'pages.edge.product',
+          defaultMessage: '产品',
+        })}
         schema={schema}
         actionRef={actionRef}
       />

+ 1 - 1
src/pages/link/Gateway/index.tsx

@@ -99,7 +99,7 @@ const Gateway = () => {
         <a>
           <Tooltip
             title={intl.formatMessage({
-              id: 'pages.link.option.record',
+              id: 'pages.data.option.record',
               defaultMessage: '通知记录',
             })}
           >

+ 1 - 1
src/pages/link/Protocol/index.tsx

@@ -98,7 +98,7 @@ const Protocol = () => {
         <a>
           <Tooltip
             title={intl.formatMessage({
-              id: 'pages.link.option.record',
+              id: 'pages.data.option.record',
               defaultMessage: '通知记录',
             })}
           >

+ 1 - 1
src/pages/link/Type/index.tsx

@@ -101,7 +101,7 @@ const Network = () => {
         service={service}
         title={intl.formatMessage({
           id: 'pages.link.component',
-          defaultMessage: '网络组',
+          defaultMessage: '网络组',
         })}
         schema={schema}
         actionRef={actionRef}

+ 2 - 2
src/pages/log/Access/index.tsx

@@ -27,7 +27,7 @@ const Access: React.FC = () => {
     },
     {
       title: intl.formatMessage({
-        id: 'pages.log.access.requestPath',
+        id: 'pages.log.access.url',
         defaultMessage: '请求路径',
       }),
       dataIndex: 'url',
@@ -35,7 +35,7 @@ const Access: React.FC = () => {
     },
     {
       title: intl.formatMessage({
-        id: 'pages.log.access.describe',
+        id: 'pages.table.description',
         defaultMessage: '说明',
       }),
       dataIndex: 'description',

+ 1 - 1
src/pages/log/System/index.tsx

@@ -23,7 +23,7 @@ const System = () => {
     },
     {
       title: intl.formatMessage({
-        id: 'pages.log.system.thread',
+        id: 'pages.log.system.threadName',
         defaultMessage: '线程',
       }),
       dataIndex: 'threadName',

+ 21 - 6
src/pages/media/Cascade/index.tsx

@@ -1,12 +1,12 @@
 import { PageContainer } from '@ant-design/pro-layout';
 import BaseService from '@/utils/BaseService';
-import { useIntl } from '@@/plugin-locale/localeExports';
 import { useRef } from 'react';
 import type { ActionType, ProColumns } from '@jetlinks/pro-table';
 import { Tooltip } from 'antd';
 import { ArrowDownOutlined, BugOutlined, EditOutlined, MinusOutlined } from '@ant-design/icons';
 import BaseCrud from '@/components/BaseCrud';
 import type { CascadeItem } from '@/pages/media/Cascade/typings';
+import { useIntl } from '@@/plugin-locale/localeExports';
 
 export const service = new BaseService<CascadeItem>('media/gb28181-cascade');
 const Cascade = () => {
@@ -21,19 +21,31 @@ const Cascade = () => {
     },
     {
       dataIndex: 'name',
-      title: '名称',
+      title: intl.formatMessage({
+        id: 'pages.table.name',
+        defaultMessage: '名称',
+      }),
     },
     {
       dataIndex: 'networkType',
-      title: '类型',
+      title: intl.formatMessage({
+        id: 'pages.table.type',
+        defaultMessage: '类型',
+      }),
     },
     {
       dataIndex: 'state',
-      title: '状态',
+      title: intl.formatMessage({
+        id: 'pages.searchTable.titleStatus',
+        defaultMessage: '状态',
+      }),
       render: (text, record) => record.status.value,
     },
     {
-      title: '操作',
+      title: intl.formatMessage({
+        id: 'pages.data.option',
+        defaultMessage: '操作',
+      }),
       valueType: 'option',
       align: 'center',
       width: 200,
@@ -89,7 +101,10 @@ const Cascade = () => {
       <BaseCrud
         columns={columns}
         service={service}
-        title="模拟测试"
+        title={intl.formatMessage({
+          id: 'pages.media.cascade',
+          defaultMessage: '模拟测试',
+        })}
         schema={schema}
         actionRef={actionRef}
       />

+ 6 - 3
src/pages/media/Device/index.tsx

@@ -1,5 +1,4 @@
 import { PageContainer } from '@ant-design/pro-layout';
-import { useIntl } from '@@/plugin-locale/localeExports';
 import { useRef } from 'react';
 import type { ActionType, ProColumns } from '@jetlinks/pro-table';
 import { Tooltip } from 'antd';
@@ -7,6 +6,7 @@ import { ArrowDownOutlined, BugOutlined, EditOutlined, MinusOutlined } from '@an
 import BaseCrud from '@/components/BaseCrud';
 import BaseService from '@/utils/BaseService';
 import type { DeviceItem } from '@/pages/media/Device/typings';
+import { useIntl } from '@@/plugin-locale/localeExports';
 
 export const service = new BaseService<DeviceItem>('media/device');
 const Device = () => {
@@ -90,7 +90,7 @@ const Device = () => {
     {
       dataIndex: 'networkType',
       title: intl.formatMessage({
-        id: 'pages.media.device.networkType',
+        id: 'pages.table.type',
         defaultMessage: '类型',
       }),
     },
@@ -161,7 +161,10 @@ const Device = () => {
       <BaseCrud
         columns={columns}
         service={service}
-        title="国标设备"
+        title={intl.formatMessage({
+          id: 'pages.media.device',
+          defaultMessage: '模拟测试',
+        })}
         schema={schema}
         actionRef={actionRef}
       />

+ 2 - 2
src/pages/notice/Config/index.tsx

@@ -98,7 +98,7 @@ const Config = () => {
         <a>
           <Tooltip
             title={intl.formatMessage({
-              id: 'pages.notice.option.record',
+              id: 'pages.data.option.record',
               defaultMessage: '通知记录',
             })}
           >
@@ -117,7 +117,7 @@ const Config = () => {
         columns={columns}
         service={service}
         title={intl.formatMessage({
-          id: 'pages.notice.template',
+          id: 'pages.notice.config',
           defaultMessage: '通知配置',
         })}
         schema={schema}

+ 1 - 1
src/pages/rule-engine/Scene/index.tsx

@@ -36,7 +36,7 @@ const Scene = () => {
     {
       dataIndex: 'triggers',
       title: intl.formatMessage({
-        id: 'pages.ruleEngine.scene.trigger',
+        id: 'pages.ruleEngine.scene.triggers',
         defaultMessage: '触发方式',
       }),
       render: () => 'todo',

+ 2 - 2
src/pages/simulator/Device/index.tsx

@@ -1,12 +1,12 @@
 import { PageContainer } from '@ant-design/pro-layout';
 import BaseService from '@/utils/BaseService';
 import type { DeviceItem } from '@/pages/simulator/Device/typings';
-import { useIntl } from '@@/plugin-locale/localeExports';
 import { useRef } from 'react';
 import type { ActionType, ProColumns } from '@jetlinks/pro-table';
 import { Tooltip } from 'antd';
 import { ArrowDownOutlined, BugOutlined, EditOutlined, MinusOutlined } from '@ant-design/icons';
 import BaseCrud from '@/components/BaseCrud';
+import { useIntl } from '@@/plugin-locale/localeExports';
 
 export const service = new BaseService<DeviceItem>('network/simulator');
 const Device = () => {
@@ -30,7 +30,7 @@ const Device = () => {
     {
       dataIndex: 'networkType',
       title: intl.formatMessage({
-        id: 'pages.simulator.device.networkType',
+        id: 'pages.table.type',
         defaultMessage: '类型',
       }),
     },

+ 3 - 3
src/pages/system/DataSource/index.tsx

@@ -4,13 +4,13 @@ import type { ProColumns } from '@jetlinks/pro-table';
 import { CurdModel } from '@/components/BaseCrud/model';
 import { message, Popconfirm, Tooltip } from 'antd';
 import { CloseCircleOutlined, EditOutlined, PlayCircleOutlined } from '@ant-design/icons';
-import { useIntl } from '@@/plugin-locale/localeExports';
 import type { ActionType } from '@jetlinks/pro-table';
 import { useEffect, useRef, useState } from 'react';
 import type { ISchema } from '@formily/json-schema';
 import Service from '@/pages/system/DataSource/service';
 import { from, mergeMap, toArray } from 'rxjs';
 import { map } from 'rxjs/operators';
+import { useIntl } from '@@/plugin-locale/localeExports';
 
 export const service = new Service('datasource/config');
 
@@ -59,7 +59,7 @@ const DataSource = () => {
     },
     {
       title: intl.formatMessage({
-        id: 'pages.system.datasource.type',
+        id: 'pages.table.type',
         defaultMessage: '类型',
       }),
       dataIndex: 'typeId',
@@ -159,7 +159,7 @@ const DataSource = () => {
           },
           typeId: {
             title: intl.formatMessage({
-              id: 'pages.system.datasource.type',
+              id: 'pages.table.type',
               defaultMessage: '类型',
             }),
             'x-component': 'Select',

+ 3 - 3
src/pages/system/OpenAPI/index.tsx

@@ -111,7 +111,7 @@ const OpenAPI: React.FC = () => {
         <a href={record.id} target="_blank" rel="noopener noreferrer" key="view">
           <Popconfirm
             title={intl.formatMessage({
-              id: 'pages.data.option.disable.tips',
+              id: 'pages.data.option.disabled.tips',
               defaultMessage: '确认禁用?',
             })}
             onConfirm={async () => {
@@ -130,7 +130,7 @@ const OpenAPI: React.FC = () => {
           >
             <Tooltip
               title={intl.formatMessage({
-                id: `pages.data.option.${record.status ? 'disable' : 'enable'}`,
+                id: `pages.data.option.${record.status ? 'disabled' : 'enabled'}`,
                 defaultMessage: record.status ? '禁用' : '启用',
               })}
             >
@@ -236,7 +236,7 @@ const OpenAPI: React.FC = () => {
           },
           password: {
             title: intl.formatMessage({
-              id: 'pages.system.openApi.passWord',
+              id: 'pages.system.openApi.password',
               defaultMessage: '密码',
             }),
             type: 'string',

+ 14 - 2
src/pages/system/Org/NodeTemplate/index.tsx

@@ -3,6 +3,7 @@ import { Avatar, Dropdown } from 'antd';
 import { SmallDashOutlined, UserOutlined } from '@ant-design/icons';
 import React from 'react';
 import type { OrgItem } from '@/pages/system/Org/typings';
+import { useIntl } from '@@/plugin-locale/localeExports';
 
 declare type OverlayFunc = () => React.ReactElement;
 
@@ -12,6 +13,7 @@ interface Props {
 }
 
 const NodeTemplate: React.FC<Props> = (props) => {
+  const intl = useIntl();
   const { data, action } = props;
   return (
     <div className={styles.node}>
@@ -24,12 +26,22 @@ const NodeTemplate: React.FC<Props> = (props) => {
         <div className={styles.item}>
           {data.code !== null && (
             <div>
-              <span className={styles.mark}>编码</span>
+              <span className={styles.mark}>
+                {intl.formatMessage({
+                  id: 'pages.system.org.encoding',
+                  defaultMessage: '编码',
+                })}
+              </span>
               <span>{data.code}</span>
             </div>
           )}
           <div>
-            <span className={styles.mark}>下级数量</span>
+            <span className={styles.mark}>
+              {intl.formatMessage({
+                id: 'pages.system.org.count',
+                defaultMessage: '下级数量',
+              })}
+            </span>
             <span>{data?.children?.length || 0}</span>
           </div>
         </div>

+ 18 - 4
src/pages/system/Org/Save/index.tsx

@@ -4,12 +4,14 @@ import { createSchemaField, observer } from '@formily/react';
 import { Form, Input, FormItem } from '@formily/antd';
 import React from 'react';
 import type { ObsModel } from '@/pages/system/Org/typings';
+import { useIntl } from '@@/plugin-locale/localeExports';
 
 interface Props {
   obs: ObsModel;
 }
 
 const Save: React.FC<Props> = observer((props) => {
+  const intl = useIntl();
   const { obs } = props;
   const form = createForm({});
 
@@ -24,7 +26,10 @@ const Save: React.FC<Props> = observer((props) => {
     type: 'object',
     properties: {
       code: {
-        title: '编码',
+        title: intl.formatMessage({
+          id: 'pages.system.org.encoding',
+          defaultMessage: '编码',
+        }),
         type: 'string',
         'x-decorator': 'FormItem',
         'x-component': 'Input',
@@ -34,7 +39,10 @@ const Save: React.FC<Props> = observer((props) => {
         required: true,
       },
       name: {
-        title: '名称',
+        title: intl.formatMessage({
+          id: 'pages.table.name',
+          defaultMessage: '名称',
+        }),
         type: 'string',
         'x-decorator': 'FormItem',
         'x-component': 'Input',
@@ -44,7 +52,10 @@ const Save: React.FC<Props> = observer((props) => {
         required: true,
       },
       sort: {
-        title: '名称',
+        title: intl.formatMessage({
+          id: 'pages.system.org.add.orderNumber',
+          defaultMessage: '序号',
+        }),
         type: 'string',
         'x-decorator': 'FormItem',
         'x-component': 'Input',
@@ -54,7 +65,10 @@ const Save: React.FC<Props> = observer((props) => {
         required: true,
       },
       describe: {
-        title: '描述',
+        title: intl.formatMessage({
+          id: 'pages.table.describe',
+          defaultMessage: '描述',
+        }),
         type: 'string',
         'x-decorator': 'FormItem',
         'x-component': 'Input.TextArea',

+ 30 - 7
src/pages/system/Org/index.tsx

@@ -72,7 +72,12 @@ const Org = observer(() => {
 
   const remove = async (id: string) => {
     await service.remove(id);
-    message.success('操作成功');
+    message.success(
+      intl.formatMessage({
+        id: 'pages.data.option.success',
+        defaultMessage: '操作成功!',
+      }),
+    );
   };
   useEffect(() => {
     query();
@@ -83,7 +88,10 @@ const Org = observer(() => {
       <Menu>
         <Menu.Item>
           <a target="_blank" rel="noopener noreferrer" onClick={() => obs.addNext(nodeData)}>
-            添加下级
+            {intl.formatMessage({
+              id: 'pages.system.org.option.add',
+              defaultMessage: '添加下级',
+            })}
           </a>
         </Menu.Item>
       </Menu>
@@ -99,12 +107,18 @@ const Org = observer(() => {
               // setEdit(true);
             }}
           >
-            编辑
+            {intl.formatMessage({
+              id: 'pages.data.option.edit',
+              defaultMessage: '编辑',
+            })}
           </a>
         </Menu.Item>
         <Menu.Item>
           <a target="_blank" rel="noopener noreferrer" onClick={() => obs.addNext(nodeData)}>
-            添加下级
+            {intl.formatMessage({
+              id: 'pages.system.org.option.add',
+              defaultMessage: '添加下级',
+            })}
           </a>
         </Menu.Item>
         <Menu.Item>
@@ -116,7 +130,10 @@ const Org = observer(() => {
               // setAutzVisible(true);
             }}
           >
-            权限分配
+            {intl.formatMessage({
+              id: 'pages.system.org.option.permission',
+              defaultMessage: '权限分配',
+            })}
           </a>
         </Menu.Item>
         <Menu.Item>
@@ -128,12 +145,18 @@ const Org = observer(() => {
               // setUserVisible(true);
             }}
           >
-            绑定用户
+            {intl.formatMessage({
+              id: 'pages.system.org.option.bindUser',
+              defaultMessage: '绑定用户',
+            })}
           </a>
         </Menu.Item>
         <Menu.Item>
           <a target="_blank" rel="noopener noreferrer" onClick={() => remove(nodeData.id)}>
-            删除
+            {intl.formatMessage({
+              id: 'pages.data.option.remove',
+              defaultMessage: '删除',
+            })}
           </a>
         </Menu.Item>
       </Menu>

+ 2 - 2
src/pages/system/Permission/index.tsx

@@ -148,7 +148,7 @@ const Permission: React.FC = () => {
         <a href={record.id} target="_blank" rel="noopener noreferrer" key="view">
           <Popconfirm
             title={intl.formatMessage({
-              id: 'pages.data.option.disable.tips',
+              id: 'pages.data.option.disabled.tips',
               defaultMessage: '确认禁用?',
             })}
             onConfirm={async () => {
@@ -167,7 +167,7 @@ const Permission: React.FC = () => {
           >
             <Tooltip
               title={intl.formatMessage({
-                id: `pages.data.option.${record.status ? 'disable' : 'enable'}`,
+                id: `pages.data.option.${record.status ? 'disabled' : 'enabled'}`,
                 defaultMessage: record.status ? '禁用' : '启用',
               })}
             >

+ 5 - 2
src/pages/system/Role/index.tsx

@@ -3,10 +3,10 @@ import React, { useRef } from 'react';
 import { EditOutlined, KeyOutlined, MinusOutlined, UserAddOutlined } from '@ant-design/icons';
 import { Menu, message, Popconfirm, Tooltip } from 'antd';
 import type { ProColumns, ActionType } from '@jetlinks/pro-table';
-import { useIntl } from '@@/plugin-locale/localeExports';
 import BaseCrud from '@/components/BaseCrud';
 import { CurdModel } from '@/components/BaseCrud/model';
 import BaseService from '@/utils/BaseService';
+import { useIntl } from '@@/plugin-locale/localeExports';
 
 const menu = (
   <Menu>
@@ -55,7 +55,10 @@ const Role: React.FC = () => {
       dataIndex: 'name',
       copyable: true,
       ellipsis: true,
-      tip: '名称过长会自动收缩',
+      tip: intl.formatMessage({
+        id: 'pages.system.userName.tips',
+        defaultMessage: '用户名过长会自动收缩',
+      }),
       formItemProps: {
         rules: [
           {

+ 2 - 2
src/pages/system/Tenant/index.tsx

@@ -126,7 +126,7 @@ const Tenant = () => {
         <a href={record.tenant.id} target="_blank" rel="noopener noreferrer" key="view">
           <Popconfirm
             title={intl.formatMessage({
-              id: 'pages.data.option.disable.tips',
+              id: 'pages.data.option.disabled.tips',
               defaultMessage: '确认禁用?',
             })}
             onConfirm={async () => {
@@ -147,7 +147,7 @@ const Tenant = () => {
           >
             <Tooltip
               title={intl.formatMessage({
-                id: `pages.data.option.${record.tenant?.state.value ? 'disable' : 'enable'}`,
+                id: `pages.data.option.${record.tenant?.state.value ? 'disabled' : 'enabled'}`,
                 defaultMessage: record.tenant?.state?.value ? '禁用' : '启用',
               })}
             >

+ 5 - 5
src/pages/system/User/index.tsx

@@ -8,13 +8,13 @@ import {
 } from '@ant-design/icons';
 import { Menu, Tooltip, Popconfirm, message } from 'antd';
 import type { ProColumns, ActionType } from '@jetlinks/pro-table';
-import { useIntl } from '@@/plugin-locale/localeExports';
 import BaseCrud from '@/components/BaseCrud';
 import { CurdModel } from '@/components/BaseCrud/model';
 import BaseService from '@/utils/BaseService';
 import { observer } from '@formily/react';
 import { Store } from 'jetlinks-store';
 import SystemConst from '@/utils/const';
+import { useIntl } from '@@/plugin-locale/localeExports';
 
 const menu = (
   <Menu>
@@ -52,7 +52,7 @@ const User = observer(() => {
       ellipsis: true,
       align: 'center',
       tip: intl.formatMessage({
-        id: 'pages.system.user.name.tips',
+        id: 'pages.system.name.tips',
         defaultMessage: '姓名过长会自动收缩',
       }),
       sorter: true,
@@ -79,7 +79,7 @@ const User = observer(() => {
       ellipsis: true,
       align: 'center',
       tip: intl.formatMessage({
-        id: 'pages.system.userName.tip',
+        id: 'pages.system.userName.tips',
         defaultMessage: '用户名过长会自动收缩',
       }),
       formItemProps: {
@@ -167,7 +167,7 @@ const User = observer(() => {
         <a href={record.id} target="_blank" rel="noopener noreferrer" key="view">
           <Popconfirm
             title={intl.formatMessage({
-              id: 'pages.data.option.disable.tips',
+              id: 'pages.data.option.disabled.tips',
               defaultMessage: '确认禁用?',
             })}
             onConfirm={async () => {
@@ -186,7 +186,7 @@ const User = observer(() => {
           >
             <Tooltip
               title={intl.formatMessage({
-                id: `pages.data.option.${record.status ? 'disable' : 'enable'}`,
+                id: `pages.data.option.${record.status ? 'disabled' : 'enabled'}`,
                 defaultMessage: record.status ? '禁用' : '启用',
               })}
             >

+ 2 - 2
src/pages/visualization/Configuration/index.tsx

@@ -90,7 +90,7 @@ const Configuration = () => {
         <a>
           <Tooltip
             title={intl.formatMessage({
-              id: 'pages.visualization.option.record',
+              id: 'pages.visualization.option.copy',
               defaultMessage: '复制',
             })}
           >
@@ -100,7 +100,7 @@ const Configuration = () => {
         <a>
           <Tooltip
             title={intl.formatMessage({
-              id: 'pages.visualization.option.record',
+              id: 'pages.data.option.record',
               defaultMessage: '通知记录',
             })}
           >

+ 1 - 1
src/pages/visualization/Screen/index.tsx

@@ -102,7 +102,7 @@ const Screen = () => {
         <a>
           <Tooltip
             title={intl.formatMessage({
-              id: 'pages.link.option.record',
+              id: 'pages.data.option.record',
               defaultMessage: '通知记录',
             })}
           >