Преглед на файлове

feat: 修改英文版本

HOME\tianlin01 преди 1 година
родител
ревизия
62e91c9ea5

+ 42 - 36
src/views/ad/applet/history/index.vue

@@ -12,7 +12,7 @@
     />
     <table-dialog
       ref="adDialog"
-      title="上播内容"
+      title="Broadcast  content"
       :schema="adSchema"
     />
     <preview-dialog ref="previewDialog" />
@@ -37,42 +37,48 @@ export default {
         list: getOrders,
         transform: this.transformOrder,
         filters: [
-          { key: 'status', type: 'select', placeholder: '订单状态', options: [
-            { value: 1, label: '待审核' },
-            { value: 2, label: '通过' },
-            { value: 3, label: '驳回' },
-            { value: 4, label: '待支付' },
-            { value: 5, label: '已过期' }
-          ] }
+          {
+            key: 'status', type: 'select', placeholder: 'Order Status', options: [
+              { value: 1, label: 'Pending Review' },
+              { value: 2, label: 'Passed' },
+              { value: 3, label: 'Rejected' },
+              { value: 4, label: 'Pending' },
+              { value: 5, label: 'Expired' }
+            ]
+          }
         ],
         cols: [
           { prop: 'statusTag', type: 'tag' },
-          { label: '类型', render: ({ type }) => ['', '套餐', '即刻', '插入'][type], width: 80, align: 'center' },
-          { prop: 'startDate', label: '上刊日期', width: 100 },
-          { prop: 'range', label: '时段', width: 140 },
-          { prop: 'deviceName', label: '设备' },
-          { prop: 'freq', label: '频率', 'min-width': 100 },
-          { prop: 'price', label: '总价(元)', width: 100, align: 'right' },
-          { prop: 'phoneNumber', label: '提交人电话', width: 120, align: 'right' },
-          { prop: 'createTime', label: '提交时间', width: 160, align: 'right' },
-          { prop: 'auditTime', label: '审核时间', width: 160, align: 'right' },
-          { type: 'invoke', render: [
-            { label: '上播内容', on: this.onView }
-          ] }
+          { label: 'Type', render: ({ type }) => ['', 'Package', 'Immediate', 'Insert'][type], width: 80, align: 'center' },
+          { prop: 'startDate', label: 'Date of publication', width: 100 },
+          { prop: 'range', label: 'Time Period', width: 140 },
+          { prop: 'deviceName', label: 'Device' },
+          { prop: 'freq', label: 'Frequency', 'min-width': 100 },
+          { prop: 'price', label: 'Total Price', width: 100, align: 'right' },
+          { prop: 'phoneNumber', label: 'phone number', width: 120, align: 'right' },
+          { prop: 'createTime', label: 'Submit Time', width: 160, align: 'right' },
+          { prop: 'auditTime', label: 'Review Time', width: 160, align: 'right' },
+          {
+            type: 'invoke', render: [
+              { label: 'Broadcast  content', on: this.onView }
+            ]
+          }
         ]
       },
       adSchema: {
         nonPagination: true,
         list: this.getAssets,
         cols: [
-          { prop: 'typeInfo', label: '资源', width: 72, align: 'center' },
+          { prop: 'typeInfo', label: 'Resources', width: 72, align: 'center' },
           { prop: 'file', label: '', type: 'asset', on: this.onViewAsset },
-          { prop: 'adDuration', label: '上播时长', align: 'center' },
-          { prop: 'ratio', label: '分辨率', align: 'right' },
+          { prop: 'adDuration', label: 'Broadcast Duration', align: 'center' },
+          { prop: 'ratio', label: 'Resolution', align: 'right' },
           { prop: 'statusTag', type: 'tag' },
-          { type: 'invoke', render: [
-            { label: '查看', allow: ({ file }) => !!file, on: this.onViewAsset }
-          ] }
+          {
+            type: 'invoke', render: [
+              { label: 'View', allow: ({ file }) => !!file, on: this.onViewAsset }
+            ]
+          }
         ]
       }
     }
