Ver Fonte

完善资产关系页面和设备地图页面的多语言

yanglzh há 1 mês atrás
pai
commit
3cb64f5d6f

+ 32 - 0
src/i18n/pages/property/en.ts

@@ -101,9 +101,22 @@ export default {
     },
   },
   relationship: {
+    dialog: {
+      editTitle: 'Edit Asset Relationship',
+      addTitle: 'Add Asset Relationship',
+      filterTitle: 'Set Filter Conditions',
+    },
     form: {
       keyword: 'Name',
       keywordPlaceholder: 'Please enter name',
+      chooseRole: 'Role',
+      chooseRolePlaceholder: 'Please select role',
+      selectedDevices: 'Selected Devices',
+    },
+    valid: {
+      roleRequired: 'Role is required',
+      deviceRequired: 'Device is required',
+      fieldRequiredTitle: '{title} is required',
     },
     actions: {
       add: 'Add Asset Relationship',
@@ -132,9 +145,28 @@ export default {
       cancel: 'Cancel',
       statusChangeConfirm: 'Are you sure to {text}?',
       statusChangeSuccess: '{text} successfully',
+      saveSuccess: 'Operation successful',
       unbindConfirm: 'Are you sure to unbind?',
       unbindSuccess: 'Unbound successfully',
       batchUnbindConfirm: 'Are you sure to batch unbind these data?',
     },
   },
+  deviceMap: {
+    form: {
+      selectProductPlaceholder: 'Select Product',
+    },
+    messages: {
+      noCoordsWarning: 'There are no devices with coordinates for this product!',
+    },
+    popup: {
+      todayAlarmTotal: 'Total alarms today',
+      todayUnhandled: 'Unhandled alarms today',
+      todayHandled: 'Handled alarms today',
+      codeLabel: 'Code: ',
+      lastOnlineTimeLabel: 'Last online time: ',
+      addressLabel: 'Address: ',
+      deviceTypeGateway: 'Gateway',
+      deviceTypeDevice: 'Device',
+    },
+  },
 };

+ 32 - 0
src/i18n/pages/property/zh-cn.ts

@@ -101,9 +101,22 @@ export default {
     },
   },
   relationship: {
+    dialog: {
+      editTitle: '编辑资产关系',
+      addTitle: '新增资产关系',
+      filterTitle: '设置筛选条件',
+    },
     form: {
       keyword: '名称',
       keywordPlaceholder: '请输入名称',
+      chooseRole: '选择角色',
+      chooseRolePlaceholder: '请选择角色',
+      selectedDevices: '已选设备',
+    },
+    valid: {
+      roleRequired: '角色不能为空',
+      deviceRequired: '设备不能为空',
+      fieldRequiredTitle: '{title}不能为空',
     },
     actions: {
       add: '新增资产关系',
@@ -132,9 +145,28 @@ export default {
       cancel: '取消',
       statusChangeConfirm: '确认要【{text}】吗?',
       statusChangeSuccess: '{text}成功',
+      saveSuccess: '操作成功',
       unbindConfirm: '是否确认解绑',
       unbindSuccess: '解绑成功',
       batchUnbindConfirm: '是否确认要批量解绑这些数据吗?',
     },
   },
+  deviceMap: {
+    form: {
+      selectProductPlaceholder: '选择产品',
+    },
+    messages: {
+      noCoordsWarning: '该产品不存在有坐标的设备!',
+    },
+    popup: {
+      todayAlarmTotal: '今日报警总数',
+      todayUnhandled: '今日未处理报警',
+      todayHandled: '今日已处理报警',
+      codeLabel: '编号:',
+      lastOnlineTimeLabel: '最后在线时间:',
+      addressLabel: '地址:',
+      deviceTypeGateway: '网关',
+      deviceTypeDevice: '设备',
+    },
+  },
 };

+ 32 - 0
src/i18n/pages/property/zh-tw.ts