@@ -84,12 +90,12 @@ export default {
         case AppletOrderType.PACKAGE:
           return {
             startDate,
-            range: startTime === SCREEN_TIME_KEY && endTime === SCREEN_TIME_KEY ? '开机期间' : `${startTime}-${endTime}`,
-            freq: `${day}天 x ${duration}秒 x ${count}次`
+            range: startTime === SCREEN_TIME_KEY && endTime === SCREEN_TIME_KEY ? 'Startup period' : `${startTime}-${endTime}`,
+            freq: `${day}day x ${duration}second x ${count}times`
           }
         case AppletOrderType.SOON:
           return {
-            freq: `${assets.reduce((total, { adDuration }) => total + adDuration, 0)}`
+            freq: `${assets.reduce((total, { adDuration }) => total + adDuration, 0)}second`
           }
         default:
           return null
@@ -104,7 +110,7 @@ export default {
           id,
           type,
           statusTag: this.getOrderTag(status, expand),
-          startDate: '异常数据',
+          startDate: 'Exception data',
           price: (price / 100).toFixed(2),
           phoneNumber,
           createTime,
@@ -129,28 +135,28 @@ export default {
         case 1:
           return {
             type: 'primay',
-            label: '待审核'
+            label: 'Pending Review'
           }
         case 2:
           return {
             type: 'success',
-            label: '通过'
+            label: 'Passed'
           }
         case 3:
           return {
             type: 'danger',
-            label: '驳回',
+            label: 'Rejected',
             msg: expand
           }
         case 4:
           return {
             type: 'warning',
-            label: '待支付'
+            label: 'Pending Payment'
           }
         case 5:
           return {
             type: 'danger',
-            label: '已过期'
+            label: 'Expired'
           }
         default:
           return null
@@ -173,7 +179,7 @@ export default {
         data.ratio = width && height ? `${width}x${height}` : '-'
         data.statusTag = {
           type: ['', 'primay', 'success', 'danger'][status],
-          label: ['-', '待审核', '通过', '驳回'][status],
+          label: ['-', 'Pending Review', 'Passed', 'Rejected'][status],
           msg: reason
         }
       }

+ 25 - 19
src/views/ad/applet/review-asset/index.vue

@@ -11,14 +11,16 @@
     />
     <confirm-dialog
       ref="rejectDialog"
-      title="拒绝原因"
+      title="Reason of rejection"
       @confirm="onConfirmReject"
     >
       <div class="c-grid-form u-align-self--center">
-        <span class="c-grid-form__label">拒绝原因</span>
+        <span class="c-grid-form__label">
+          Reason of rejection
+        </span>
         <el-select
           v-model="review.type"
-          placeholder="请选择"
+          placeholder="Please select"
         >
           <el-option
             v-for="option in reviewOptions"
@@ -28,11 +30,13 @@
           />
         </el-select>
         <template v-if="review.type === 'reject'">
-          <span class="c-grid-form__label u-required">描述</span>
+          <span class="c-grid-form__label u-required">
+            Description
+          </span>
           <el-input
             v-model.trim="review.reason"
             type="textarea"
-            placeholder="请填写拒绝原因"
+            placeholder="Please fill in the reason for rejection"
             maxlength="50"
             :rows="3"
             resize="none"
@@ -68,21 +72,23 @@ export default {
         condition: { status: State.SUBMITTED },
         cols: [
           { prop: 'typeInfo', type: 'refresh', width: 72, align: 'center' },
-          { prop: 'file', label: '资源', type: 'asset', on: this.onViewAsset },
-          { prop: 'size', label: '文件大小', align: 'right' },
-          { prop: 'ratio', label: '分辨率', align: 'right' },
-          { prop: 'diff', label: '其他', align: 'right' },
-          { prop: 'createTime', label: '提交时间', width: 160, align: 'right' },
-          { type: 'invoke', width: 160, render: [
-            { label: '查看', on: this.onViewAsset },
-            { label: '通过', on: this.onResolve },
-            { label: '拒绝', on: this.onReject }
-          ] }
+          { prop: 'file', label: 'Resources', type: 'asset', on: this.onViewAsset },
+          { prop: 'size', label: 'File Size', align: 'right' },
+          { prop: 'ratio', label: 'Resolution', align: 'right' },
+          { prop: 'diff', label: 'Other', align: 'right' },
+          { prop: 'createTime', label: 'Submission Time', width: 160, align: 'right' },
+          {
+            type: 'invoke', width: 160, render: [
+              { label: 'View', on: this.onViewAsset },
+              { label: 'Pass', on: this.onResolve },
+              { label: 'Reject', on: this.onReject }
+            ]
+          }
         ]
       },
       reviewOptions: [
-        { value: 'reject', label: '自定义' },
-        { value: '内容不合规' }
+        { value: 'reject', label: 'Customize' },
+        { value: 'Content non-compliance' }
       ],
       review: {
         type: '',
@@ -98,7 +104,7 @@ export default {
         data.ratio = width && height ? `${width}x${height}` : '-'
         data.statusTag = {
           type: ['', 'primay', 'success', 'danger'][status],
-          label: ['-', '待审核', '通过', '驳回'][status],
+          label: ['-', 'Pending Review', 'Passed', 'Rejected'][status],
           msg: reason
         }
         data.size = parseByte(size)
@@ -126,7 +132,7 @@ export default {
       if (!reason) {
         this.$message({
           type: 'warning',
-          message: '请选择或填写驳回原因'
+          message: 'Please select or fill in the reason for rejection'
         })
         return
       }

+ 44 - 36
src/views/ad/applet/review-order/index.vue

@@ -11,14 +11,16 @@
     />
     <confirm-dialog
       ref="rejectDialog"
-      title="拒绝原因"
+      title="Reason of rejection"
       @confirm="onConfirmReject"
     >
       <div class="c-grid-form u-align-self--center">
-        <span class="c-grid-form__label">拒绝原因</span>
+        <span class="c-grid-form__label">
+          Reason of rejection
+        </span>
         <el-select
           v-model="review.type"
-          placeholder="请选择"
+          placeholder="Please select"
         >
           <el-option
             v-for="option in reviewOptions"
@@ -28,11 +30,13 @@
           />
         </el-select>
         <template v-if="review.type === 'reject'">
-          <span class="c-grid-form__label u-required">描述</span>
+          <span class="c-grid-form__label u-required">
+            Description
+          </span>
           <el-input
             v-model.trim="review.reason"
             type="textarea"
-            placeholder="请填写拒绝原因"
+            placeholder="Please fill in the reason for rejection"
             maxlength="50"
             :rows="3"
             resize="none"
@@ -43,7 +47,7 @@
     </confirm-dialog>
     <table-dialog
       ref="adDialog"
-      title="上播内容"
+      title="Broadcast content"
       :schema="adSchema"
     />
     <preview-dialog ref="previewDialog" />
@@ -75,25 +79,27 @@ export default {
         condition: { status: State.SUBMITTED },
         cols: [
           { type: 'refresh' },
-          { label: '类型', render: ({ type }) => ['', '套餐', '即刻', '插入'][type], width: 80, align: 'center' },
-          { prop: 'startDate', label: '上刊日期', width: 100 },
-          { prop: 'range', label: '时段', width: 140 },
-          { prop: 'deviceName', label: '设备' },
-          { prop: 'freq', label: '频率' },
-          { prop: 'price', label: '总价(元)', width: 100, align: 'right' },
-          { prop: 'phoneNumber', label: '提交人电话', width: 120, align: 'right' },
-          { prop: 'createTime', label: '提交时间', width: 160, align: 'right' },
-          { type: 'invoke', width: 180, render: [
-            { label: '上播内容', on: this.onView },
-            { label: '通过'/* , allow: ({ invalid }) => !invalid */, on: this.onResolve },
-            { label: '拒绝', on: this.onReject }
-          ] }
+          { label: 'Type', render: ({ type }) => ['', 'Package', 'Immediate', 'Insert'][type], width: 80, align: 'center' },
+          { prop: 'startDate', label: 'Date of publication', width: 100 },
+          { prop: 'range', label: 'Time Period', width: 140 },
+          { prop: 'deviceName', label: 'Device' },
+          { prop: 'freq', label: 'Frequency' },
+          { prop: 'price', label: 'Total Price', width: 100, align: 'right' },
+          { prop: 'phoneNumber', label: 'Phone number', width: 120, align: 'right' },
+          { prop: 'createTime', label: 'Submit Time', width: 160, align: 'right' },
+          {
+            type: 'invoke', width: 180, render: [
+              { label: 'Broadcast content', on: this.onView },
+              { label: 'Pass'/* , allow: ({ invalid }) => !invalid */, on: this.onResolve },
+              { label: 'Reject', on: this.onReject }
+            ]
+          }
         ]
       },
       reviewOptions: [
-        { value: 'reject', label: '自定义' },
-        { value: '播放时段已被占用' },
-        { value: '内容不合规' }
+        { value: 'reject', label: 'Customize' },
+        { value: 'Broadcasting time slots have been taken' },
+        { value: 'Content non-compliance' }
       ],
       review: {
         type: '',
@@ -103,14 +109,16 @@ export default {
         nonPagination: true,
         list: this.getAssets,
         cols: [
-          { prop: 'typeInfo', label: '资源', width: 72, align: 'center' },
+          { prop: 'typeInfo', label: 'Resources', width: 72, align: 'center' },
           { prop: 'file', label: '', type: 'asset', on: this.onViewAsset },
-          { prop: 'adDuration', label: '上播时长', align: 'center' },
-          { prop: 'ratio', label: '分辨率', align: 'right' },
+          { prop: 'adDuration', label: 'Broadcast Duration', align: 'center' },
+          { prop: 'ratio', label: 'Resolution', align: 'right' },
           { prop: 'statusTag', type: 'tag' },
-          { type: 'invoke', render: [
-            { label: '查看', allow: ({ file }) => !!file, on: this.onViewAsset }
-          ] }
+          {
+            type: 'invoke', render: [
+              { label: 'View', allow: ({ file }) => !!file, on: this.onViewAsset }
+            ]
+          }
         ]
       }
     }
@@ -122,13 +130,13 @@ export default {
         case AppletOrderType.PACKAGE:
           return {
             startDate,
-            range: startTime === SCREEN_TIME_KEY && endTime === SCREEN_TIME_KEY ? '开机期间' : `${startTime}-${endTime}`,
-            freq: `${day}天 x ${duration}秒 x ${count}次`
+            range: startTime === SCREEN_TIME_KEY && endTime === SCREEN_TIME_KEY ? 'Startup period' : `${startTime}-${endTime}`,
+            freq: `${day}day x ${duration}second x ${count}times`
           }
         case AppletOrderType.SOON:
           return {
-            range: '即刻',
-            freq: `${assets.reduce((total, { adDuration }) => total + adDuration, 0)}`
+            range: 'Immediate',
+            freq: `${assets.reduce((total, { adDuration }) => total + adDuration, 0)}second`
           }
         default:
           return null
@@ -142,7 +150,7 @@ export default {
         return {
           id,
           type,
-          startDate: '异常数据',
+          startDate: 'Exception data',
           price: (price / 100).toFixed(2),
           phoneNumber,
           createTime,
@@ -154,7 +162,7 @@ export default {
         ...this.getInfo(type, orders, assets),
         id,
         type,
-        deviceName: orders.length > 1 ? `${orders[0].name}` : orders[0].name,
+        deviceName: orders.length > 1 ? `${orders[0].name}...` : orders[0].name,
         price: (price / 100).toFixed(2),
         phoneNumber,
         createTime,
@@ -184,7 +192,7 @@ export default {
       if (!reason) {
         this.$message({
           type: 'warning',
-          message: '请选择或填写驳回原因'
+          message: 'Please fill in the reason for rejection'
         })
         return
       }
@@ -203,7 +211,7 @@ export default {
         data.ratio = width && height ? `${width}x${height}` : '-'
         data.statusTag = {
           type: ['', 'primay', 'success', 'danger'][status],
-          label: ['-', '待审核', '通过', '驳回'][status],
+          label: ['-', 'Pending Review', 'Pass', 'Reject'][status],
           msg: reason
         }
       }

+ 71 - 57
src/views/ad/applet/user/index.vue

@@ -11,20 +11,20 @@
     />
     <table-dialog
       ref="assetDialog"
-      title="个人媒资"
+      title="Personal Media Assets"
       size="lg"
       :schema="assetSchema"
     />
     <table-dialog
       ref="orderDialog"
-      title="个人订单"
+      title="Personal Order"
       size="lg"
       :schema="orderSchema"
       @row-click="onToggle"
     />
     <table-dialog
       ref="adDialog"
-      title="上播内容"
+      title="Broadcast content"
       :schema="adSchema"
     />
     <preview-dialog ref="previewDialog" />
@@ -52,83 +52,97 @@ export default {
         list: getUsers,
         transform: this.transform,
         filters: [
-          { key: 'phoneNumber', type: 'search', placeholder: '手机号' }
+          { key: 'phoneNumber', type: 'search', placeholder: 'Phone Number' }
         ],
         cols: [
           { prop: 'file', type: 'asset', refresh: true },
-          { prop: 'nickName', label: '昵称' },
-          { prop: 'phoneNumber', label: '手机号', align: 'center', 'min-width': 120 },
-          { type: 'invoke', render: [
-            { label: '媒资', on: this.onAsset },
-            { label: '订单', on: this.onOrder }
-          ] }
+          { prop: 'nickName', label: 'Nickname' },
+          { prop: 'phoneNumber', label: 'Phone Number', align: 'center', 'min-width': 120 },
+          {
+            type: 'invoke', render: [
+              { label: 'Media Assets', on: this.onAsset },
+              { label: 'Order', on: this.onOrder }
+            ]
+          }
         ]
       },
       assetSchema: {
         list: this.getAssets,
         transform: this.transformAsset,
         filters: [
-          { key: 'status', type: 'select', placeholder: '状态', options: [
-            { value: State.SUBMITTED, label: '待审核' },
-            { value: State.RESOLVED, label: '通过' },
-            { value: State.REJECTED, label: '驳回' }
-          ] }
+          {
+            key: 'status', type: 'select', placeholder: 'Status', options: [
+              { value: State.SUBMITTED, label: 'Pending Review' },
+              { value: State.RESOLVED, label: 'Pass' },
+              { value: State.REJECTED, label: 'Reject' }
+            ]
+          }
         ],
         cols: [
           { prop: 'typeInfo', type: 'refresh', width: 72, align: 'center' },
-          { prop: 'file', label: '资源', type: 'asset', on: this.onViewAsset },
-          { prop: 'size', label: '文件大小', align: 'right' },
-          { prop: 'ratio', label: '分辨率', align: 'right' },
-          { prop: 'diff', label: '其他', align: 'right' },
+          { prop: 'file', label: 'Resources', type: 'asset', on: this.onViewAsset },
+          { prop: 'size', label: 'File Size', align: 'right' },
+          { prop: 'ratio', label: 'Resolution', align: 'right' },
+          { prop: 'diff', label: 'Other', align: 'right' },
           { prop: 'statusTag', type: 'tag' },
-          { prop: 'createTime', label: '上传时间', align: 'right', 'min-width': 120 },
-          { type: 'invoke', render: [
-            { label: '查看', allow: ({ file }) => !!file, on: this.onViewAsset }
-          ] }
+          { prop: 'createTime', label: 'Broadcast time', align: 'right', 'min-width': 120 },
+          {
+            type: 'invoke', render: [
+              { label: 'View', allow: ({ file }) => !!file, on: this.onViewAsset }
+            ]
+          }
         ]
       },
       orderSchema: {
         list: this.getOrders,
         transform: this.transformOrder,
         filters: [
-          { key: 'status', type: 'select', placeholder: '订单状态', options: [
-            { value: 1, label: '待审核' },
-            { value: 2, label: '通过' },
-            { value: 3, label: '驳回' },
-            { value: 4, label: '待支付' },
-            { value: 5, label: '已过期' }
-          ] }
+          {
+            key: 'status', type: 'select', placeholder: 'Order Status', options: [
+              { value: 1, label: 'Pending Review' },
+              { value: 2, label: 'Passed' },
+              { value: 3, label: 'Rejected' },
+              { value: 4, label: 'Pending' },
+              { value: 5, label: 'Expired' }
+            ]
+          }
         ],
         cols: [
-          { type: 'expand', refresh: true, render: (data, h) => h('div', {
-            staticClass: 'o-info'
-          }, [
-            h('div', null, `时段:${data.range}`),
-            h('div', null, `频率:${data.freq}`)
-          ]) },
-          { prop: 'deviceName', label: '设备', 'min-width': 100 },
-          { prop: 'startDate', label: '上刊日期', align: 'right', 'min-width': 100 },
-          { prop: 'price', label: '总价(元)', 'min-width': 100, align: 'right' },
+          {
+            type: 'expand', refresh: true, render: (data, h) => h('div', {
+              staticClass: 'o-info'
+            }, [
+              h('div', null, `Time Period:${data.range}`),
+              h('div', null, `Frequency:${data.freq}`)
+            ])
+          },
+          { prop: 'deviceName', label: 'Device', 'min-width': 100 },
+          { prop: 'startDate', label: 'Date of publication', align: 'right', 'min-width': 100 },
+          { prop: 'price', label: 'Total Price', 'min-width': 100, align: 'right' },
           { prop: 'statusTag', type: 'tag' },
-          { prop: 'createTime', label: '提交时间', align: 'right', 'min-width': 120 },
-          { prop: 'auditTime', label: '审核时间', align: 'right', 'min-width': 120 },
-          { type: 'invoke', render: [
-            { label: '上播内容', on: this.onViewOrderAssets }
-          ] }
+          { prop: 'createTime', label: 'Submit Time', align: 'right', 'min-width': 120 },
+          { prop: 'auditTime', label: 'Review Time', align: 'right', 'min-width': 120 },
+          {
+            type: 'invoke', render: [
+              { label: 'Broadcast content', on: this.onViewOrderAssets }
+            ]
+          }
         ]
       },
       adSchema: {
         nonPagination: true,
         list: this.getOrderAssets,
         cols: [
-          { prop: 'typeInfo', label: '资源', width: 72, align: 'center' },
+          { prop: 'typeInfo', label: 'Resources', width: 72, align: 'center' },
           { prop: 'file', label: '', type: 'asset', on: this.onViewAsset },
-          { prop: 'ratio', label: '分辨率', align: 'right' },
-          { prop: 'adDuration', label: '上播时长', align: 'center' },
+          { prop: 'ratio', label: 'Resolution', align: 'right' },
+          { prop: 'adDuration', label: 'Broadcast Duration', align: 'center' },
           { prop: 'statusTag', type: 'tag' },
-          { type: 'invoke', render: [
-            { label: '查看', allow: ({ file }) => !!file, on: this.onViewAsset }
-          ] }
+          {
+            type: 'invoke', render: [
+              { label: 'View', allow: ({ file }) => !!file, on: this.onViewAsset }
+            ]
+          }
         ]
       }
     }
@@ -160,7 +174,7 @@ export default {
         data.ratio = width && height ? `${width}x${height}` : '-'
         data.statusTag = {
           type: ['', 'primay', 'success', 'danger'][status],
-          label: ['-', '待审核', '通过', '驳回'][status],
+          label: ['-', 'Pending Review', 'Passed', 'Rejected'][status],
           msg: reason
         }
         data.size = parseByte(size)
@@ -191,7 +205,7 @@ export default {
         startDate,
         range: `${startTime}-${endTime}`,
         price: (price / 100).toFixed(2),
-        freq: `${day}天 x ${duration}秒 x ${count}次`,
+        freq: `${day}day x ${duration}second x ${count}times`,
         statusTag: this.getOrderTag(status, expand),
         assets,
         createTime,
@@ -203,28 +217,28 @@ export default {
         case 1:
           return {
             type: 'primay',
-            label: '待审核'
+            label: 'Pending Review'
           }
         case 2:
           return {
             type: 'success',
-            label: '通过'
+            label: 'Passed'
           }
         case 3:
           return {
             type: 'danger',
-            label: '驳回',
+            label: 'Rejected',
             msg: expand
           }
         case 4:
           return {
             type: 'warning',
-            label: '待支付'
+            label: 'Pending Payment'
           }
         case 5:
           return {
             type: 'danger',
-            label: '已过期'
+            label: 'Expired'
           }
         default:
           return null

+ 88 - 61
src/views/ad/automation/contract/index.vue

@@ -19,13 +19,18 @@
     >
       <div class="l-flex__fill l-flex c-step">
         <div class="l-flex__none l-flex--col c-step__column">
-          <div class="c-contract-dialog__header u-color--black u-font-size--sm u-bold has-bottom-border">基本数据(影响初次导入)</div>
+          <div class="c-contract-dialog__header u-color--black u-font-size--sm u-bold has-bottom-border">
+            Basic data
+            (affects initial import)
+          </div>
           <div class="l-flex__fill u-overflow-y--auto">
             <div
               v-if="contract"
               class="c-grid-form auto"
             >
-              <div class="c-grid-form__label">上刊日期</div>
+              <div class="c-grid-form__label">
+                Date of publication
+              </div>
               <el-date-picker
                 v-model="contract.date"
                 class="u-width--md"
@@ -35,14 +40,18 @@
                 :editable="false"
                 :clearable="false"
               />
-              <div class="c-grid-form__label">上播方式</div>
+              <div class="c-grid-form__label">
+                Broadcast Method
+              </div>
               <schema-select
                 v-model="contract.time.type"
                 class="u-width--xs"
                 :schema="timeTypeSelectSchema"
               />
               <template v-if="contract.time.type === 2">
-                <div class="c-grid-form__label">时段</div>
+                <div class="c-grid-form__label">
+                  Time Period
+                </div>
                 <el-time-picker
                   key="range-picker"
                   v-model="contract.time.range"
@@ -53,7 +62,9 @@
                 />
               </template>
               <template v-if="contract.time.type === 3">
-                <div class="c-grid-form__label">时间点</div>
+                <div class="c-grid-form__label">
+                  Point in time
+                </div>
                 <el-time-picker
                   key="time-picker"
                   v-model="contract.time.point"
@@ -62,20 +73,26 @@
                   :clearable="false"
                 />
               </template>
-              <div class="c-grid-form__label">上播时长(s)</div>
+              <div class="c-grid-form__label">
+                Broadcast duration(s)
+              </div>
               <el-input-number
                 :value="totalDuration"
                 controls-position="right"
                 disabled
               />
-              <div class="c-grid-form__label">上播次数</div>
+              <div class="c-grid-form__label">
+                Times of Broadcast
+              </div>
               <el-input-number
                 v-model="contract.count"
                 controls-position="right"
                 :min="1"
                 step-strictly
               />
-              <div class="c-grid-form__label">关联的文件</div>
+              <div class="c-grid-form__label">
+                Associated files
+              </div>
               <div class="c-grid-form__option">
                 <el-upload
                   ref="upload"
@@ -115,7 +132,9 @@
               class="l-flex--row inline u-color--black u-font-size--sm u-bold has-active"
               @click="onEditAssets"
             >
-              <span class="c-sibling-item u-bold">上播内容</span>
+              <span class="c-sibling-item u-bold">
+                Broadcast content
+              </span>
               <i class="c-sibling-item near el-icon-edit" />
             </div>
           </div>
@@ -130,7 +149,7 @@
     </confirm-dialog>
     <multi-asset-transfer-dialog
       ref="transferDialog"
-      title="上播内容"
+      title="Broadcast content"
       :choosen="onSaveAssets"
       @view="onViewAsset"
     />
@@ -186,28 +205,32 @@ export default {
         ],
         cols: [
           { type: 'selection' },
-          { label: '名称', render: (data, h) => h('edit-input', {
-            props: {
-              value: data.name
-            },
-            on: { edit: val => this.onEditName(data, val) }
-          }), 'class-name': 'c-edit-column', 'min-width': 240 },
-          { prop: 'dateRange', label: '上刊日期', 'min-width': 200, align: 'center' },
-          { prop: 'timeRange', label: '上播时间', 'min-width': 160, align: 'center' },
-          { prop: 'durationInfo', label: '单次时长', 'min-width': 120, align: 'center' },
-          { prop: 'count', label: '上播次数', 'min-width': 120, align: 'right' },
-          { type: 'invoke', render: [
-            { label: '详情', on: this.onEdit },
-            { label: '删除', on: this.onDel }
-          ] }
+          {
+            label: 'Name', render: (data, h) => h('edit-input', {
+              props: {
+                value: data.name
+              },
+              on: { edit: val => this.onEditName(data, val) }
+            }), 'class-name': 'c-edit-column', 'min-width': 240
+          },
+          { prop: 'dateRange', label: 'Date of publication', 'min-width': 200, align: 'center' },
+          { prop: 'timeRange', label: 'Broadcast Time', 'min-width': 160, align: 'center' },
+          { prop: 'durationInfo', label: 'Single Duration', 'min-width': 120, align: 'center' },
+          { prop: 'count', label: 'Times of Broadcast', 'min-width': 120, align: 'right' },
+          {
+            type: 'invoke', render: [
+              { label: 'Details', on: this.onEdit },
+              { label: 'Delete', on: this.onDel }
+            ]
+          }
         ]
       },
       contract: null,
       timeTypeSelectSchema: {
         options: [
-          { value: TimeType.SCREEN, label: '开机期间' },
-          { value: TimeType.RANGE, label: '时段' },
-          { value: TimeType.POINT, label: '时间点' }
+          { value: TimeType.SCREEN, label: 'Startup period' },
+          { value: TimeType.RANGE, label: 'Time Period' },
+          { value: TimeType.POINT, label: 'Point in time' }
         ]
       },
       files: [],
@@ -219,18 +242,20 @@ export default {
         },
         list: this.getAssetsByDataset,
         buttons: [
-          { type: 'del', label: '移除', on: this.onDelAssets }
+          { type: 'del', label: 'Remove', on: this.onDelAssets }
         ],
         cols: [
           { type: 'selection' },
-          { prop: 'tagInfo', label: '分类', width: 72, align: 'center' },
-          { prop: 'typeInfo', label: '资源', width: 72, align: 'center' },
+          { prop: 'tagInfo', label: 'Category', width: 72, align: 'center' },
+          { prop: 'typeInfo', label: 'Resources', width: 72, align: 'center' },
           { prop: 'file', label: '', type: 'asset', on: this.onViewAsset },
           { prop: 'name', label: '' },
-          { prop: 'durationInfo', label: '上播时长', width: 80, align: 'center' },
-          { type: 'invoke', render: [
-            { label: '移除', on: this.onDelAsset }
-          ] }
+          { prop: 'durationInfo', label: 'Broadcast duration', width: 80, align: 'center' },
+          {
+            type: 'invoke', render: [
+              { label: 'Remove', on: this.onDelAsset }
+            ]
+          }
         ]
       },
       assets: []
@@ -250,27 +275,27 @@ export default {
     },
     onAdd () {
       this.$prompt(
-        '<p class="u-color--black u-font-size--sm u-bold">合同名称</p>',
-        '新增合同',
+        '<p class="u-color--black u-font-size--sm u-bold">Contract Name</p>',
+        'Add Contract',
         {
           dangerouslyUseHTMLString: true,
           closeOnClickModal: false,
           inputValue: '',
-          inputPlaceholder: '最多30个字符',
+          inputPlaceholder: 'Maximum 30 characters',
           inputPattern: /^.{0,30}$/,
           inputValidator: val => {
             console.log(val)
             if (val) {
               if (/^\s+|\s+$/.test(val)) {
-                return '请勿输入首尾空格'
+                return 'Please do not enter spaces at the beginning and end'
               }
               return true
             }
-            return '请填写名称'
+            return 'Please fill in the name'
           },
-          inputErrorMessage: '最多30个字符',
-          confirmButtonText: '新增',
-          cancelButtonText: '取消',
+          inputErrorMessage: 'Maximum 30 characters',
+          confirmButtonText: 'Add',
+          cancelButtonText: 'Cancel',
           beforeClose: (action, instance, done) => {
             if (action === 'confirm') {
               this.onSave(instance.inputValue, done)
@@ -298,7 +323,7 @@ export default {
     },
     transform (contract) {
       contract.durationInfo = parseDuration(contract.duration)
-      contract.dateRange = `${contract.startDate}  ${offsetDate(contract.startDate, contract.day)}`
+      contract.dateRange = `${contract.startDate} - ${offsetDate(contract.startDate, contract.day)}`
       contract.timeRange = getTaskTimeInfo(contract)
       return contract
     },
@@ -309,7 +334,7 @@ export default {
       if (!newVal) {
         this.$message({
           type: 'warning',
-          message: '请填写合同名称'
+          message: 'Please fill in the contract name'
         })
         return
       }
@@ -343,14 +368,14 @@ export default {
       if (!startTime) {
         this.$message({
           type: 'warning',
-          message: '请选择上播时间'
+          message: 'Please select the time of broadcasting'
         })
         return
       }
       if (endTime && endTime !== SCREEN_TIME_KEY && startTime >= endTime) {
         this.$message({
           type: 'warning',
-          message: '开始时间必须小于结束时间'
+          message: 'The start time must be less than the end time'
         })
         return
       }
@@ -452,7 +477,7 @@ export default {
       } else {
         this.$message({
           type: 'warning',
-          message: '请先选择需要删除的合同'
+          message: 'Please select the contract you want to delete first'
         })
       }
     },
@@ -464,16 +489,18 @@ export default {
     },
     getAssetsByDataset () {
       this.$selectionAssetItems = null
-      return Promise.resolve({ data: this.assets.map(({ key, tag, type, file, name, duration }) => {
-        return {
-          key,
-          tagInfo: AssetTagInfo[tag],
-          typeInfo: AssetTypeInfo[type],
-          file,
-          name,
-          durationInfo: parseDuration(duration)
-        }
-      }) })
+      return Promise.resolve({
+        data: this.assets.map(({ key, tag, type, file, name, duration }) => {
+          return {
+            key,
+            tagInfo: AssetTagInfo[tag],
+            typeInfo: AssetTypeInfo[type],
+            file,
+            name,
+            durationInfo: parseDuration(duration)
+          }
+        })
+      })
     },
     onAssetChanged () {
       this.$refs.assetContentTable.pageTo()
@@ -491,8 +518,8 @@ export default {
     onDelAssets () {
       if (this.$selectionAssetItems?.length) {
         this.$confirm(
-          '移除所选资源?',
-          '操作确认',
+          'Remove the selected resource?',
+          'Confirm operation',
           { type: 'warning' }
         ).then(() => {
           this.$selectionAssetItems.forEach(({ key }) => {
@@ -504,7 +531,7 @@ export default {
       } else {
         this.$message({
           type: 'warning',
-          message: '请选择需移除的资源'
+          message: 'Please select the resources to be removed'
         })
       }
     }
@@ -560,7 +587,7 @@ export default {
   &__file {
     width: 350px;
 
-    & + & {
+    &+& {
       border-top: 1px solid $border;
     }
   }

+ 80 - 72
src/views/ad/automation/dataset/index.vue

@@ -11,7 +11,7 @@
     />
     <c-dialog
       ref="assetDialog"
-      title="上播内容"
+      title="Broadcast content"
       size="xl fixed"
       @closed="onClosed"
     >
@@ -29,15 +29,13 @@
             @change="onAssetDirectoryChanged"
           />
         </template>
-        <div
-          class="l-flex__none l-flex--row right c-sibling-item--v"
-        >
+        <div class="l-flex__none l-flex--row right c-sibling-item--v">
           <div class="l-flex__fill c-sibling-item">
             <div
               class="o-button"
               @click="onDelAssets"
             >
-              移除
+              Remove
             </div>
           </div>
           <div class="l-flex__none l-flex--row right c-sibling-item--v near u-font-size--sm u-color-black u-bold">
@@ -81,15 +79,15 @@
     </c-dialog>
     <table-dialog
       ref="deviceDialog"
-      title="关联的设备"
+      title="Associated Devices"
       :schema="deviceSchema"
       @row-click="onRowClick"
       @selection-change="onSelectionChange"
     />
     <radio-table-dialog
       ref="devicesDialog"
-      title="绑定设备"
-      message="请选择设备"
+      title="Bind device"
+      message="Please select device"
       :schema="devicesSchema"
       append-to-body
       @confirm="onChoosenDevice"
@@ -141,25 +139,31 @@ export default {
           { type: 'add', on: this.onAdd }
         ],
         filters: [
-          { key: 'name', type: 'search', placeholder: '名称' },
+          {
+            key: 'name', type: 'search', placeholder: 'Name'
+          },
           { type: 'refresh' }
         ],
         cols: [
           { type: 'refresh' },
-          { prop: 'name', label: '名称', render: (data, h) => h('edit-input', {
-            props: {
-              value: `${data.name}`
-            },
-            on: { edit: val => this.onEditName(data, val) }
-          }), 'class-name': 'c-edit-column' },
-          { prop: 'createTime', label: '创建时间', width: 200 },
-          { prop: 'updateTime', label: '更新时间', width: 200 },
-          { type: 'invoke', render: [
-            { label: '上播内容', on: this.onEdit },
-            { label: '关联设备', on: this.onViewDevices },
-            { label: '复制', on: this.onCopy },
-            { label: '删除', on: this.onDel }
-          ], width: 240 }
+          {
+            prop: 'name', label: 'Name', render: (data, h) => h('edit-input', {
+              props: {
+                value: `${data.name}`
+              },
+              on: { edit: val => this.onEditName(data, val) }
+            }), 'class-name': 'c-edit-column'
+          },
+          { prop: 'createTime', label: 'Create time', width: 200 },
+          { prop: 'updateTime', label: 'Update Time', width: 200 },
+          {
+            type: 'invoke', render: [
+              { label: 'Broadcast content', on: this.onEdit },
+              { label: 'Associated Devices', on: this.onViewDevices },
+              { label: 'Copy', on: this.onCopy },
+              { label: 'Delete', on: this.onDel }
+            ], width: 240
+          }
         ]
       },
       assetSchema: {
@@ -172,48 +176,52 @@ export default {
         transform: transformDatasetAssetToAsset,
         cols: [
           { type: 'selection' },
-          { prop: 'tagInfo', label: '分类', width: 72, align: 'center' },
-          { prop: 'typeInfo', label: '资源', width: 72, align: 'center' },
+          { prop: 'tagInfo', label: 'Category', width: 72, align: 'center' },
+          { prop: 'typeInfo', label: 'Resources', width: 72, align: 'center' },
           { prop: 'file', label: '', type: 'asset', on: this.onViewAsset },
           { prop: 'name', label: '' },
-          { label: '上播时长(s)', render: (data, h) => data.minioData && data.type === AssetType.IMAGE
-            ? h('edit-input', {
-              staticClass: 'border',
-              props: {
-                value: `${data.adDuration}`,
-                align: 'center',
-                size: 'sm'
-              },
-              on: {
-                edit: val => this.onEditAssetDuration(data, val)
-              }
-            })
-            : parseDuration(data.adDuration), width: 100, align: 'center' }
+          {
+            label: 'Broadcast Duration(s)', render: (data, h) => data.minioData && data.type === AssetType.IMAGE
+              ? h('edit-input', {
+                staticClass: 'border',
+                props: {
+                  value: `${data.adDuration}`,
+                  align: 'center',
+                  size: 'sm'
+                },
+                on: {
+                  edit: val => this.onEditAssetDuration(data, val)
+                }
+              })
+              : parseDuration(data.adDuration), width: 100, align: 'center'
+          }
         ]
       },
       deviceSchema: {
         list: getDevicesByDataset,
         buttons: [
-          { type: 'add', label: '绑定设备', on: this.onBindDevice },
-          { icon: 'el-icon-scissors', label: '解绑', on: this.onUnbindDevices }
+          { type: 'add', label: 'Bind device', on: this.onBindDevice },
+          { icon: 'el-icon-scissors', label: 'Unbind', on: this.onUnbindDevices }
         ],
         cols: [
           { type: 'selection' },
-          { prop: 'name', label: '设备名称' },
-          { prop: 'address', label: '地址' },
-          { type: 'invoke', render: [
-            { label: '解绑', on: this.onUnbind }
-          ] }
+          { prop: 'name', label: 'Device Name' },
+          { prop: 'address', label: 'Address' },
+          {
+            type: 'invoke', render: [
+              { label: 'Unbind', on: this.onUnbind }
+            ]
+          }
         ]
       },
       devicesSchema: {
         list: getDevices,
         filters: [
-          { key: 'name', type: 'search', placeholder: '设备名称' }
+          { key: 'name', type: 'search', placeholder: 'Device Name' }
         ],
         cols: [
-          { prop: 'name', label: '设备名称' },
-          { prop: 'address', label: '地址' }
+          { prop: 'name', label: 'Device Name' },
+          { prop: 'address', label: 'Address' }
         ]
       }
     }
@@ -221,15 +229,15 @@ export default {
   computed: {
     statistics () {
       const length = this.assets.length
-      return `共${length}条,总时长 ${parseDuration(this.assets.reduce((total, asset) => total + asset.adDuration, 0), false)}`
+      return `total ${length},total duration ${parseDuration(this.assets.reduce((total, asset) => total + asset.adDuration, 0), false)}`
     },
     resourceSize () {
       const totalSizeMB = this.assets.reduce((total, item) => total + parseInt(item.minioData.size), 0) / (1024 * 1024)
       if (totalSizeMB >= 1024) {
         const totalSizeGB = totalSizeMB / 1024
-        return `资源包大小: ${totalSizeGB.toFixed(2)} GB`
+        return `Resource Pack Size: ${totalSizeGB.toFixed(2)} GB`
       }
-      return `资源包大小: ${totalSizeMB.toFixed(2)} MB`
+      return `Resource Pack Size: ${totalSizeMB.toFixed(2)} MB`
     }
   },
   methods: {
@@ -248,21 +256,21 @@ export default {
     },
     onAdd () {
       this.$prompt(
-        '<p class="u-color--black u-font-size--sm u-bold">素材包名称</p>',
-        '新增填充素材包',
+        '<p class="u-color--black u-font-size--sm u-bold">Pack Name</p>',
+        'Add Pack',
         {
           dangerouslyUseHTMLString: true,
           closeOnClickModal: false,
           inputValue: '',
-          inputPlaceholder: '最多30个字符',
+          inputPlaceholder: 'Maximum 30 characters',
           inputPattern: /^.{0,30}$/,
           inputValidator: val => {
             const name = val ? val.replace(/^\s+|\s+$/g, '') : val
-            return name ? true : '请填写名称'
+            return name ? true : 'Please fill in the name'
           },
-          inputErrorMessage: '最多30个字符',
-          confirmButtonText: '新增',
-          cancelButtonText: '取消',
+          inputErrorMessage: 'Maximum 30 characters',
+          confirmButtonText: 'Add',
+          cancelButtonText: 'Cancel',
           beforeClose: (action, instance, done) => {
             if (action === 'confirm') {
               this.onSave(instance.inputValue.replace(/^\s+|\s+$/g, ''), done)
@@ -290,7 +298,7 @@ export default {
       if (!newVal) {
         this.$message({
           type: 'warning',
-          message: '请填写素材包名称'
+          message: 'Please fill in the package name'
         })
         return
       }
@@ -377,15 +385,15 @@ export default {
     onDelAssets () {
       if (this.$selectionItems?.length) {
         this.$confirm(
-          '移除所选资源?',
-          '操作确认',
+          'Remove the selected resource?',
+          'Confirm operation',
           { type: 'warning' }
         ).then(() => unbindAssetsFromDataset(this.$datasetId, this.$selectionItems.map(({ keyName }) => keyName)))
           .then(this.onAssetChanged)
       } else {
         this.$message({
           type: 'warning',
-          message: '请选择需移除的资源'
+          message: 'Please select the resources to be removed'
         })
       }
     },
@@ -416,7 +424,7 @@ export default {
       } else {
         this.$message({
           type: 'warning',
-          message: '请先选择需要解绑的设备'
+          message: 'Please select the device to be unbundled first'
         })
       }
     },
@@ -440,25 +448,25 @@ export default {
     },
     onCopy ({ id, name }) {
       this.$prompt(
-        '<p class="u-color--black u-font-size--sm u-bold">素材包名称</p>',
-        '复制素材包',
+        '<p class="u-color--black u-font-size--sm u-bold">Pack Name</p>',
+        'Copy Pack',
         {
           dangerouslyUseHTMLString: true,
           closeOnClickModal: false,
-          inputValue: name.length <= 28 ? `${name}副本` : name,
-          inputPlaceholder: '最多30个字符',
+          inputValue: name.length <= 28 ? `${name}Copy` : name,
+          inputPlaceholder: 'Maximum 30 characters',
           inputPattern: /^.{0,30}$/,
           inputValidator: val => {
             const inputName = val ? val.replace(/^\s+|\s+$/g, '') : val
             return inputName
               ? inputName === name
-                ? '名称不能与源素材包一样'
+                ? 'The name cannot be the same as the source pack'
                 : true
-              : '请填写名称'
+              : 'Please fill in the name'
           },
-          inputErrorMessage: '最多30个字符',
-          confirmButtonText: '复制',
-          cancelButtonText: '取消',
+          inputErrorMessage: 'Maximum 30 characters',
+          confirmButtonText: 'Copy',
+          cancelButtonText: 'Cancel',
           beforeClose: (action, instance, done) => {
             if (action === 'confirm') {
               this.onConfirmCopy(id, instance.inputValue.replace(/^\s+|\s+$/g, ''), done)