@@ -101,9 +101,22 @@ export default {
     },
   },
   relationship: {
+    dialog: {
+      editTitle: '編輯資產關係',
+      addTitle: '新增資產關係',
+      filterTitle: '設置篩選條件',
+    },
     form: {
       keyword: '名稱',
       keywordPlaceholder: '請輸入名稱',
+      chooseRole: '選擇角色',
+      chooseRolePlaceholder: '請選擇角色',
+      selectedDevices: '已選設備',
+    },
+    valid: {
+      roleRequired: '角色不能為空',
+      deviceRequired: '設備不能為空',
+      fieldRequiredTitle: '{title}不能為空',
     },
     actions: {
       add: '新增資產關係',
@@ -132,9 +145,28 @@ export default {
       cancel: '取消',
       statusChangeConfirm: '確認要【{text}】嗎?',
       statusChangeSuccess: '{text}成功',
+      saveSuccess: '操作成功',
       unbindConfirm: '是否確認解绑',
       unbindSuccess: '解绑成功',
       batchUnbindConfirm: '是否確認要批量解绑這些資料嗎?',
     },
   },
+  deviceMap: {
+    form: {
+      selectProductPlaceholder: '選擇產品',
+    },
+    messages: {
+      noCoordsWarning: '該產品不存在有座標的設備!',
+    },
+    popup: {
+      todayAlarmTotal: '今日報警總數',
+      todayUnhandled: '今日未處理報警',
+      todayHandled: '今日已處理報警',
+      codeLabel: '編號:',
+      lastOnlineTimeLabel: '最後上線時間:',
+      addressLabel: '地址:',
+      deviceTypeGateway: '網關',
+      deviceTypeDevice: '設備',
+    },
+  },
 };

+ 13 - 9
src/views/iot/property/deviceMap/index.vue

@@ -6,7 +6,7 @@
 			filterable
 			clearable
 			:loading="loading"
-			placeholder="选择产品"
+			:placeholder="$t('message.property.deviceMap.form.selectProductPlaceholder')"
 			@change="handleProductChange"
 		>
 			<el-option v-for="item in productData" :key="item.key" :label="item.name" :value="item.key" value-key="id"> </el-option>
@@ -18,11 +18,13 @@
 <script lang="ts" setup>
 import { initMap, MapStyleJson } from '/@/utils/map'
 import { onMounted, ref, watch } from 'vue'
+import { useI18n } from 'vue-i18n'
 import api from '/@/api/device'
 import { ElMessage } from 'element-plus'
 import { useStore } from '/@/store/index'
 
 const store = useStore()
+const { t } = useI18n()
 
 let BMapGL: any = null
 let map: any = null
@@ -77,7 +79,7 @@ async function setMarker() {
 		const list = (device || []).filter((row: any) => row.lat && row.lng)
 
 		if (!list.length) {
-			ElMessage.warning('该产品在不存在有坐标的设备!')
+			ElMessage.warning(t('message.property.deviceMap.messages.noCoordsWarning'))
 			return map.centerAndZoom('四川', 5)
 		}
 
@@ -97,7 +99,9 @@ async function setMarker() {
 			map.addOverlay(marker)
 
 			marker.addEventListener('click', function () {
-				const deviceType = row.product.deviceType === '网关' ? '网关' : '设备'
+				const isGateway = row.product.deviceType === '网关'
+				const deviceTypeText = isGateway ? t('message.property.deviceMap.popup.deviceTypeGateway') : t('message.property.deviceMap.popup.deviceTypeDevice')
+				const addrLabel = t('message.property.deviceMap.popup.addressLabel')
 				// api.screen.alarmCount(row.key).then(({ handled, number, unhandled }: any) => {
 				const number = 0
 				const unhandled = 0
@@ -111,30 +115,30 @@ async function setMarker() {
 							? `
           <div class="map-hover-nums">
             <div class="map-hover-nums-item">
-              <div class="map-hover-nums-label">今日报警总数</div>
+              <div class="map-hover-nums-label">${t('message.property.deviceMap.popup.todayAlarmTotal')}</div>
               <div class="map-hover-nums-value">${number}</div>
             </div>
             <div class="map-hover-nums-item">
-              <div class="map-hover-nums-label">今日未处理报警</div>
+              <div class="map-hover-nums-label">${t('message.property.deviceMap.popup.todayUnhandled')}</div>
               <div class="map-hover-nums-value">${unhandled}</div>
             </div>
             <div class="map-hover-nums-item">
-              <div class="map-hover-nums-label">今日已处理报警</div>
+              <div class="map-hover-nums-label">${t('message.property.deviceMap.popup.todayHandled')}</div>
               <div class="map-hover-nums-value">${handled}</div>
             </div>
           </div>`
 							: ''
 					}
             <div class="map-hover-row-item">
-              <div class="map-hover-label">编号:</div>
+              <div class="map-hover-label">${t('message.property.deviceMap.popup.codeLabel')}</div>
               <div class="map-hover-value">${row.key}</div>
             </div>
             <div class="map-hover-row-item">
-              <div class="map-hover-label">最后在线时间:</div>
+              <div class="map-hover-label">${t('message.property.deviceMap.popup.lastOnlineTimeLabel')}</div>
               <div class="map-hover-value">${row.lastOnlineTime || '-'}</div>
             </div>
             <div class="map-hover-row-item">
-              <div class="map-hover-label">${deviceType}地址:</div>
+              <div class="map-hover-label">${deviceTypeText} ${addrLabel}</div>
               <div class="map-hover-value">${row.address || '-'}</div>
             </div>
           </div>

+ 51 - 34
src/views/iot/property/relationship/edit.vue

@@ -1,50 +1,63 @@
 <template>
-  <el-dialog class="api-edit" v-model="showDialog" :title="`${formData.id ? '编辑资产关系' : '新增资产关系'}`" width="800px" :close-on-click-modal="false" :close-on-press-escape="false">
+  <el-dialog class="api-edit" v-model="showDialog" :title="$t(formData.id ? 'message.property.relationship.dialog.editTitle' : 'message.property.relationship.dialog.addTitle')" width="800px" :close-on-click-modal="false" :close-on-press-escape="false">
     <div class="dialog-wrapper" v-if="showDialog">
       <el-form class="inline-form" ref="formRef" :model="formData" :rules="ruleForm" label-width="auto">
-        <el-form-item label="选择角色" prop="roleId">
-          <el-cascader :options="roleData" :props="{
-            checkStrictly: true, multiple: false, emitPath: false, value: 'id', label: 'name'
-          }" placeholder="请选择角色" clearable class="w100" disabled v-model="formData.roleId">
+        <el-form-item :label="$t('message.property.relationship.form.chooseRole')" prop="roleId">
+          <el-cascader
+            :options="roleData"
+            :props="{
+              checkStrictly: true,
+              multiple: false,
+              emitPath: false,
+              value: 'id',
+              label: 'name',
+            }"
+            :placeholder="$t('message.property.relationship.form.chooseRolePlaceholder')"
+            clearable
+            class="w100"
+            disabled
+            v-model="formData.roleId"
+          >
             <template #default="{ node, data }">
               <span>{{ data.name }}</span>
               <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
             </template>
           </el-cascader>
         </el-form-item>
-        <el-form-item label="已选设备" prop="deviceKeys">
-          <el-tag v-for="name in assetName" class="mr-2">{{ name }} </el-tag>
+        <el-form-item :label="$t('message.property.relationship.form.selectedDevices')" prop="deviceKeys">
+          <el-tag v-for="name in assetName" :key="name" class="mr-2">{{ name }} </el-tag>
         </el-form-item>
       </el-form>
       <el-table :data="tableData" style="width: 100%" row-key="id" @selection-change="handleSelectionChange" v-loading="loading">
         <el-table-column type="selection" reserve-selection width="55" align="center" />
-        <el-table-column prop="deviceName" label="设备名称" min-width="100" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="deviceKey" label="设备KEY" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="deviceNumber" label="设备编码" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="deviceCategory" label="设备类型" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="installTime" label="安装时间" width="160" align="center"></el-table-column>
+        <el-table-column prop="deviceName" :label="$t('message.property.relationship.columns.deviceName')" min-width="100" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="deviceKey" :label="$t('message.property.relationship.columns.deviceKey')" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="deviceNumber" :label="$t('message.property.relationship.columns.deviceNumber')" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="deviceCategory" :label="$t('message.property.relationship.columns.deviceCategory')" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="installTime" :label="$t('message.property.relationship.columns.installTime')" width="160" align="center"></el-table-column>
       </el-table>
       <pagination v-if="params.total" :total="params.total" v-model:page="params.pageNum" v-model:limit="params.pageSize" @pagination="getList()" />
     </div>
     <template #footer>
       <div class="dialog-footer">
-        <el-button @click="showDialog = false">取消</el-button>
-        <el-button type="primary" @click="onSubmit">确定</el-button>
+        <el-button @click="showDialog = false">{{ $t("message.property.relationship.messages.cancel") }}</el-button>
+        <el-button type="primary" @click="onSubmit">{{ $t("message.property.relationship.messages.confirm") }}</el-button>
       </div>
     </template>
   </el-dialog>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive, nextTick } from 'vue';
-import api from '/@/api/device'
-import system from '/@/api/system';
-import { useSearch } from '/@/hooks/useCommon'
-import { ruleRequired } from '/@/utils/validator';
-import { ElMessage } from 'element-plus';
-import { deepClone } from '/@/utils/other';
+import { ref, reactive, computed } from "vue";
+import { useI18n } from "vue-i18n";
+import api from "/@/api/device";
+import system from "/@/api/system";
+import { useSearch } from "/@/hooks/useCommon";
+import { ruleRequired } from "/@/utils/validator";
+import { ElMessage } from "element-plus";
+import { deepClone } from "/@/utils/other";
 
-const emit = defineEmits(['getList']);
+const emit = defineEmits(["getList"]);
 
 const showDialog = ref(false);
 const formRef = ref();
@@ -52,19 +65,23 @@ const roleData = ref([]);
 const assetName = ref<string[]>([]);
 const baseForm = {
   id: undefined,
-  roleId: '',
+  roleId: "",
   deviceKeys: [],
 };
 
 const formData = reactive<any>(deepClone(baseForm));
 
-const ruleForm = {
-  roleId: [ruleRequired('角色不能为空')],
-  deviceKeys: [ruleRequired('设备不能为空')],
-};
+const { t } = useI18n();
+
+const ruleForm = computed(() => {
+  return {
+    roleId: [ruleRequired(t("message.property.relationship.valid.roleRequired"))],
+    deviceKeys: [ruleRequired(t("message.property.relationship.valid.deviceRequired"))],
+  };
+});
 
-const { params, tableData, getList, loading } = useSearch<any[]>(api.dev_asset.getList, 'Data', { pageSize: 10 })
-getList()
+const { params, tableData, getList, loading } = useSearch<any[]>(api.dev_asset.getList, "Data", { pageSize: 10 });
+getList();
 
 const handleSelectionChange = (selection: any[]) => {
   formData.deviceKeys = selection.map((item) => item.deviceKey);
@@ -74,15 +91,15 @@ const handleSelectionChange = (selection: any[]) => {
 const onSubmit = async () => {
   await formRef.value.validate();
   await api.assetRelationship.bind(formData);
-  ElMessage.success('操作成功');
+  ElMessage.success(t("message.property.relationship.messages.saveSuccess"));
   resetForm();
   showDialog.value = false;
-  emit('getList');
+  emit("getList");
 };
 
 const resetForm = async () => {
   Object.assign(formData, deepClone(baseForm));
-  assetName.value = []
+  assetName.value = [];
   formRef.value && formRef.value.resetFields();
 };
 
@@ -93,7 +110,7 @@ const open = async (roleId: string) => {
   //获取所有的角色
   system.role.getList({ status: 1 }).then((resp: any) => {
     roleData.value = resp;
-  })
+  });
 };
 
 defineExpose({ open });
@@ -102,4 +119,4 @@ defineExpose({ open });
 .demo-form-inline .el-input {
   --el-input-width: 320px;
 }
-</style>
+</style>

+ 13 - 11
src/views/iot/property/relationship/filter.vue

@@ -1,35 +1,37 @@
 <template>
-  <el-dialog class="api-edit" v-model="showDialog" title="设置筛选条件" width="800px" :close-on-click-modal="false" :close-on-press-escape="false">
+  <el-dialog class="api-edit" v-model="showDialog" :title="$t('message.property.relationship.dialog.filterTitle')" width="800px" :close-on-click-modal="false" :close-on-press-escape="false">
     <el-form class="inline-form" ref="formRef" label-width="auto">
-      <el-form-item v-for="(item, i) in ruleList" :key="item.id" :label="item.title" :prop="item.name">
+      <el-form-item v-for="item in ruleList" :key="item.id" :label="item.title" :prop="item.name">
         <template #label>
           <el-checkbox v-model="item.isCheck">{{ item.title }}</el-checkbox>
         </template>
-        <el-input v-if="item.types === 'input'" v-model="item.value" :disabled="!item.isCheck" placeholder="请输入" />
-        <el-input v-else-if="item.types === 'textarea'" v-model="item.value" :disabled="!item.isCheck" type="textarea" placeholder="请输入" />
-        <el-date-picker v-else-if="item.types === 'date'" v-model="item.value" :disabled="!item.isCheck" type="date" value-format="YYYY-MM-DD" placeholder="请选择时间" class="w100" clearable />
+        <el-input v-if="item.types === 'input'" v-model="item.value" :disabled="!item.isCheck" :placeholder="$t('message.property.dossier.form.inputPlaceholder', { title: item.title })" />
+        <el-input v-else-if="item.types === 'textarea'" v-model="item.value" :disabled="!item.isCheck" type="textarea" :placeholder="$t('message.property.dossier.form.inputPlaceholder', { title: item.title })" />
+        <el-date-picker v-else-if="item.types === 'date'" v-model="item.value" :disabled="!item.isCheck" type="date" value-format="YYYY-MM-DD" :placeholder="$t('message.property.dossier.form.datePlaceholder')" class="w100" clearable />
       </el-form-item>
       <el-form-item v-if="ruleList.length % 2 === 1"> </el-form-item>
     </el-form>
     <template #footer>
       <div class="dialog-footer">
-        <el-button @click="showDialog = false">取消</el-button>
-        <el-button type="primary" @click="onSubmit">确定</el-button>
+        <el-button @click="showDialog = false">{{ $t('message.property.relationship.messages.cancel') }}</el-button>
+        <el-button type="primary" @click="onSubmit">{{ $t('message.property.relationship.messages.confirm') }}</el-button>
       </div>
     </template>
   </el-dialog>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive, nextTick } from 'vue';
+import { ref, reactive } from 'vue';
+import { useI18n } from 'vue-i18n';
 import api from '/@/api/device'
 
 import { ElMessage } from 'element-plus';
 
 const emit = defineEmits(['getList']);
+const { t } = useI18n();
 const showDialog = ref(false);
 const formRef = ref();
-const ruleList = ref([]);
+const ruleList = ref<any[]>([]);
 const baseForm = {
   id: undefined,
 };
@@ -43,7 +45,7 @@ const onSubmit = async () => {
     const isNull = item.isCheck && !item.value
     if (isNull) {
       ElMessage.closeAll()
-      ElMessage.warning(`${item.title}不能为空`)
+      ElMessage.warning(t('message.property.relationship.valid.fieldRequiredTitle', { title: item.title }))
     }
     return isNull
   })
@@ -57,7 +59,7 @@ const onSubmit = async () => {
   })
 
   await api.assetRelationship.editRuleInfo({ id: formData.id, ruleInfo });
-  ElMessage.success('操作成功');
+  ElMessage.success(t('message.property.relationship.messages.saveSuccess'));
   resetForm();
   showDialog.value = false;
   emit('getList');