xiehao1 11 месяцев назад
Родитель
Сommit
ec40b59879
100 измененных файлов с 5185 добавлено и 1476 удалено
  1. 2 2
      src/components/AppLinkInput/AppLinkSelectDialog.vue
  2. 8 8
      src/components/Crontab/src/Crontab.vue
  3. 1 1
      src/components/Draggable/index.vue
  4. 4 4
      src/components/Materials/src/Materials.vue
  5. 4 4
      src/components/Materials/src/editorMaterials.vue
  6. 2 2
      src/components/ShortcutDateRangePicker/index.vue
  7. 2 2
      src/components/Table/src/TableSelectForm.vue
  8. 1 1
      src/components/UploadFile/src/UploadImgs.vue
  9. 1982 128
      src/locales/en.ts
  10. 1845 22
      src/locales/zh-CN.ts
  11. 1 1
      src/plugins/vueI18n/index.ts
  12. 21 21
      src/views/Home/Index.vue
  13. 9 8
      src/views/Home/PanelGroupT.vue
  14. 3 0
      src/views/Home/echarts-data.ts
  15. 1 1
      src/views/Login/SocialLogin.vue
  16. 1 1
      src/views/Login/components/LoginForm.vue
  17. 3 3
      src/views/Login/components/MobileForm.vue
  18. 7 6
      src/views/Login/components/SSOLogin.vue
  19. 1 0
      src/views/Profile/components/UserAvatar.vue
  20. 10 9
      src/views/Profile/components/UserSocial.vue
  21. 11 11
      src/views/express/ExpressForm.vue
  22. 11 11
      src/views/express/ExpressSet.vue
  23. 17 17
      src/views/express/index.vue
  24. 19 18
      src/views/infra/apiAccessLog/ApiAccessLogDetail.vue
  25. 32 31
      src/views/infra/apiAccessLog/index.vue
  26. 16 15
      src/views/infra/apiErrorLog/ApiErrorLogDetail.vue
  27. 32 31
      src/views/infra/apiErrorLog/index.vue
  28. 6 6
      src/views/infra/build/index.vue
  29. 5 5
      src/views/infra/codegen/EditTable.vue
  30. 14 13
      src/views/infra/codegen/ImportTable.vue
  31. 3 3
      src/views/infra/codegen/PreviewCode.vue
  32. 11 13
      src/views/infra/codegen/components/BasicInfoForm.vue
  33. 25 24
      src/views/infra/codegen/components/ColumInfoForm.vue
  34. 39 38
      src/views/infra/codegen/components/GenerateInfoForm.vue
  35. 24 24
      src/views/infra/codegen/index.vue
  36. 18 18
      src/views/infra/config/ConfigForm.vue
  37. 25 25
      src/views/infra/config/index.vue
  38. 14 14
      src/views/infra/dataSourceConfig/DataSourceConfigForm.vue
  39. 9 9
      src/views/infra/dataSourceConfig/index.vue
  40. 2 2
      src/views/infra/demo/demo01/Demo01ContactForm.vue
  41. 12 12
      src/views/infra/demo/demo01/index.vue
  42. 2 2
      src/views/infra/demo/demo02/Demo02CategoryForm.vue
  43. 12 12
      src/views/infra/demo/demo02/index.vue
  44. 2 2
      src/views/infra/demo/demo03/erp/Demo03StudentForm.vue
  45. 2 2
      src/views/infra/demo/demo03/erp/components/Demo03CourseForm.vue
  46. 5 5
      src/views/infra/demo/demo03/erp/components/Demo03CourseList.vue
  47. 2 2
      src/views/infra/demo/demo03/erp/components/Demo03GradeForm.vue
  48. 5 5
      src/views/infra/demo/demo03/erp/components/Demo03GradeList.vue
  49. 12 12
      src/views/infra/demo/demo03/erp/index.vue
  50. 2 2
      src/views/infra/demo/demo03/inner/Demo03StudentForm.vue
  51. 2 1
      src/views/infra/demo/demo03/inner/components/Demo03CourseForm.vue
  52. 2 2
      src/views/infra/demo/demo03/inner/components/Demo03CourseList.vue
  53. 1 0
      src/views/infra/demo/demo03/inner/components/Demo03GradeForm.vue
  54. 2 2
      src/views/infra/demo/demo03/inner/components/Demo03GradeList.vue
  55. 12 12
      src/views/infra/demo/demo03/inner/index.vue
  56. 2 2
      src/views/infra/demo/demo03/normal/Demo03StudentForm.vue
  57. 2 1
      src/views/infra/demo/demo03/normal/components/Demo03CourseForm.vue
  58. 1 0
      src/views/infra/demo/demo03/normal/components/Demo03GradeForm.vue
  59. 12 12
      src/views/infra/demo/demo03/normal/index.vue
  60. 0 1
      src/views/infra/druid/index.vue
  61. 8 8
      src/views/infra/file/FileForm.vue
  62. 20 20
      src/views/infra/file/index.vue
  63. 44 44
      src/views/infra/fileConfig/FileConfigForm.vue
  64. 23 23
      src/views/infra/fileConfig/index.vue
  65. 14 13
      src/views/infra/job/JobDetail.vue
  66. 20 20
      src/views/infra/job/JobForm.vue
  67. 26 25
      src/views/infra/job/index.vue
  68. 12 11
      src/views/infra/job/logger/JobLogDetail.vue
  69. 23 22
      src/views/infra/job/logger/index.vue
  70. 21 20
      src/views/infra/redis/index.vue
  71. 0 1
      src/views/infra/skywalking/index.vue
  72. 0 1
      src/views/infra/swagger/index.vue
  73. 18 17
      src/views/infra/webSocket/index.vue
  74. 9 7
      src/views/mall/cashier/hangList.vue
  75. 24 22
      src/views/mall/cashier/help.vue
  76. 24 23
      src/views/mall/cashier/index.vue
  77. 4 3
      src/views/mall/cashier/payResult.vue
  78. 4 2
      src/views/mall/cashier/scanPay.vue
  79. 23 21
      src/views/mall/cashier/settlement.vue
  80. 42 42
      src/views/mall/coupon/Form.vue
  81. 31 31
      src/views/mall/coupon/index.vue
  82. 15 15
      src/views/mall/coupon/user/OrderRecord.vue
  83. 53 53
      src/views/mall/desk/shopDesk/Order.vue
  84. 20 20
      src/views/mall/desk/shopDesk/ShopDeskForm.vue
  85. 17 17
      src/views/mall/desk/shopDesk/ShopDeskForm2.vue
  86. 12 12
      src/views/mall/desk/shopDesk/ShopDeskForm3.vue
  87. 14 13
      src/views/mall/desk/shopDesk/UserImportForm.vue
  88. 32 32
      src/views/mall/desk/shopDesk/index.vue
  89. 15 15
      src/views/mall/desk/shopdeskcategory/ShopDeskCategoryForm.vue
  90. 19 19
      src/views/mall/desk/shopdeskcategory/index.vue
  91. 46 46
      src/views/mall/member/user/UserDetail.vue
  92. 25 25
      src/views/mall/member/user/UserForm.vue
  93. 20 19
      src/views/mall/member/user/UserSelect.vue
  94. 27 26
      src/views/mall/member/user/index.vue
  95. 14 14
      src/views/mall/member/user/yue.vue
  96. 18 18
      src/views/mall/member/userAddress/UserAddressForm.vue
  97. 17 17
      src/views/mall/member/userAddress/index.vue
  98. 44 44
      src/views/mall/order/storeOrder/OrderDetail.vue
  99. 51 51
      src/views/mall/order/storeOrder/OrderDetail2.vue
  100. 3 3
      src/views/mall/order/storeOrder/OrderRecord.vue

+ 2 - 2
src/components/AppLinkInput/AppLinkSelectDialog.vue

@@ -44,8 +44,8 @@
     </div>
     <!-- 底部对话框操作按钮 -->
     <template #footer>
-      <el-button type="primary" @click="handleSubmit">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button type="primary" @click="handleSubmit">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
   <Dialog v-model="detailSelectDialog.visible" title="" width="50%">

+ 8 - 8
src/components/Crontab/src/Crontab.vue

@@ -546,7 +546,7 @@ const inputChange = () => {
             </div>
           </template>
           <el-form>
-            <el-form-item label="类型">
+            <el-form-item :label="t('mall.type')">
               <el-radio-group v-model="cronValue.second.type">
                 <el-radio-button label="0">任意值</el-radio-button>
                 <el-radio-button label="1">范围</el-radio-button>
@@ -605,7 +605,7 @@ const inputChange = () => {
             </div>
           </template>
           <el-form>
-            <el-form-item label="类型">
+            <el-form-item :label="t('mall.type')">
               <el-radio-group v-model="cronValue.minute.type">
                 <el-radio-button label="0">任意值</el-radio-button>
                 <el-radio-button label="1">范围</el-radio-button>
@@ -664,7 +664,7 @@ const inputChange = () => {
             </div>
           </template>
           <el-form>
-            <el-form-item label="类型">
+            <el-form-item :label="t('mall.type')">
               <el-radio-group v-model="cronValue.hour.type">
                 <el-radio-button label="0">任意值</el-radio-button>
                 <el-radio-button label="1">范围</el-radio-button>
@@ -723,7 +723,7 @@ const inputChange = () => {
             </div>
           </template>
           <el-form>
-            <el-form-item label="类型">
+            <el-form-item :label="t('mall.type')">
               <el-radio-group v-model="cronValue.day.type">
                 <el-radio-button label="0">任意值</el-radio-button>
                 <el-radio-button label="1">范围</el-radio-button>
@@ -784,7 +784,7 @@ const inputChange = () => {
             </div>
           </template>
           <el-form>
-            <el-form-item label="类型">
+            <el-form-item :label="t('mall.type')">
               <el-radio-group v-model="cronValue.month.type">
                 <el-radio-button label="0">任意值</el-radio-button>
                 <el-radio-button label="1">范围</el-radio-button>
@@ -844,7 +844,7 @@ const inputChange = () => {
           </template>
           <el-form>
             <el-form>
-              <el-form-item label="类型">
+              <el-form-item :label="t('mall.type')">
                 <el-radio-group v-model="cronValue.week.type">
                   <el-radio-button label="0">任意值</el-radio-button>
                   <el-radio-button label="1">范围</el-radio-button>
@@ -923,7 +923,7 @@ const inputChange = () => {
             </div>
           </template>
           <el-form>
-            <el-form-item label="类型">
+            <el-form-item :label="t('mall.type')">
               <el-radio-group v-model="cronValue.year.type">
                 <el-radio-button label="-1">忽略</el-radio-button>
                 <el-radio-button label="0">任意值</el-radio-button>
@@ -963,7 +963,7 @@ const inputChange = () => {
     </div>
 
     <template #footer>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
       <el-button type="primary" @click="submit()">确 认</el-button>
     </template>
   </el-dialog>

+ 1 - 1
src/components/Draggable/index.vue

@@ -39,7 +39,7 @@
       :disabled="limit > 0 && formData.length >= limit"
       @click="handleAdd"
     >
-      <Icon icon="ep:plus" /><span>添加</span>
+      <Icon icon="ep:plus" /><span>{{t('form.add')}}</span>
     </el-button>
   </el-tooltip>
 </template>

+ 4 - 4
src/components/Materials/src/Materials.vue

@@ -92,7 +92,7 @@
                         class="el-icon-delete"
                         style="margin-left: 10px; color: red"
                         @click="materialgroupDelete(materialgroupObj)"
-                        >删除</el-button
+                        >{{t('action.delete')}}</el-button
                       >
                     </span>
                   </el-col>
@@ -138,7 +138,7 @@
                         <el-row>
                           <el-col :span="24" class="col-do">
                             <el-button type="text" size="medium" @click="materialDel(item)"
-                              >删除</el-button
+                              >{{t('action.delete')}}</el-button
                             >
                           </el-col>
                         </el-row>
@@ -164,8 +164,8 @@
       </el-container>
       <template #footer>
         <span class="dialog-footer">
-          <el-button @click="listDialogVisible = false">取 消</el-button>
-          <el-button type="primary" @click="sureUrls">确 定</el-button>
+          <el-button @click="listDialogVisible = false">{{t('common.cancel')}}</el-button>
+          <el-button type="primary" @click="sureUrls">{{t('common.confirm')}}</el-button>
         </span>
       </template>
     </el-dialog>

+ 4 - 4
src/components/Materials/src/editorMaterials.vue

@@ -43,7 +43,7 @@
                         class="el-icon-delete"
                         style="margin-left: 10px; color: red"
                         @click="materialgroupDelete(materialgroupObj)"
-                        >删除</el-button
+                        >{{t('action.delete')}}</el-button
                       >
                     </span>
                   </el-col>
@@ -89,7 +89,7 @@
                         <el-row>
                           <el-col :span="24" class="col-do">
                             <el-button type="text" size="medium" @click="materialDel(item)"
-                              >删除</el-button
+                              >{{t('action.delete')}}</el-button
                             >
                           </el-col>
                         </el-row>
@@ -115,8 +115,8 @@
       </el-container>
       <!-- <template #footer> -->
         <span class="dialog-footer" style="color: red;">
-          <!-- <el-button @click="listDialogVisible = false">取 消</el-button> -->
-          <el-button type="primary" @click="sureUrls">确 定</el-button>
+          <!-- <el-button @click="listDialogVisible = false">{{t('common.cancel')}}</el-button> -->
+          <el-button type="primary" @click="sureUrls">{{t('common.confirm')}}</el-button>
         </span>
       <!-- </template> -->
       </div>

+ 2 - 2
src/components/ShortcutDateRangePicker/index.vue

@@ -9,8 +9,8 @@
       v-model="times"
       value-format="YYYY-MM-DD HH:mm:ss"
       type="daterange"
-      start-placeholder="开始日期"
-      end-placeholder="结束日期"
+      :start-placeholder="t('public.startDate')"
+      :end-placeholder="t('public.endDate')"
       :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
       :shortcuts="shortcuts"
       class="!w-240px"

+ 2 - 2
src/components/Table/src/TableSelectForm.vue

@@ -20,8 +20,8 @@
       @pagination="getList"
     />
     <template #footer>
-      <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button :disabled="formLoading" type="primary" @click="submitForm">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>

+ 1 - 1
src/components/UploadFile/src/UploadImgs.vue

@@ -31,7 +31,7 @@
           </div>
           <div v-if="!disabled" class="handle-icon" @click="handleRemove(file)">
             <Icon icon="ep:delete" />
-            <span>删除</span>
+            <span>{{t('action.delete')}}</span>
           </div>
         </div>
       </template>

+ 1982 - 128
src/locales/en.ts

@@ -1,91 +1,95 @@
 export default {
   common: {
-    inputText: 'Please input',
+    inputText: 'Please enter',
     selectText: 'Please select',
     startTimeText: 'Start time',
     endTimeText: 'End time',
     login: 'Login',
-    required: 'This is required',
-    loginOut: 'Login out',
-    document: 'Document',
-    profile: 'User Center',
-    reminder: 'Reminder',
-    loginOutMessage: 'Exit the system?',
+    required: 'This field is required',
+    loginOut: 'Logout',
+    document: 'Project Documentation',
+    profile: 'Personal Center',
+    reminder: 'Warm Tips',
+    loginOutMessage: 'Do you want to quit the system?',
     back: 'Back',
     ok: 'OK',
     save: 'Save',
     cancel: 'Cancel',
     close: 'Close',
-    reload: 'Reload current',
+    reload: 'Reload',
     success: 'Success',
-    closeTab: 'Close current',
-    closeTheLeftTab: 'Close left',
-    closeTheRightTab: 'Close right',
-    closeOther: 'Close other',
-    closeAll: 'Close all',
-    prevLabel: 'Prev',
+    closeTab: 'Close Tab',
+    closeTheLeftTab: 'Close left tab',
+    closeTheRightTab: 'Close right tab',
+    closeOther: 'Close other tabs',
+    closeAll: 'Close all tabs',
+    prevLabel: 'Previous',
     nextLabel: 'Next',
-    skipLabel: 'Jump',
+    skipLabel: 'Skip',
     doneLabel: 'End',
     menu: 'Menu',
-    menuDes: 'Menu bar rendered in routed structure',
-    collapse: 'Collapse',
-    collapseDes: 'Expand and zoom the menu bar',
-    tagsView: 'Tags view',
-    tagsViewDes: 'Used to record routing history',
-    tool: 'Tool',
-    toolDes: 'Used to set up custom systems',
+    menuDes: 'Menu bar rendered in a routed structure',
+    collapse: 'Expand and Zoom',
+    collapseDes: 'Expand and zoom menu bar',
+    tagsView: 'Tabs',
+    tagsViewDes: 'For recording routing history',
+    tool: 'Tools',
+    toolDes: 'For setting up a customized system',
     query: 'Query',
     reset: 'Reset',
-    shrink: 'Put away',
+    shrink: 'Wrap Up',
     expand: 'Expand',
-    confirmTitle: 'System Hint',
-    exportMessage: 'Whether to confirm export data item?',
-    importMessage: 'Whether to confirm import data item?',
-    createSuccess: 'Create Success',
-    updateSuccess: 'Update Success',
-    delMessage: 'Delete the selected data?',
-    delDataMessage: 'Delete the data?',
-    delNoData: 'Please select the data to delete',
-    delSuccess: 'Deleted successfully',
-    index: 'Index',
+    confirmTitle: 'System Tips',
+    exportMessage: 'Confirm exporting data items?',
+    importMessage: 'Confirm importing data items?',
+    createSuccess: 'Add Success',
+    updateSuccess: 'Modify Succeed',
+    delMessage: 'Do you delete the selected data?',
+    delDataMessage: 'Do you want to delete the data?',
+    delNoData: 'Please select the data to be deleted.',
+    delSuccess: 'Delete Success',
+    index: 'Serial number',
     status: 'Status',
-    createTime: 'Create Time',
-    updateTime: 'Update Time',
+    createTime: 'Created',
+    updateTime: 'Updated',
     copy: 'Copy',
     copySuccess: 'Copy Success',
-    copyError: 'Copy Error',
-    selectShop: 'Select Shop',
-    enterProductName: 'Please enter product name',
-    selectCategory: 'Select product category',
-    enterKeyword: 'Please enter keyword',
-    enterUnitName: 'Please enter unit name',
-    enterPrice: 'Please enter product price',
-    enterMarketPrice: 'Please enter market price',
-    enterStock: 'Please enter stock',
-    enterProductDescription: 'Please enter product description',
-    enterPoints: 'Please enter points',
+    copyError: 'Copy Failed',
+    search: 'Search',
+    detail: 'Details',
+    add: 'Add',
+    yes: 'Yes',
+    no: 'No',
+    selectShop: 'Select a store',
+    enterProductName: 'Please enter a product name',
+    selectCategory: 'Select Category',
+    enterKeyword: 'Please enter a keyword',
+    enterUnitName: 'Please enter the unit name',
+    enterPrice: 'Please input the product price',
+    enterMarketPrice: 'Please enter the market price',
+    enterStock: 'Inventory',
+    enterProductDescription: 'Please enter the product description',
+    enterPoints: 'Please enter the points earned',
     addBasicInfo: 'Please add basic information',
-    selectAttribute: 'Please select attribute',
-    addCompleteSpec: 'Please add complete specification!',
-    addAttribute: 'Please add attribute!',
-    addSpec: 'Add specification',
+    selectAttribute: 'Please select attributes',
+    addCompleteSpec: 'Please add full specifications!',
+    addAttribute: 'Please add attributes!',
+    addSpec: 'Please add specifications!',
     confirm: 'Confirm',
 
     delete: 'Delete',
-
-    nextStep: 'Next step',
-    previousStep: 'Previous step',
+    nextStep: 'Next',
+    previousStep: 'Previous',
     uploadImage: 'Upload image',
     addNewSpec: 'Add new specification',
-    generateNow: 'Generate now',
-    selectShopFirst: 'Please select shop first',
+    generateNow: 'Generate Now',
+    selectShopFirst: 'Please select a store first',
     selectCategoryFirst: 'Please select category first',
-    selectSpec: 'Select specification',
-    enterSpecName: 'Please enter specification name',
+    selectSpec: 'Select Specification',
+    enterSpecName: 'Please input specification',
     enterSpecValue: 'Please enter specification value',
-    selectFreightTemplate: 'Select freight template',
-    enterFreight: 'Please enter freight'
+    selectFreightTemplate: 'Select shipping template',
+    enterFreight: 'Please enter the e-mail address'
   },
   lock: {
     lockScreen: 'Lock screen',
@@ -144,34 +148,43 @@ export default {
     small: 'Small'
   },
   login: {
-    welcome: 'Welcome to the FastEat system',
-    message: 'Backstage management system',
-    tenantname: 'TenantName',
-    username: 'Username',
+    welcome: 'Welcome to FastEat',
+    message: 'Welcome to FastEat',
+    tenantname: 'Tenant Name',
+    username: 'User Name',
     password: 'Password',
-    code: 'verification code',
-    login: 'Sign in',
-    relogin: 'Sign in again',
-    otherLogin: 'Sign in with',
+    code: 'Verification Code',
+    login: 'Login',
+    relogin: 'Re-login',
+    otherLogin: 'Other Login Methods',
     register: 'Register',
-    checkPassword: 'Confirm password',
+    checkPassword: 'Confirm Password',
     remember: 'Remember me',
-    hasUser: 'Existing account? Go to login',
-    forgetPassword: 'Forget password?',
-    tenantNamePlaceholder: 'Please Enter Tenant Name',
-    usernamePlaceholder: 'Please Enter Username',
-    passwordPlaceholder: 'Please Enter Password',
-    codePlaceholder: 'Please Enter Verification Code',
-    mobileTitle: 'Mobile sign in',
-    mobileNumber: 'Mobile Number',
-    mobileNumberPlaceholder: 'Plaease Enter Mobile Number',
-    backLogin: 'back',
-    getSmsCode: 'Get SMS Code',
-    btnMobile: 'Mobile sign in',
-    btnQRCode: 'QR code sign in',
-    qrcode: 'Scan the QR code to log in',
-    btnRegister: 'Sign up',
-    SmsSendMsg: 'code has been sent'
+    hasUser: 'Already have an account? Go to login',
+    forgetPassword: 'Forgot your password?',
+    tenantNamePlaceholder: 'Please enter your tenant name',
+    usernamePlaceholder: 'Please enter your username',
+    passwordPlaceholder: 'Please enter your password',
+    codePlaceholder: 'Please enter the verification code',
+    mobileTitle: 'Mobile Login',
+    mobileNumber: 'Cell phone number',
+    mobileNumberPlaceholder: 'Please enter your cell phone number',
+    backLogin: 'Return to',
+    getSmsCode: 'Get verification code',
+    btnMobile: 'Mobile Login',
+    btnQRCode: 'QR Code Login',
+    qrcode: 'Scan QR code to login',
+    btnRegister: 'Register',
+    SmsSendMsg: 'Verification code sent',
+    loadingSystem: 'Loading system...',
+    YSHOPSourceCode: 'YSHOP source code',
+    retrievableAfterSeconds: 'Retrieve in seconds',
+    thisThirdPartyApplicationRequestsTheFollowingPermissions: 'This third-party application requests the following permissions',
+    agreeToAuthorization: 'Agree to authorize',
+    authorizationIn: 'Authorization in progress...',
+    rejection: 'Deny',
+    accessYourPersonalInformation: 'Access your personal information',
+    modifyYourPersonalInformation: 'Modify your personal information'
   },
   captcha: {
     verification: 'Please complete security verification',
@@ -182,6 +195,7 @@ export default {
   },
   router: {
     login: 'Login',
+    socialLogin: 'Social Login',
     home: 'Home',
     analysis: 'Analysis',
     workplace: 'Workplace'
@@ -319,27 +333,42 @@ export default {
     header: 'Header'
   },
   action: {
-    create: 'Create',
+    setPrint: 'Configuring Printers',
+    check: 'Audit',
+    buyDetail: 'Purchase History',
+    order: 'Orders',
+    qrcode: 'QR Code',
+    couponRecord: 'Coupon Record',
+    yue: 'Points Balance',
+    userDetail: 'User Details',
+    refundOrder: 'Order Refund',
+    orderRecord: 'Order Record',
+    orderDetail: 'Order Details',
+    updateOrder: 'Modify Order',
+    orderSend: 'Order Shipment',
+    remark: 'Remarks',
+    sendInfo: 'Delivery Information',
+    batchCreate: 'Batch Add',
+    create: 'Add',
     add: 'Add',
     del: 'Delete',
     delete: 'Delete',
     edit: 'Edit',
-    update: 'Update',
     preview: 'Preview',
     more: 'More',
-    sync: 'Sync',
+    sync: 'Synchronize',
     save: 'Save',
-    detail: 'Detail',
+    detail: 'Details',
     export: 'Export',
     import: 'Import',
     generate: 'Generate',
-    logout: 'Login Out',
+    logout: 'Force Exit',
     test: 'Test',
-    typeCreate: 'Dict Type Create',
-    typeUpdate: 'Dict Type Eidt',
-    dataCreate: 'Dict Data Create',
-    dataUpdate: 'Dict Data Eidt',
-    fileUpload: 'File Upload'
+    typeCreate: 'Dictionary Type Addition',
+    typeUpdate: 'Dictionary Type Edit',
+    dataCreate: 'Dictionary Data Addition',
+    dataUpdate: 'Dictionary Data Editing',
+    update: 'Update'
   },
   dialog: {
     dialog: 'Dialog',
@@ -356,7 +385,6 @@ export default {
       apiRequestFailed: 'The interface request failed, please try again later!',
       networkException: 'network anomaly',
       networkExceptionMsg: 'Please check if your network connection is normal! The network is abnormal',
-
       errMsg401: 'The user does not have permission (token, user name, password error)!',
       errMsg403: 'The user is authorized, but access is forbidden!',
       errMsg404: 'Network request error, the resource was not found!',
@@ -399,30 +427,23 @@ export default {
       signInFormTitle: 'Sign in',
       signUpFormTitle: 'Sign up',
       forgetFormTitle: 'Reset password',
-
       signInTitle: 'Backstage management system',
       signInDesc: 'Enter your personal details and get started!',
       policy: 'I agree to the xxx Privacy Policy',
       scanSign: `scanning the code to complete the login`,
-
       loginButton: 'Sign in',
       registerButton: 'Sign up',
       rememberMe: 'Remember me',
       forgetPassword: 'Forget Password?',
       otherSignIn: 'Sign in with',
-
-      // notify
       loginSuccessTitle: 'Login successful',
       loginSuccessDesc: 'Welcome back',
-
-      // placeholder
       accountPlaceholder: 'Please input username',
       passwordPlaceholder: 'Please input password',
       smsPlaceholder: 'Please input sms code',
       mobilePlaceholder: 'Please input mobile',
       policyPlaceholder: 'Register after checking',
       diffPwd: 'The two passwords are inconsistent',
-
       userName: 'Username',
       password: 'Password',
       confirmPassword: 'Confirm Password',
@@ -466,8 +487,17 @@ export default {
       oldPwdMsg: 'Please Enter Old Password',
       newPwdMsg: 'Please Enter New Password',
       cfPwdMsg: 'Please Enter Confirm Password',
+      pwdRules: '6 to 20 characters in length',
       diffPwd: 'The Passwords Entered Twice No Match'
-    }
+    },
+    serialNumber: 'Serial number',
+    socialPlatform: 'Social Platform',
+    bound: 'Bound',
+    unbound: 'Unbound',
+    unbound1: '(Unbound)',
+    bound1: '(Bind)',
+    boundSuccessfully: 'Bound Successfully',
+    unboundSuccessfully: 'Unbind Successfully'
   },
   cropper: {
     selectImage: 'Select Image',
@@ -483,52 +513,1876 @@ export default {
     btn_zoom_out: 'Zoom out',
     preview: 'Preivew'
   },
-  product: {
+  work: {
+    selectStore: 'Select shop',
+    orderReminderOn: 'Order reminder on',
+    orderReminderOff: 'Order Reminder Off',
+    recentOrders: 'Recent Orders',
+    orderId: 'Order Number',
+    takeout: 'Takeaway',
+    contactNumber: 'Contact Number',
+    pickUp: 'Pickup',
+    pickUpNumber: 'Pickup Number',
+    dineIn: 'Dine-in',
+    tableNumber: 'Table number',
+    numberPeople: 'Number of people',
+    multipleDishesPleaseCheckDetails: 'Multiple dishes, please check details',
+    order: 'Order Placement',
+    orderTime: 'Order Time',
+    noOrderData: 'No order data available',
+    newOrderNotification: 'New Order Notification',
+    youHaveNewOrderPleaseCheckOut: 'You have a new order, please check!'
+  },
+  home: {
+    totalMembers: 'Total number of members',
+    allStores: 'All Stores',
+    todayOrderCount: "Today's orders",
+    orders: 'Single',
+    totalOrderCount: 'Total number of orders',
+    yesterdaysOrderCount: "Yesterday's orders",
+    totalAmount: 'Total amount',
+    last7DaysOrderCount: 'Orders in the last seven days',
+    totalProductCount: 'Total number of products',
+    thisMonthOrderCount: 'Orders this month',
+    productSalesRanking: 'Product Sales Ranking',
+    userSpendingRankingAllStores: 'User Spending Ranking (All Stores)',
+    currentStore: 'Current Store',
     productName: 'Product Name',
-    enterProductName: 'Enter Product Name',
+    salesVolume: 'Sales volume',
+    consumptionAmount: 'Consumption amount',
+    productManagement: 'Product Management',
+    memberManagement: 'Member Management',
+    orderManagement: 'Order Management',
+    couponManagement: 'Coupon Management',
+    printerManagement: 'Printer Management',
+    storeManagement: 'Shop Management',
+    paymentManagement: 'Payment Management',
+    messageManagement: 'Message Management'
+  },
+  product: {
+    cost: 'Cost price',
+    barCode: 'Item No.',
+    weight: 'Weight(KG)',
+    volume: 'Volume(m³)',
+    productName: 'Commodity Name',
+    enterProductName: 'Please enter the commodity name',
     shopName: 'Shop Name',
-    enterShopName: 'Enter Shop Name',
-    productImage: 'Product Image',
-    productPrice: 'Product Price',
+    enterShopName: 'Please enter the shop name',
+    productImage: 'Picture',
+    productPrice: 'Price',
     sales: 'Sales',
-    stock: 'Stock',
+    stock: 'Inventory',
     status: 'Status',
-    onSale: 'On Sale',
-    offSale: 'Off Sale',
+    onSale: 'Already on the shelves',
+    offSale: 'Dropped',
     addTime: 'Add Time',
     actions: 'Actions',
     edit: 'Edit',
     delete: 'Delete',
-    onSaleProducts: 'Products On Sale',
-    pendingProducts: 'Pending Products',
+    onSaleProducts: 'Products on sale',
+    pendingProducts: 'Products to be shelved',
     soldOutProducts: 'Sold Out Products',
-    confirmSale: 'Confirm Sale?',
-    operationSuccess: 'Operation Success',
-    displayShop: 'Display Shop',
+    confirmSale: 'Are you sure you want to add or remove products?',
+    operationSuccess: 'Successful',
+    displayShop: 'Show Store',
     productCategory: 'Product Category',
     keyword: 'Keyword',
     unitName: 'Unit Name',
     marketPrice: 'Market Price',
-    coverImage: 'Cover Image',
-    sliderImage: 'Slider Image',
+    coverImage: 'Cover picture',
+    sliderImage: 'Rotating Chart',
     productStatus: 'Product Status',
     productDescription: 'Product Description',
-    productSpec: 'Product Specification',
-    singleSpec: 'Single Spec',
-    multipleSpec: 'Multiple Spec',
-    selectSpec: 'Select Spec',
-    productAttributes: 'Product Attributes',
+    productSpec: 'Specification',
+    singleSpec: 'Single Size',
+    multipleSpec: 'Multi-Size',
+    selectSpec: 'Select',
+    productAttributes: 'Properties',
     productDetails: 'Product Details',
     marketingSettings: 'Marketing Settings',
     getPoints: 'Get Points',
-    basicInfo: 'Basic Info',
-    specSettings: 'Spec Settings',
+    basicInfo: 'Basic Information',
+    specSettings: 'Specification Setting',
     logisticsSettings: 'Logistics Settings',
     freightSettings: 'Freight Settings',
     postage: 'Postage',
-    freightTemplate: 'Freight Template',
-    newProduct: 'Is New Product',
+    freightTemplate: 'Shipping Template',
+    newProduct: 'New product or not',
     yes: 'Yes',
     no: 'No'
-  }
+  },
+  express: {
+    courierCompanyNumber: 'Courier Company Number',
+    pleaseEnterTheCourierCompanyNumber: 'Please enter the courier company number',
+    fullNameOfCourierCompany: 'Full name of courier company',
+    pleaseEnterTheFullNameOfCourierCompany: 'Please enter the full name of the courier company',
+    sort: 'Sort',
+    pleaseEnterTheSort: 'Please input the order',
+    theAbbreviationCourierCompanyEmpty: 'The short name of the courier company cannot be empty',
+    fullNameCourierCompanyEmpty: 'Full name of courier company cannot be empty',
+    sortCannotEmpty: 'Sort cannot be empty',
+    pleaseEnterTheCourierBirdAppId: 'Please input the appId',
+    pleaseEnterTheCourierBirdAppKey: 'Please input appKey',
+    isPaidPackage: 'Whether to charge the package',
+    theThirdPartyTips:
+      'yshop-pro system uses the third-party courier bird api to achieve the courier query, registration address please click.',
+    iRegister: 'I register!',
+    courierBirdAppIdCannotBeEmpty: 'ExpressBird appId can not be empty',
+    courierBirdAppKeyCannotBeEmpty: 'CourierBird appKey cannot be empty',
+    ompanyCode: 'Company Code',
+    pleaseEnterTheCourierCompanyCode: 'Please enter the code of the courier company',
+    companyFullName: 'Company Name',
+    pleaseEnterTheCourierCompanyFullName: 'Please enter the full name of the courier company',
+    courierCompanyCode: 'Courier Company Code',
+    courierCompanyFullName: 'Full name of courier company',
+    addTime: 'Add Time',
+    courierCompanyXls: 'Courier Company.xls'
+  },
+  infra: {
+    logPrimaryKey: 'Log Primary Key',
+    linkTrace: 'Link Trace',
+    applicationName: 'Application Name',
+    userInformation: 'User Information',
+    userIp: 'User IP',
+    userUa: 'User UA',
+    requestInformation: 'Request Information',
+    requestParameters: 'Request Parameters',
+    requestResult: 'Request Result',
+    requestTime: 'Request time',
+    requestTimeConsumption: 'Request Time',
+    operationResult: 'Operation Result',
+    normal: 'Normal',
+    failed: 'Failed',
+    operationModule: 'Operation Module',
+    operationName: 'Operation Name',
+    userId: 'User ID',
+    pleaseEnterTheUserNumber: 'Please enter the user number',
+    userType: 'User Type',
+    pleaseSelectUserType: 'Please select user type',
+    pleaseEnterTheApplicationName: 'Please input the application name',
+    pleaseEnterTheExecutionTime: 'Please input the execution time',
+    resultCode: 'Result Code',
+    pleaseEnterTheResultCode: 'Please enter the result code',
+    logNumber: 'Log Number',
+    requestMethod: 'Request method',
+    requestAddress: 'Request Address',
+    successful: 'Successful',
+    failure: 'Failed',
+    operationType: 'Operation Type',
+    detailed: 'Details',
+    operate: 'Operation',
+    aPIAccessLogs_xls: 'API Access Log.xls',
+    exceptionTime: 'Exception Time',
+    exceptionName: 'Exception Name',
+    exceptionStack: 'Exception stack',
+    handlingStatus: 'Handling Status',
+    handler: 'Handler',
+    handlingTime: 'Handling time',
+    pleaseSelectTheProcessingStatus: 'Please select the processing status',
+    timeOfException: 'Exception occurrence time',
+    handled: 'Handled',
+    ignored: 'Ignored',
+    confirmationFlaggedAs: 'Confirmation flagged as',
+    exceptionLogXls: 'Exception Log.xls',
+    generateJSON: 'Generate JSON',
+    generateOptions: 'Generate Options',
+    generateComponents: 'Generate Component',
+    numberOfExecutions: 'How many times it was executed',
+    executionTime: 'Execution time',
+    executionDuration: 'Execution Duration',
+    executionResult: 'Execution Result',
+    successfulExecution: 'Successful execution',
+    confirmThatYouWantToExecuteOnceImmediately: 'Confirm that you want to execute once immediately',
+    open: 'Open',
+    close: 'Close',
+    pause: 'Pause',
+    confirmTo: 'Confirm to',
+    timingTaskNumber: 'Timing task number',
+    ofTheDataItem: 'of the data item',
+    timedTaskExecutionLogXls: 'Timed Task Execution Log.xls',
+    firstExecution: 'The first execution',
+    startExecutionTime: 'Start execution time',
+    endExecutionTime: 'End execution time',
+    selectTheStartExecutionTime: 'Select start execution time',
+    selectTheEndExecutionTime: 'Select end execution time',
+    executeOnce: 'Execute once',
+    taskDetails: 'Task details',
+    schedulingLog: 'Scheduling Log',
+    modify: 'Modify',
+    taskNumber: 'Task number',
+    taskName: 'Task name',
+    taskStatus: 'Task Status',
+    processorName: 'Processor name',
+    parametersOfTheProcessor: 'Parameters of the processor',
+    executionLog: 'Execution log',
+    pleaseEnterTheNameOfTheProcessor: 'Please enter the name of the processor',
+    pleaseSelectTheTaskStatus: 'Please select the task status',
+    pleaseEnterTheTaskName: 'Please enter the task name',
+    milliseconds: 'Milliseconds',
+    notOpened: 'Not turned on',
+    cron: 'Cron expression',
+    numberOfRetries: 'Retries',
+    retryInterval: 'Retry Interval',
+    monitorTimeout: 'Monitor Timeout',
+    subsequentExecutionTime: 'Subsequent execution time',
+    pleaseEnterATaskName: 'Please enter a task name',
+    pleaseEnterTheParametersOfTheProcessor: 'Please enter the processor parameters',
+    pleaseEnterTheNumberOfRetriesWhenSetTo0NoRetriesArePerformed:
+      'Please enter the number of retries. When set to 0, no retries are performed',
+    pleaseEnterTheRetryIntervalInMillisecondsWhenSetTo0NoIntervalIsRequired:
+      'Please enter the retry interval in milliseconds. When set to 0, no interval is required',
+    pleaseEnterTheMonitoringTimeoutInMilliseconds: 'Please enter the monitoring timeout in milliseconds',
+    cronExpression: 'CRON expression',
+    taskNameCannotBeNull: 'Task name cannot be empty',
+    processorNameCannotBeNull: 'Processor name cannot be null',
+    cronExpressionCannotBeNull: 'CRON expression cannot be null',
+    retryCountCannotBeNull: 'The retry count cannot be null',
+    retryIntervalCannotBeNull: 'Retry interval cannot be null',
+    basicInformation: 'Basic Information',
+    modeOfOperation: 'Mode of operation',
+    standalone: 'Standalone',
+    cluster: 'Cluster',
+    redisVersion: 'Redis version : Redis',
+    runtimeMode: 'Runtime Mode :',
+    ports: 'Ports :',
+    numberOfClients: 'Number of Clients :',
+    runtimeDays: 'Runtime (days) :',
+    memoryUsed: 'Memory Used :',
+    cpuUsed: 'CPU Used',
+    memoryConfiguration: 'Memory Configuration :',
+    whetherAOFIsEnabledOrNot: 'Whether AOF is enabled or not :',
+    whetherRDBSuccessfulOrNot: 'RDB Successful or not :',
+    numberOfKeys: 'Number of Keys',
+    networkIngressEgress: 'Network Ingress/Egress :',
+    memoryUsage: 'Memory Usage',
+    peak: 'Peak',
+    commandStatistics: 'Command Statistics',
+    commands: 'Command',
+    memoryConsumption: 'Memory Consumption',
+    anExceptionOccurredInProcessingTheMessage: 'An exception occurred for processing messages:',
+    messageNotProcessed: 'Message not processed:',
+    systemNotification: '[System notification]:',
+    groupSendingUserNumber: '[Group notification] User number',
+    groupNoticUserCode: '[Group Notification] User number',
+    unknownMessageType: 'Unknown message type:',
+    messageReceived: 'Message received',
+    messageRecord: 'Message Record',
+    sent: 'Sent',
+    allPeople: 'Everyone',
+    pleaseSelectSender: 'Please select sender',
+    closeConnection: 'Close connection',
+    openConnection: 'Open connection',
+    serviceAddress: 'Service address',
+    connectionStatus: 'Connection status',
+    connection: 'Connection',
+    messageInputBox: 'Message input box',
+    pleaseEnterMessageSend: 'Please enter the message you want to send',
+    theTestPassedAndTheFileWasUploadedSuccessfullyAccessAddress: 'The test passed and the file was uploaded successfully! Access address:',
+    isItConfirmedToModifyTheConfigurationNumberOfTheDataItemIsTheMainConfiguration:
+      'Is it confirmed to modify the data item with the configuration number',
+    theDataItemsInTheMainConfigurationOfThe: 'of the data item is the main configuration?',
+    test: 'Test',
+    masterConfiguration: 'Master Configuration',
+    no: 'No.',
+    remarks: 'Remarks',
+    configurationName: 'Configuration name',
+    memory: 'Memory',
+    pleaseEnterTheConfigurationName: 'Please enter the configuration name',
+    pleaseSelectMemory: 'Please select memory',
+    configurationNameCannotBeEmpty: 'Configuration name cannot be empty',
+    memoryCannotBeEmpty: 'Memory cannot be empty',
+    basePathCannotBeEmpty: 'Base path cannot be empty',
+    hostAddressCannotBeEmpty: 'Host address cannot be empty',
+    hostPortCannotBeEmpty: 'Host Port cannot be empty',
+    userNameCannotBeEmpty: 'User name cannot be empty',
+    passwordCannotBeEmpty: 'Password cannot be empty',
+    connectionModeCannotBeEmpty: 'Connection Mode cannot be empty',
+    nodeAddressCannotBeEmpty: 'Node address cannot be empty',
+    storageBucketCannotBeEmpty: 'Storage bucket cannot be empty',
+    accessKeyCannotBeEmpty: 'accessKey cannot be null',
+    accessSecretCannotBeNull: 'accessSecret cannot be null',
+    storage: 'Storage',
+    customizedDomainNameCannotBeEmpty: 'Custom domain name cannot be null',
+    basePath: 'Base Path',
+    hostAddress: 'Host Address',
+    hostPort: 'Host Port',
+    userName: 'Username',
+    password: 'Password',
+    connectionMode: 'Connection Mode',
+    nodeAddress: 'Node Address',
+    storageBucket: 'Storage bucket',
+    customizedDomainName: 'Custom domain name',
+    pleaseEnterAConfigurationName: 'Please enter a configuration name',
+    pleaseEnterNotes: 'Please enter notes',
+    pleaseSelectStorage: 'Please select storage',
+    pleaseEnterTheBasePath: 'Please enter the base path',
+    pleaseEnterTheHostAddress: 'Please enter the host address',
+    pleaseEnterTheHostPort: 'Please enter the host port',
+    pleaseEnterAPassword: 'Please enter the password',
+    pleaseEnterTheNodeAddress: 'Please enter the node address',
+    pleaseEnterBucket: 'Please enter bucket',
+    pleaseEnterACustomizedDomainName: 'Please enter a custom domain name',
+    pleaseEnterACustomDomainName: 'Please enter a custom domain name',
+    activeMode: 'Active mode',
+    passiveMode: 'Passive mode',
+    pleaseEnterAccessKey: 'Please enter accessKey',
+    pleaseEnterAccessSecret: 'Please enter accessSecret',
+    pleaseEnterTheFilePath: 'Please enter the file path',
+    pleaseEnterTheFileType: 'Please enter the file type',
+    fileName: 'File name',
+    filePath: 'File Path',
+    fileSize: 'File Size',
+    fileType: 'File Type',
+    fileContent: 'File Content',
+    preview: 'Preview',
+    download: 'Download',
+    uploadTime: 'Upload time',
+    uploadFile: 'Upload file',
+    dragTheFileHereOr: 'Drag the file here, or',
+    clickUpload: 'Click Upload',
+    tipOnlyJpgPngGifFormatsAreAllowedToBeImported: 'Tip: Only jpg, png, gif formats are allowed to be imported!',
+    pleaseUploadTheFile: 'Please upload the file!',
+    uploadFailedPleaseReUpload: 'Upload failed, please re-upload!',
+    youCanOnlyUploadAMaximumOfOneFile: 'Only one file can be uploaded at most!',
+    dataSourceName: 'Data source name',
+    dataSourceConnection: 'Data source connection',
+    pleaseEnterAParameterName: 'Please enter a parameter name',
+    pleaseEnterTheDataSourceConnection: 'Please enter the data source connection',
+    pleaseEnterAUserName: 'Please enter a user name',
+    dataSourceNameCannotBeEmpty: 'Data source name cannot be empty',
+    dataSourceConnectionCannotBeEmpty: 'Data source connection cannot be null',
+    primaryKeyNumber: 'Primary key number',
+    parameterConfigurationXls: 'Parameter Configuration.xls',
+    parameterPrimaryKey: 'Parameter Key',
+    parameterCategory: 'Parameter Category',
+    parameterKeyName: 'Parameter key name',
+    parameterKeyValue: 'Parameter key value',
+    visibleOrNot: 'Visible or not',
+    parameterName: 'Parameter name',
+    builtInSystem: 'System built-in',
+    pleaseEnterTheParameterName: 'Please enter a parameter name',
+    pleaseEnterTheParameterKeyName: 'Please input the parameter key name',
+    pleaseSelectSystemBuiltIn: 'Please select the system built-in',
+    pleaseEnterAParameterCategory: 'Please input the parameter category',
+    pleaseInputParameterName: 'Please input parameter name',
+    pleaseInputParameterKeyName: 'Please input parameter key name',
+    pleaseEnterTheParameterKeyValue: 'Please input parameter key value',
+    pleaseEnterTheContent: 'Please input the content',
+    parameterCategoryCannotBeEmpty: 'Parameter category cannot be empty',
+    parameterNameCannotBeEmpty: 'Parameter name cannot be empty',
+    parameterKeyNameCannotBeNull: 'Parameter key name cannot be null',
+    parameterKeyValueCannotBeNull: 'Parameter key value cannot be null',
+    visibleOrInvisibleCannotBeNull: 'Visible or invisible cannot be null',
+    tableName: 'Table name',
+    tableDescription: 'Table Description',
+    pleaseEnterAWarehouseName: 'Please enter a warehouse name',
+    pleaseEnter: 'Please enter',
+    entityClassName: 'Entity class name',
+    infraTips:
+      'The prefix of the table name is removed by default. If there are duplicates, you need to add the prefix manually to avoid MyBatis reporting Alias duplicates.',
+    author: 'Author',
+    fieldColumnName: 'Field Column Name',
+    fieldDescription: 'Field Description',
+    physicalType: 'Physical Type',
+    javaType: 'Java Type',
+    javaAttributes: 'java attribute',
+    insert: 'Insert',
+    edit: 'Edit',
+    list: 'List',
+    query: 'Query',
+    queryMethod: 'Query Method',
+    allowNull: 'Allow Null',
+    displayType: 'Display Type',
+    textBox: 'Text Box',
+    textField: 'Text Field',
+    dropdownBox: 'Drop-down box',
+    radioBox: 'Radio box',
+    checkbox: 'Checkbox',
+    dateControl: 'Date control',
+    imageUpload: 'Image Upload',
+    fileUpload: 'File Upload',
+    richTextControls: 'Rich Text Controls',
+    dictionaryTypes: 'Dictionary Types',
+    examples: 'Examples',
+    generatedTemplates: 'Generate Template',
+    frontEndTypes: 'Front-end Types',
+    generatedScenarios: 'Generated Scenarios',
+    parentMenu: 'Parent Menu',
+    assignToASpecificMenuEgSystemManagement: 'Assign to a specific menu, e.g. System Management',
+    pleaseSelectTheSystemMenu: 'Please select the System menu',
+    moduleName: 'Module name',
+    moduleNameIeFirstLevelDirectoryEgSystemInfraToolEtc: 'Module name, i.e. first-level directory, e.g. system, infra, tool, etc.',
+    businessName: 'Business name',
+    businessNameIeSecondLevelDirectoryEgUserPermissionDictEtc:
+      'Business name, i.e. second level directory, e.g. user, permission, dict, etc.',
+    className: 'Class name',
+    classNameInitialCapitalizedEgSysUserSysMenuSysDictDataEtc:
+      'Class name (first letter uppercase), e.g. SysUser, SysMenu, SysDictData, etc.',
+    classDescription: 'Class Description',
+    usedAsAClassDescriptionEgUser: 'Used as a class description, e.g. user',
+    customPath: 'Custom path',
+    fillInTheAbsolutePathToTheDiskIfNotItWillBeGeneratedUnderTheCurrentWebProject:
+      'Fill in the absolute path to the disk, if not, it will be generated under the current web project.',
+    quickSelectionOfTheNearestPath: 'Quick selection of the nearest path',
+    restoreTheDefaultGeneratedBasePath: 'Restore the default generated base path',
+    treeTableInformation: 'Tree table information',
+    parentNumberField: 'Parent number field',
+    theNameOfTheParentCodeFieldOfTheTreeDisplaySuchAsParentId: 'The name of the parent code field of the tree display, such as: parent_Id',
+    treeNameField: 'Tree Name Field',
+    nameOfTheDisplayNameFieldOfTheTreeNodeEgDeptName: 'Name of the display name field of the tree node, e.g. dept_name',
+    masterTableInformation: 'Master Table Information',
+    associatedMasterTable: 'Associated master table',
+    theNameOfTheAssociatedMasterParentTableEgSystemUser: 'The name of the associated master (parent) table, e.g., system_user',
+    fieldsAssociatedWithChildTables: 'Fields associated with child tables',
+    fieldsAssociatedWithTheChildTableSuchAsUserId: 'Fields associated with the child table, such as: user_id',
+    relationship: 'Relationships',
+    theRelationshipBetweenTheMasterTableAndTheChildTable: 'The relationship between the master table and the child table',
+    oneToMany: 'One-to-many',
+    oneToOne: 'One-to-one',
+    fieldInformation: 'Field information',
+    generatedInformation: 'Generated Information',
+    importTable: 'Import Table',
+    importSuccessful: 'Import Success',
+    dataSource: 'Data Source',
+    pleaseSelectADataSource: 'Please select a data source',
+    pleaseEnterATableName: 'Please enter a table name',
+    pleaseEnterATableDescription: 'Please enter table description',
+    generateCode: 'Generate Code',
+    entity: 'Entity',
+    updateTime: 'Update Time',
+    areYouSureYouWantToForceSynchronizationOfTableStructure: 'Are you sure you want to force synchronisation of',
+    tableStructure: 'table structure?',
+    synchronizationSuccessful: 'Synchronisation successful',
+    codePreview: 'Code Preview',
+    generateFileInDirectory: 'Generating file directory...',
+    loadingCode: 'Loading code....'
+  },
+  mall: {
+    orderNumber: 'Order Number',
+    totalOrderPrice: 'Total Order Price',
+    specification: 'Specification',
+    orderPickup: 'Order Pickup',
+    numberOfDiners: 'Number of diners',
+    pleaseEnterTheNumberOfPeople: 'Please enter the number of people',
+    totalAmount: 'Total Amount',
+    goToOrder: 'Go to order',
+    noProducts: 'No products...',
+    tableTop: 'Table Top',
+    pleaseSelectTheSpecification: 'Please select the specification!',
+    pleaseSelectTheStore: 'Please select the shop!',
+    quantityCannotBeLessThan1: 'Quantity cannot be less than 1.',
+    noProductsListed: 'No products listed',
+    pleaseAddTheProductFirst: 'Please add products first!',
+    theNumberOfDinersMustBeGreaterThan0: 'The number of diners must be greater than 0!',
+    pleaseEnterTheProductKeywordProductName: 'Please enter the product keyword: product name',
+    checkProducts: 'Search for product',
+    cashier: 'Cashier',
+    noItemsAvailableAtThisTime: 'There are no products available at this time.',
+    totalNumberOfItems: 'Total number of items',
+    pendingOrders: 'Pending Order',
+    selectProductSpecification: 'Select Product Specification',
+    pleaseAddAStoreOrSelectAStore: 'Please add a shop or select a shop',
+    pleaseUseTheScannerBoxOrScannerGunToScanTheMemberPaymentCode:
+      "Please use the scanner box or scanner gun to scan the member's payment code!",
+    scanTheCodeAndPrintTheTicket: 'Scan the code and print the ticket',
+    successfulPayment: 'Payment successful',
+    printTicket: 'Print Ticket',
+    settleMattersAdding: 'Add to checkout',
+    settleMattersSubmit: 'Submit Settlement',
+    pleaseChooseThePaymentMethod: 'Please select payment method',
+    cash: 'Cash',
+    balancePayment: 'Balance Payment',
+    weChatPayment: 'WeChat Payment',
+    alipayPayment: 'Alipay Payment',
+    settlementInformation: 'Settlement Information',
+    remarkInformation: 'Remarks',
+    pleaseEnterNoteInformation: 'Please enter note information',
+    discountDiscount: 'Discount:(Discount)',
+    pleaseEnterDiscount: 'Please enter discount',
+    reduction$: 'Reduction:($)',
+    pleaseEnterTheDiscountAmount: 'Please enter the discount amount',
+    discountAmount: 'Discount Amount',
+    amountDue: 'Amount payable',
+    name: 'Name',
+    cellPhoneNumber: 'Mobile phone number',
+    availableBalance: 'Available Balance',
+    availablePoints: 'Available Points',
+    confirmReceipt: 'Confirm Receipt',
+    memberInformation: 'Member Information',
+    unbound: 'Unbound',
+    _$: '(Yuan)',
+    storeName: 'Shop Name',
+    couponName: 'Coupon Name',
+    spendHowMuchAvailable: 'Consumption of how much available',
+    couponAmount: 'Coupon Amount',
+    availableType: 'Available Type',
+    pickup: 'Pick-up',
+    takeOut: 'Takeaway',
+    generalPurpose: 'General Purpose',
+    used: 'Used',
+    unused: 'Unused',
+    userNickname: 'Nickname',
+    usedNot: 'Used or not',
+    pickupTime: 'Collection time',
+    showStores: 'Show Stores',
+    selectStore: 'Select shop',
+    redeemCode: 'Redemption Code',
+    picture: 'Picture',
+    howMuchToSpend: 'How much you spend',
+    startTime: 'Start time',
+    closingTime: 'End time',
+    numberOfIssues: 'Number of Issues',
+    pointsRequired: 'Points required',
+    limit: 'Limit',
+    instructionsForUse: 'Instructions for use',
+    whetherItIsOnTheShelfOrNot: 'Whether it is on the shelves',
+    pleaseEnterTheRedemptionCode: 'Please enter the redemption code',
+    pleaseEnterTheNameOfTheCoupon: 'Please enter the name of the coupon',
+    pleaseEnterTheAmountOfMoneySpent: 'Please enter the amount of money spent',
+    pleaseEnterTheAmountOfTheCoupon: 'Please enter the amount of the coupon',
+    selectStartTime: 'Select start time',
+    selectTheEndTime: 'Select end time',
+    pleaseEnterTheNumberOfIssues: 'Please enter the number of issues',
+    pleaseEnterTheNumberOfPointsRequired: 'Please enter the number of points required',
+    pleaseEnterTheQuantityLimit: 'Please enter the number of points required',
+    pleaseEnterTheInstructionsForUse: 'Please enter the instructions',
+    storeId0MeansGenericCantBeEmpty: "Shop id,0 means generic can't be empty.",
+    couponNameCannotBeEmpty: 'Coupon name cannot be empty',
+    consumptionOfHowMuchIsAvailableCanNotBeEmpty: 'The amount of consumption can be used can not be empty',
+    couponAmountCannotBeEmpty: 'Coupon amount cannot be empty',
+    startTimeCannotBeEmpty: 'Start time cannot be empty',
+    endTimeCannotBeEmpty: 'End time cannot be empty',
+    availableTypeCannotBeEmpty: 'Available type cannot be empty',
+    theNumberOfCouponsIssuedCannotBeEmpty: 'Quantity issued cannot be empty',
+    limitOnNumberOfCouponsCannotBeEmpty: 'Limit on number of coupons cannot be empty',
+    descriptionOfUseCannotBeEmpty: 'Description cannot be empty',
+    availableStores: 'Available shops',
+    whetherTheCouponIsOnTheShelfOrNot: 'Whether or not the product is on the shelves',
+    howMuchDoYouWantToSpend: 'How much you spend',
+    redemptionCode: 'Redemption Code',
+    received: 'Already received',
+    endTime: 'End time',
+    pleaseEnterAStoreName: 'Please enter shop name',
+    pleaseEnterTheCouponName: 'Please enter the name of the coupon',
+    collectionRecord: 'Collection Record',
+    couponXls: 'Coupon.xls',
+    tableNumber: 'Table number',
+    id: 'id',
+    classification: 'Classification',
+    tableName: 'Table Name',
+    numberOfOrders: 'Number of Orders',
+    consumptionAmount: 'Consumption amount',
+    lastOrderTime: 'Last order time',
+    pleaseEnterStoreName: 'Please enter shop name',
+    pleaseEnterTheNumber: 'Please enter the number',
+    batchAdd: 'Batch Add',
+    batchDownloadOrderCode: 'Batch download order code',
+    import: 'Import',
+    downloadAndImportTemplate: 'Download and import template',
+    qrCode: 'QR Code',
+    relatedOrders: 'Related Orders',
+    storesTableNumberXls: 'Shops - Table Number.xls',
+    batchImportTableNumberTemplateXls: 'Batch import table number template.xls',
+    smallProgramQrCodeCanOnlyDownloadTheOfficialOh: 'Applet QR code can only download the official Oh',
+    allOrders: 'All Orders',
+    orderStatus: 'Order Status',
+    all: 'All',
+    unpaid: 'Unpaid',
+    inProgress: 'In progress',
+    toBeReceived: 'To be received',
+    receivedPickedUp: 'Received/picked up',
+    refundOrder: 'Refund Order',
+    deleted: 'Deleted',
+    alipay: 'Alipay Payment',
+    cashPayment: 'Cash',
+    userName: 'User Name',
+    phoneNumber: 'Phone number',
+    pleaseEnterTheOrderNumber: 'Please enter the order number',
+    pleaseEnterYourName: 'Please enter your name',
+    pleaseEnterYourPhoneNumber: 'Please enter your phone number',
+    store: 'Shop',
+    userIdNickname: 'User id|Nickname',
+    userNamePhoneNumber: 'User name | Phone',
+    productInformation: 'Product Information',
+    actualPayment: 'Actual payment',
+    paymentMethod: 'Payment method',
+    purchaseType: 'Purchase type',
+    paymentTime: 'Payment Time',
+    notShipped: 'Undelivered',
+    paymentConfirmed: 'Payment Confirmed',
+    orderDetails: 'Order Details',
+    modifyToPaymentStatus: 'Modify to Payment Status',
+    dineIn: 'Dine-in',
+    order: 'Order',
+    selectTableCategory: 'Select Tabletop Category',
+    tabletopPicture: 'Picture',
+    remarks: 'Remarks',
+    desktopPicture: 'Tabletop Picture',
+    pleaseEnterTableName: 'Please enter table name',
+    pleaseEnterTableNumber: 'Please enter the table number',
+    storeCannotBeEmpty: 'Shop cannot be empty',
+    tableNumberCannotBeEmpty: 'Table number cannot be empty',
+    tableNameCannotBeEmpty: 'Table name cannot be empty',
+    status1Enabled2DisabledCannotBeEmpty: 'Status: 1=Enabled, 2=Disabled cannot be empty.',
+    tableNumberPrefix: 'Table number prefix',
+    tableNumberRange: 'Table number range',
+    remark: 'Remarks',
+    tableNumberPrefixCannotBeEmpty: 'Table number prefix cannot be empty',
+    tableNumberStartCannotBeEmpty: 'Beginning of table number cannot be empty',
+    tableNumberEndCannotBeEmpty: 'End of table number cannot be empty',
+    status1EqualsEnable2EqualsDisableCannotBeEmpty: 'Status: 1=Enable, 2=Disable cannot be empty.',
+    likeY: 'For example:Y',
+    miniProgramVersion: 'Applet Version',
+    miniProgramQrCode: 'Applet QR Code',
+    h5QrCode: 'H5 QR code',
+    miniProgramNotConfigured: 'Applet not configured',
+    statusOneEqualsEnableTwoEqualsDisableCannotBeEmpty: "Status: 1=Enabled, 2=Disabled can't be empty",
+    releaseVersion: 'Official Version',
+    experienceVersion: 'Experience Version',
+    developmentVersion: 'Development Version',
+    miniProgramQrCodeCanOnlyBeDownloadedForReleaseVersion: 'Applet QR code can only download the official version',
+    dragFileHereOr: 'Drag the file here, or',
+    clickToUpload: 'Click Upload',
+    onlyAllowImportXlsXlsxFiles: 'Only xls, xlsx format files can be imported.',
+    downloadTemplate: 'Download template',
+    pleaseUploadFile: 'Please upload the file',
+    uploadSuccessCount: 'Number of successful uploads:',
+    updateSuccessCount: 'Number of successful updates:',
+    updateFailureCount: 'Update failed quantity:',
+    uploadFailedPleaseReupload: 'Upload failed, please re-upload!',
+    maxOneFileCanBeUploaded: 'Only one file can be uploaded at most!',
+    categoryName: 'Category Name',
+    pleaseEnterCategoryName: 'Please enter a category name',
+    categoryNumber: 'Category number',
+    personCount: 'Number of people',
+    categorySort: 'Category Sort',
+    openStatus: 'Open Status',
+    storeTableNumberCategoryXls: 'Shop Table Number Classification.xls',
+    pleaseEnterPersonCount: 'Please enter the number of people',
+    pleaseSelectStore: 'Please select shop',
+    categoryNameCannotBeEmpty: 'Category name cannot be empty',
+    personCountCannotBeEmpty: 'Number of people cannot be empty',
+    categorySortCannotBeEmpty: 'Sort by category cannot be empty',
+    wechatMiniProgram: 'WeChat Applet',
+    officialAccount: 'Public',
+    h5: 'H5',
+    pleaseEnterUserNickname: 'Please enter your nickname',
+    pleaseEnterPhoneNumber: 'Please enter your mobile phone number',
+    userAvatar: 'User avatar',
+    userBalance: 'User Balance',
+    userLoginType: 'User Login Type',
+    detail: 'Details',
+    pointsBalance: 'Points Balance',
+    userXls: 'User.xls',
+    userInfo: 'User Information',
+    basicInfo: 'Basic Information',
+    balance: 'Balance',
+    birthday: 'Birthday',
+    idCardNumber: 'Identity Card Number',
+    boundMembershipCard: 'Bound membership card',
+    points: 'Points',
+    commissionAmount: 'Commission Amount',
+    consecutiveSignInDays: 'Consecutive days of signing in',
+    loginIp: 'Login ip',
+    level: 'Level',
+    promotionId: 'Promotion id',
+    purchaseCount: 'Purchase',
+    subordinateCount: 'Number of subordinates',
+    loginType: 'Login Type',
+    registrationTime: 'Registration Time',
+    userOverview: 'User Profile',
+    consumptionRecord: 'Consumption Record',
+    expenseOrGain: 'Spend/Acquire',
+    expense: 'Expenditure',
+    gain: 'Acquisition',
+    unknown: 'Unknown',
+    billTitle: 'Bill Title',
+    detailCategory: 'Detail Type',
+    detailType: 'Detail Type',
+    recharge: 'Recharge',
+    rebate: 'Rebate',
+    consumption: 'Spend',
+    withdrawal: 'Withdrawal',
+    refund: 'Refund',
+    systemAdd: 'System Add',
+    systemReduce: 'System Reduce',
+    subtract: 'Subtract',
+    reward: 'Rewards',
+    signIn: 'Sign-in',
+    membershipCard: 'Membership Card',
+    detailAmountYuan: 'Detailed Figures ($)',
+    remainingYuan: 'Remaining($)',
+    userAccount: 'User Account',
+    realName: 'Real Name',
+    userRemark: 'Remarks',
+    userPoints: 'User Points',
+    detailedAddress: 'Detailed address',
+    pleaseEnterUserAccount: 'Please enter the user account',
+    pleaseEnterRealName: 'Please enter your real name',
+    pleaseEnterBirthday: 'Please enter your birthday',
+    pleaseEnterUserRemark: 'Please enter user notes',
+    pleaseEnterUserBalance: 'Please enter your balance',
+    pleaseEnterCommissionAmount: 'Please enter the commission amount',
+    pleaseEnterUserRemainingPoints: "Please enter the user's remaining points",
+    pleaseEnterDetailedAddress: 'Please enter your address details',
+    userAccountCannotBeEmpty: 'User account cannot be empty',
+    userNicknameCannotBeEmpty: 'Nickname cannot be empty',
+    phoneNumberCannotBeEmpty: "User's mobile phone number cannot be empty",
+    phoneNumber1: 'Mobile phone number',
+    selectMember: 'Select Member',
+    select: 'Select',
+    modifyBalance: 'Modify Balance',
+    increase: 'Increase',
+    decrease: 'Decrease',
+    pleaseEnterBalance: 'Please enter the balance',
+    modifyPoints: 'Modify Points',
+    pleaseEnterPoints: 'Please enter points',
+    amountCannotBeEmpty: 'Amount cannot be empty',
+    pointsCannotBeEmpty: 'Points cannot be empty',
+    name1: 'Name and surname',
+    phone: 'Phone number',
+    consigneeName: "Consignee's name",
+    consigneePhone: "Consignee's phone number",
+    consigneeAddress: "Consignee's Address",
+    consigneeDetailedAddress: "Consignee's Address",
+    isDefault: 'Default',
+    pleaseEnterConsigneeName: 'Please enter the name of the consignee',
+    pleaseEnterConsigneePhone: "Please enter the consignee's phone number",
+    consigneeNameCannotBeEmpty: "Consignee's name cannot be empty",
+    consigneePhoneCannotBeEmpty: "Consignee's phone number cannot be empty",
+    consigneeAddressCannotBeEmpty: "Consignee's address cannot be empty",
+    consigneeDetailedAddressCannotBeEmpty: "Consignee's address cannot be empty",
+    isDefaultCannotBeEmpty: 'Default or not cannot be empty',
+    pleaseEnterConsigneeProvince: "Please enter the consignee's province",
+    desktopStatus: 'Desktop status:',
+    idle: 'Idle',
+    dining: 'Dining',
+    noTableData: 'No table data available',
+    dineInOrders: 'Dine-in order',
+    takeoutOrders: 'Takeaway',
+    selfPickupOrders: 'Pick-up',
+    reservationOrders: 'Reservation',
+    pendingOrder: 'Pending orders',
+    pendingReceipt: 'Pending Receipt',
+    receivedOrPickedUp: 'Received / Picked Up',
+    refundOrders: 'Refund Order',
+    reserving: 'Reservation in progress',
+    cancelled: 'Cancelled',
+    completed: 'Completed',
+    wechatPayment: 'WeChat Payment',
+    userPhone: 'User Phone',
+    pleaseEnterOrderNumber: 'Please enter the order number',
+    pleaseEnterUserName: 'Please enter your name',
+    pleaseEnterUserPhone: 'Please enter your phone number',
+    pickupNumber: 'Pickup Number',
+    orderNumber1: 'Order Number',
+    userNamePhone: 'User Name|Tel',
+    productInfo: 'Product Information',
+    reservation: 'Reservation',
+    reservationPickupTime: 'Reservation Time',
+    issueOrder: 'Order',
+    confirmRefund: 'Confirm Refund',
+    cancelReservation: 'Cancellation',
+    confirmPayment: 'Payment Confirmation',
+    orderRecords: 'Order History',
+    deleteOrder: 'Delete Order',
+    orderRemark: 'Order Remarks',
+    backendReceipt: 'Receive goods in the background',
+    modifyToPaidStatus: 'Modify to payment status',
+    modifyReceiptStatus: 'Modify receipt status',
+    confirmCancelReservation: 'Determine the cancellation of the appointment',
+    orderXls: 'Order.xls',
+    receivingInfoOne: 'Receiving Information1',
+    consignee: 'Consignee',
+    contactPhone: 'Contact phone number',
+    receivingAddress: 'Address',
+    dishDetails: 'Details of the dish',
+    mealNotServed: 'No meal',
+    mealServed: 'Dispensed',
+    userOrdering: 'User Order',
+    staffOrderingOnBehalf: "Employee's order",
+    productDetails: 'Product Details',
+    reserveTable: 'Reservation',
+    price: 'Price',
+    quantity: 'Quantity',
+    orderInfo: 'Order Information',
+    diningPersonCount: 'Number of diners',
+    reservationTime: 'Reservation Time',
+    arrivalTime: 'Arrival time',
+    reservationPerson: 'Reservations',
+    reservationPhone: 'Reservation phone number',
+    reservationStatus: 'Reservation Status',
+    totalProductQuantity: 'Total number of products',
+    totalProductPrice: 'Total Price',
+    shippingFee: 'Shipping Fee',
+    pointsDeduction: 'Points Credit',
+    orderTotalPriceCannotBeEmpty: 'The total price of the order cannot be empty',
+    actualPaymentAmountCannotBeEmpty: 'Actual payment amount cannot be empty',
+    consumptionEarnedPointsCannotBeEmpty: 'Spending to earn points can not be empty',
+    bonusPoints: 'Bonus Points',
+    orderIssued: 'Order has been placed',
+    pleasePlaceAnOrderFirst: 'Please order first!',
+    confirmOfflineCollection: 'Determine the next line of collection',
+    assistWithOrdering: 'Assist in ordering',
+    confirmCollection: 'Confirm payment',
+    issueOrderAndPrintReceipt: 'Print the ticket',
+    print: 'Printing',
+    receiptPrint: 'Ticket Printing',
+    displayStore: 'Shop Display',
+    categoryImage: 'Category Pictures',
+    categoryDescription: 'Category Description',
+    pleaseEnterCategoryDescription: 'Please enter a category description',
+    openStatusCannotBeEmpty: 'Open status cannot be empty',
+    belongingStore: 'Shops',
+    productName: 'Product Name',
+    commentId: 'Comment ID',
+    productScore: 'Product Score',
+    serviceScore: 'Service Score',
+    commentContent: 'Comment content',
+    commentTime: 'Comment time',
+    adminReplyContent: 'Administrator reply content',
+    adminReplyTime: 'Administrator reply time',
+    pleaseEnterNickname: 'Please enter a nickname',
+    reply: 'Reply',
+    weight: 'Weight',
+    pleaseEnterWeight: 'Please enter a weight',
+    imageCannotBeEmpty: 'Image cannot be empty',
+    weightCannotBeEmpty: 'Weight cannot be empty',
+    image: 'Image',
+    isAvailable: 'Availability',
+    salesVolume: 'Sales volume',
+    value: 'Value',
+    sellingPrice: 'Selling price',
+    pleaseEnterTitle: 'Please enter a title',
+    title: 'Title',
+    pleaseEnterValue: 'Please enter a value',
+    pleaseEnterSellingPrice: 'Please enter a sales price',
+    display: 'Show',
+    hide: 'Hide',
+    titleCannotBeEmpty: 'Title cannot be empty',
+    valueCannotBeEmpty: 'Value cannot be empty',
+    sellingPriceCannotBeEmpty: 'Selling price cannot be empty',
+    icon: 'Icon',
+    type: 'Type',
+    pagePath: 'Page Path',
+    page: 'Page',
+    jumpToMiniProgram: 'Jump Applet',
+    content: 'Content',
+    myServiceXls: 'My Services.xls',
+    selectType: 'Select type',
+    miniProgramAppId: 'Applet app_id',
+    pleaseSelectType: 'Please select type',
+    pleaseEnterMiniProgramAppId: 'Please enter applet app_id',
+    pleaseEnterPagePath: 'Please enter the page path',
+    pleaseEnterPhone: 'Please enter a phone number',
+    typeCannotBeEmpty: 'Type cannot be empty',
+    iconCannotBeEmpty: 'Icon cannot be empty',
+    specificationName: 'Specification name',
+    specificationValue: 'Specification Value',
+    pleaseEnterSpecificationName: 'Please enter a specification name',
+    pleaseEnterAttributeName: 'Please enter a property name',
+    pleaseEnterSpecificationValue: 'Please input specification value',
+    addNewSpecification: 'Add new specification',
+    specificationNameCannotBeEmpty: 'Specification name cannot be empty',
+    specificationValueCannotBeEmpty: 'Specification value cannot be empty',
+    rechargeAmountManagementXls: 'Charge Amount Management.xls',
+    productRuleValueSpecificationXls: 'Commodity Rule Value(Specification).xls',
+    withdrawalAmountCannotBeEmpty: 'Withdrawal Amount cannot be empty.',
+    bankCardCannotBeEmpty: 'Bank card cannot be empty.',
+    withdrawalAmount: 'Withdrawal Amount',
+    withdrawToBankCard: 'Withdraw cash to bank card',
+    pleaseEnterWithdrawalAmount: 'Please enter the withdrawal amount',
+    selectBankCard: 'Select bank card',
+    pleaseSelectStatus: 'Please select the status',
+    unreviewed: 'Not audited',
+    pendingArrival: 'Pending',
+    reviewRejected: 'Rejected',
+    arrived: 'Deposited',
+    withdrawalBankCard: 'Withdrawal Bank Card',
+    bankName: 'Bank Name',
+    bankCardNumber: 'Card Number',
+    reviewRejectionReason: 'Reason for Audit Rejection',
+    review: 'Audit',
+    bankNameColon: 'Bank Name:',
+    bankCardNumberColon: 'Bank card no:',
+    realNameColon: 'Real Name:',
+    phoneNumberColon: 'Mobile phone number:',
+    pleaseEnterReviewRejectionReason: 'Please enter the reason for audit rejection',
+    printerName: 'Printer Name',
+    terminalNumber: 'Terminal Number',
+    terminalKey: 'Terminal Key',
+    pleaseEnterPrinterName: 'Please enter the printer name',
+    configurePrinter: 'Configure printer',
+    printerClientId: 'Printer clientId',
+    printerClientSecret: 'Printer clientSecret',
+    printerClientIdCannotBeEmpty: 'Printer clientId cannot be null',
+    printerClientSecretCannotBeEmpty: 'Printer clientSecret cannot be empty.',
+    pleaseEnterTerminalNumber: 'Please enter the terminal number.',
+    pleaseEnterTerminalKey: 'Please enter the terminal key.',
+    pleaseEnterBankName: 'Please enter your bank name.',
+    pleaseEnterBankCardNumber: 'Please enter your bank card number.',
+    pleaseEnterName: 'Please enter your name',
+    bankNameCannotBeEmpty: 'Bank name cannot be empty',
+    bankCardNumberCannotBeEmpty: 'Card number cannot be empty',
+    nameCannotBeEmpty: 'Name cannot be blank',
+    ID: 'ID',
+    pleaseEnterUserId: 'Please enter a user id',
+    pleaseSelectUser: 'Please select user',
+    income: 'Income',
+    amount: 'Amount',
+    storeId: 'Shop ID',
+    typeTips: 'Type:1=Income,2=Expense',
+    pleaseSelectDictionaryGeneration: 'Please select the dictionary to generate',
+    user: 'User',
+    pleaseEnterStoreId: 'Please enter the shop ID',
+    pleaseSelectTypeTips: 'Please select type:1=Income,2=Expense',
+    pleaseEnterAmount: 'Please enter the amount',
+    pleaseEnterUser: 'Please input user',
+    storeNameCannotBeEmpty: 'Shop name cannot be empty',
+    associatedTags: 'Label',
+    selectTag: 'Select Tag',
+    intervalTimeUnitHours: 'Interval time (in hours)',
+    pleaseEnterIntervalTimeUnitHours: 'Please enter the interval time in hours',
+    selectEndTime: 'Select end time',
+    pleaseSelectTag: 'Please select the label',
+    intervalTimeCannotBeEmpty: 'Interval time cannot be empty',
+    tagName: 'Label name',
+    pleaseEnterTagName: 'Please enter a tag name',
+    tagNameCannotBeEmpty: 'Label name cannot be empty',
+    storePhone: 'Shop phone number',
+    storeImage: 'Shop picture',
+    longitude: 'Longitude',
+    latitude: 'Latitude',
+    minimumOrderPrice: 'Starting Price',
+    deliveryPrice: 'Delivery Price',
+    isOpen: 'Open or not',
+    pleaseEnterStorePhone: 'Please enter the shop phone number',
+    pleaseEnterPlaceKeyword: 'Please enter the keyword of the place name',
+    selectOnMap: 'Map Selection',
+    pleaseSelectLocationAddress: 'Please select the location address',
+    storeAvatar: 'Shop Avatar',
+    storeGroupImages: 'Shops',
+    businessStartTime: 'Opening time',
+    businessEndTime: 'Closing time',
+    selectMapLocation: 'Select map location',
+    mapLocationAddress: 'Map Address',
+    takeoutDeliveryDistance: 'Delivery Distance/Kilometre',
+    announcement: 'Announcement',
+    bindAdministrator: 'Bind administrator',
+    selectBusinessStartTime: 'Select start time',
+    selectBusinessEndTime: 'Select end time',
+    pleaseEnterMapLocationAddress: 'Please enter a map to locate the address',
+    pleaseEnterLongitude: 'Please enter the longitude',
+    pleaseEnterLatitude: 'Please input the latitude',
+    pleaseEnterTakeoutDeliveryDistance: 'Please enter the delivery distance in kilometres, 0 means no delivery',
+    pleaseEnterMinimumOrderPrice: 'Please enter the starting price',
+    pleaseEnterDeliveryPrice: 'Please enter the delivery price',
+    pleaseEnterAnnouncement: 'Please enter the announcement',
+    clickToSelectAddressToGetLongitudeAndLatitude: 'Click on the address to get the latitude and longitude',
+    selectUser: 'Select User',
+    bindAdministratorForBranchManagement: 'Bind administrator for shop management',
+    isStoreReceiptPrintingEnabled: 'Whether to enable shop ticket printing',
+    bindPrinter: 'Bind printer',
+    selectPrinter: 'Select Printer',
+    isCustomerReceiptPrintingEnabled: 'Enable or disable customer ticket printing',
+    isKitchenReceiptPrintingEnabled: 'Enable or disable kitchen ticket printing',
+    storePhoneCannotBeEmpty: 'Shop phone number cannot be empty',
+    multipleImagesCannotBeEmpty: 'Multiple pictures cannot be empty',
+    detailedAddressCannotBeEmpty: 'Address details cannot be empty',
+    mapLocationAddressCannotBeEmpty: 'Map address cannot be empty',
+    longitudeCannotBeEmpty: 'Longitude cannot be empty',
+    latitudeCannotBeEmpty: 'Latitude cannot be empty',
+    takeoutDeliveryDistanceTips: 'Delivery distance in kilometres, 0 means no delivery, cannot be empty',
+    minimumOrderPriceCannotBeEmpty: 'Starting price cannot be empty',
+    deliveryPriceCannotBeEmpty: 'Delivery price cannot be empty',
+    announcementCannotBeEmpty: 'Announcement cannot be empty',
+    isOpenTips: 'Whether open:0=no,1=yes cannot be empty.',
+    administratorIdCannotBeEmpty: 'Administrator id cannot be empty',
+    printerIdCannotBeEmpty: 'Printer id cannot be empty',
+    businessStartTimeCannotBeEmpty: 'Business start time can not be empty',
+    businessEndTimeCannotBeEmpty: 'Business end time can not be empty',
+    pleaseBindStorePrinter: 'Please bind the shop printer',
+    pleaseBindCustomerPrinter: 'Please bind the customer printer',
+    pleaseBindKitchenPrinter: 'Please bind the kitchen printer',
+    storeManagementXls: 'Shop Management.xls',
+    inStoreConsumption: 'Visiting Stores',
+    appointmentLabelXls: 'Reservation Label.xls',
+    appointmentRuleXls: 'Reservation Rules.xls',
+    storeMobileMerchantUserAssociationXls: 'Shop Mobile Merchant User Association.xls'
+  },
+  market: {
+    orderNumber: 'Order number',
+    userIdAndNickname: 'User id|Nickname',
+    billTitle: 'Bill Title',
+    detailedFigureYuan: 'Detailed figure(yuan)',
+    paid: 'Paid',
+    unpaid: 'Unpaid',
+    addTime: 'Add Time',
+    cardName: 'Card Name',
+    pleaseEnterTheNameOfTheMembershipCard: 'Please enter the name of the membership card',
+    discountRatio: 'Discount Ratio',
+    break: 'Discount',
+    validPeriod: 'Valid Period',
+    permanent: 'Permanent',
+    month: 'Monthly',
+    purchasePrice: 'Price of Purchase',
+    bonusPoints: 'Bonus Points',
+    bonusAmount: 'Bonus amount',
+    delete: 'Delete',
+    purchaseRecord: 'Purchase Record',
+    membershipCardXls: 'Membership Card.xls',
+    basicInformation: 'Basic Information',
+    cardStyle: 'Membership Card Style',
+    pleaseEnterTheOrder: 'Please enter the sort',
+    discount: 'Discount',
+    pleaseEnterThePercentageOfDiscount: 'Please enter the percentage of discount',
+    freeGiftWhenYouOpenTheCard: 'Complimentary',
+    balance: 'Balance',
+    NumberBonusPoints: 'Number of bonus points',
+    pleaseEnterTheNumberOfBonusPoints: 'Please enter the number of bonus points',
+    bonusBalance: 'Bonus Balance',
+    pleaseEnterTheBalanceOfTheGift: 'Please enter the bonus balance',
+    receiveConfiguration: 'Receive Configuration',
+    validityPeriod: 'Expiry date',
+    pleaseEnterTheValidityPeriod: 'Please enter the validity period',
+    theValidityPeriodIsInMonths0MeansPermanent: 'The validity period is in months, 0- means permanent',
+    pleaseEnterThePurchasedPrice: 'Please enter the purchase price',
+    rulesForUse: 'Rules of use',
+    cardNameCannotBeEmpty: 'The name of the membership card cannot be empty',
+    cardStyleCannotBeEmpty: 'Card style cannot be empty',
+    expiryDateCannotBeEmpty: 'Expiry date cannot be empty',
+    purchasePriceCannotBeEmpty1: 'Purchase price cannot be empty',
+    orderTotalPriceCannotBeEmpty: 'The total price of the order cannot be empty',
+    refundAmountCannotBeEmpty: 'Refund amount cannot be empty',
+    orderTotalPrice: 'Total Order Price',
+    refundAmount: 'Refund amount',
+    pleaseEnterOrderNumber: 'Please enter the order number',
+    pleaseEnterOrderTotalPrice: 'Please enter the total price of the order',
+    actualPaymentAmountCannotBeEmpty: 'Actual payment amount cannot be empty',
+    consumptionEarnedPointsCannotBeEmpty: 'Spending and earning points cannot be empty',
+    actualPaymentAmount: 'Actual Payment Amount',
+    pleaseEnterActualPaymentAmount: 'Please enter the actual payment amount',
+    pleaseEnterBonusPoints: 'Please enter the bonus points',
+    expressCompanyCannotBeEmpty: 'Courier company cannot be empty',
+    expressTrackingNumberCannotBeEmpty: 'Courier number can not be empty',
+    expressCompany: 'Courier Company',
+    selectExpressCompany: 'Select courier company',
+    pleaseEnterExpressTrackingNumber: 'Please enter the courier order number',
+    courierNumber: 'Express Order Number',
+    tableNumber: 'Table number',
+    pickupNumber: 'Pick-up number',
+    address: 'Address',
+    orderId: 'Order id',
+    operationRecord: 'Operation record',
+    operationTime: 'Operation time'
+  },
+  message: {
+    templateName: 'Template Name',
+    pleaseEnterTheTemplateName: 'Please enter the template name',
+    templateNumber: 'Template number',
+    templateId: 'Template ID',
+    type: 'Type',
+    templateMessage: 'Template Message',
+    subscribeMessage: 'Subscribe Message',
+    addTime: 'Add Time',
+    weChatTemplateXls: 'WeChat Template.xls',
+    messageType: 'Message Type',
+    pleaseSelectType: 'Please select type',
+    pleaseSelectMessageType: 'Please select message type',
+    pleaseEnterTheTemplateNumber: 'Please enter template number',
+    pleaseEnterTheTemplateId: 'Please enter the template ID',
+    templateNumberCannotBeEmpty: 'Template ID cannot be empty',
+    templateNameCannotBeEmpty: 'Template name cannot be empty',
+    messageTypeCannotBeEmpty: 'Template ID cannot be empty',
+    templateIdCannotBeEmpty: 'Message Type cannot be empty',
+    open: 'Enable'
+  },
+  mp: {
+    name: 'Name',
+    wechatAccount: 'Micro Signal',
+    messageEncryptionKey: 'Message encryption and decryption key',
+    pleaseEnterName: 'Please enter your name',
+    pleaseEnterWechatAccount: 'Please enter your micro-signal',
+    pleaseEnterOfficialAccount: 'Please input public number appSecret',
+    pleaseEnterOfficialAccountToken: 'Please enter the public token',
+    pleaseEnterMessageEncryptionKey: 'Please enter the message encryption and decryption key',
+    pleaseEnterMiniProgramAppId: 'Please enter applet appId',
+    pleaseEnterMiniProgramAppSecret: 'Please enter the applet appSecret',
+    tip11:
+      'You can find ‘Micro Signal’ in the menu [Settings & Development - Public Number Settings - Account Details] of WeChat Public Platform (mp.weixin.qq.com).',
+    tip12:
+      'You can find ‘Developer ID (AppID)’ in the menu [Settings & Development - Public Number Settings - Basic Settings] of WeChat Public Platform (mp.weixin.qq.com).',
+    tip13:
+      'You can find ‘Developer Password (AppSecret)’ in [Settings & Development - Public Number Settings - Basic Settings] on the menu of WeChat Public Platform (mp.weixin.qq.com).',
+    nameCannotBeEmpty: 'Name cannot be empty',
+    officialAccountCannotBeEmpty: 'Public number account cannot be empty.',
+    officialAccountAppIdCannotBeEmpty: 'Public appId cannot be empty.',
+    officialAccountSecretCannotBeEmpty: 'Public Key cannot be empty.',
+    officialAccountTokenCannotBeEmpty: 'Public token cannot be empty',
+    appId: 'appId',
+    serverAddressUrl: 'Server address (URL)',
+    qrCode: 'QR Code',
+    generateQRCode: 'Generate QR code',
+    isMainAccount: 'Whether it is the main account',
+    search: 'Search',
+    reset: 'Reset',
+    clearApiQuota: 'Clear API Quota',
+    setAsMainAccount: 'Set as Master Account',
+    settingSucceeded: 'Setup Successful',
+    messageType: 'Message Type',
+    matchingType: 'Match Type',
+    pleaseSelectMatchingType: 'Please select match type',
+    pleaseEnterContent: 'Please enter content',
+    keyword: 'Keyword',
+    replyMessage: 'Reply Message',
+    requestedKeywordCannotBeEmpty: 'The requested keyword cannot be null',
+    requestedKeywordMatchingCannotBeEmpty: 'The match for the requested keyword cannot be null',
+    requestMessageType: 'Request message type',
+    cover: 'Cover',
+    tip3: 'You are publishing content by publishing. Publishing does not take up the number of group posts and can be done multiple times a day.',
+    tip4: 'Published content is not pushed to users and is not displayed on the public home page.',
+    tip5: 'After posting, you can go to the posting history to get the link, or you can add the posted content to custom menus, autoresponders, topics, and page templates.',
+    replyMessageType: 'Reply message types',
+    replyContent: 'Reply Content',
+    officialAccount: 'Public',
+    addNew: 'New',
+    replyOnFollow: 'Reply on Follow',
+    messageReply: 'Message Reply',
+    keywordReply: 'Keyword Reply',
+    addNewAutoReply: 'Add Auto-Reply',
+    modifyAutoReply: 'Modify auto-reply',
+    areYouSureToDeleteThisData: 'Confirm deletion of this data',
+    deletionSucceeded: 'Delete Success',
+    modificationSucceeded: 'Modify Success',
+    additionSucceeded: 'Add Success',
+    updateitionSucceeded: 'Update Success',
+    uploadLocally: 'Local Upload',
+    supportsBmpPngJpegJpgGifFormatsSizeNotExceeding2M: 'Support bmp/png/jpeg/jpg/gif format, size not more than 2M.',
+    uploadError: 'Upload error:',
+    uploadFailed: 'Upload failed:',
+    pleaseEnterTitleRequired: 'Please enter a title (required)',
+    pleaseEnterAuthor: 'Please enter author',
+    pleaseEnterOriginalArticleAddress: 'Please enter the address of the original article',
+    pleaseEnterAbstract: 'Please enter a summary',
+    areYouSureToDeleteThisGraphic: 'Sure you want to delete this graphic?',
+    createNewGraphic: 'Create new image',
+    modifyGraphic: 'Modify image',
+    modifiedContentMayNotBeSavedAreYouSureToClose: 'Changes may not have been saved, are you sure you want to close it?',
+    publishingSucceeded: 'Post Successful',
+    thisOperationWillPermanentlyDeleteTheDraftAreYouSureToContinue:
+      'This action will permanently delete the draft, do you want to continue?',
+    afterDeletionUsersCannotAccessThisPageAreYouSureToDelete:
+      'Users will not be able to access this page after deletion, are you sure you want to delete it?',
+    image: 'Picture',
+    voice: 'Voice',
+    video: 'Video',
+    clickToUpload: 'Click to upload',
+    uploadSucceeded: 'Uploaded successfully',
+    createNewVideo: 'New Video',
+    selectVideo: 'Select Video',
+    tip0: 'Format support MP4, file size not more than 10MB.',
+    tips1: 'The title will be displayed on the relevant playback page, it is recommended to fill in a clear, accurate and vivid title.',
+    tips2:
+      'The introduction will be displayed on the relevant playback page, it is recommended to fill in a concise, clear and informative content.',
+    pleaseEnterTitle: 'Please enter a title',
+    pleaseEnterDescription: 'Please enter a description',
+    number: 'No.',
+    fileName: 'File name',
+    introduction: 'Introduction',
+    uploadTime: 'Upload time',
+    download: 'Download',
+    delete: 'Delete',
+    description: 'Descripción',
+    formatSupportsMp3WmaWavAmrFileSizeNotExceeding2MPlaybackLengthNotExceeding60s:
+      'Support mp3/wma/wav/amr, file size not more than 2M, playback length not more than 60s.',
+    thisOperationWillPermanentlyDeleteTheFileAreYouSureToContinue:
+      'This operation will delete the file permanently, do you want to continue?',
+    deleteCurrentMenu: 'Delete current menu',
+    menuName: 'Menu name',
+    pleaseEnterMenuName: 'Please enter a menu name.',
+    menuIdentifier: 'Menu ID',
+    pleaseEnterMenuKey: 'Please input menu KEY',
+    menuContent: 'Menu content',
+    jumpLink: 'Jump link',
+    pleaseEnterLink: 'Please enter a link',
+    miniProgramAppId: 'Appid of the applet ',
+    miniProgramPagePath: 'Page path of the applet',
+    pleaseEnterMiniProgramPagePathEgPagesIndex: "Please enter the applet's page path, e.g. pages/index",
+    miniProgramBackupWebpage: 'Alternate page for the applet:',
+    OlderVersionsOfTheClientThatDoNotSupportMiniProgramsWillOpenThisWebpage:
+      "Older versions of clients that don't support applets will open this page.",
+    tipsYouNeedToAssociateWithTheOfficialAccountToBindTheMiniProgramToTheWeChatMenu:
+      'Tips:You need to associate with your public number to bind the applet to your WeChat menu!',
+    selectFromMaterialLibrary: 'Material library selection',
+    selectGraphic: 'Select Graphic',
+    YouHaveSelectedAMultiGraphicItWillDefaultToJumpToTheFirstOne:
+      'If you select more than one article, it will jump to the first one by default.',
+    jumpToWebpage: 'Jump page',
+    jumpToMiniProgram: 'Jump to small programme',
+    clickToReply: 'Click reply',
+    jumpToGraphicMessage: 'Jump to graphic message',
+    scanCodeToReturnResultDirectly: 'Scan the code to return directly to the result',
+    scanCodeToReply: 'Scan code reply',
+    systemTakePhotoAndSendImage: 'System photo sending picture',
+    takePhotoOrSelectFromAlbum: 'Take a picture or photo album',
+    wechatAlbum: 'WeChat Photo Album',
+    selectLocation: 'Select geographic location',
+    subMenuName: 'Submenu name',
+    saveAndPublishMenu: 'Save and publish the menu',
+    clearMenu: 'Empty menu',
+    pleaseSelectMenuConfiguration: 'Please select menu configuration',
+    areYouSureToDelete: 'Sure you want to delete?',
+    areYouSureToSave: 'Sure you want to save?',
+    clearingSucceeded: 'Empty successfully',
+    userIdentifier: 'User identification',
+    pleaseSelectMessageType: 'Please select the message type',
+    pleaseEnterUserIdentifier: 'Please enter a user ID',
+    fanMessageList: 'Fan message list',
+    sendTime: 'Sending time',
+    sender: 'Sender',
+    fan: 'Fans',
+    follow: 'Follow',
+    unfollow: 'Unfollow',
+    clickMenu: 'Click on the menu',
+    clickMenuLink: 'Click on the menu link',
+    scanCodeResult: 'Scanning results',
+    unknownEventType: 'Unknown event type',
+    link: 'Link',
+    unknownMessageType: 'Unknown Message Type',
+    message: 'message',
+    timeRange: 'Time Range',
+    userIncreaseDecreaseData: 'User increase/decrease data',
+    cumulativeUserData: 'Cumulative user data',
+    messageOverviewData: 'Message Profile Data',
+    interfaceAnalysisData: 'Interface Analysis Data',
+    newUsers: 'New Users',
+    unfollowedUsers: 'Unfollowed Users',
+    cumulativeUserCount: 'Accumulated Users',
+    numberOfUsersSendingMessages: 'Number of users sent',
+    numberOfMessagesSentByUsers: 'Number of messages sent by users',
+    numberOfPassiveRepliesToUserMessages: 'Number of passive replies to user messages',
+    numberOfFailures: 'Number of failures',
+    maximumTimeConsumed: 'Maximum time spent',
+    totalTimeConsumed: 'Total time spent',
+    noOfficialAccountSelectedCannotStatisticData: 'No public number is selected, no statistics are available',
+    timeIntervalShouldBeWithin7DaysPleaseReSelect: 'Time interval within 7 days, please re-select',
+    synchronize: 'Synchronisation',
+    numberOfFans: 'Fans',
+    areYouSureToSynchronizeTags: 'Are you sure to sync tags?',
+    tagSynchronizationSucceeded: 'Tag synchronisation is successful',
+    pleaseEnterTagName: 'Please enter the tag name',
+    nickname: 'Nickname',
+    tag: 'Tag',
+    subscriptionStatus: 'Subscription Status',
+    subscriptionTime: 'Subscription time',
+    areYouSureToSynchronizeFans: 'Are you sure you want to sync your followers?',
+    startingToSynchronizeFanInfoFromWechatOfficialAccountItTakesTimePleaseQueryLater:
+      "It will take some time to synchronise the followers' information from WeChat, we suggest you to check it later.",
+    pleaseSelectTag: 'Please select a tag',
+    subscribed: 'Subscribed',
+    unsubscribed: 'Unsubscribed'
+  },
+  pay: {
+    idTenantId: 'id(+Tenant ID)',
+    paymentType: 'Payment type (payment channel)',
+    applicationId: 'Application id',
+    merchantId: 'Merchant id',
+    asynchronousCallbackAddress: 'Asynchronous callback address',
+    synchronousCallbackAddress: 'Synchronous callback address',
+    signature: 'Signature method',
+    testEnvironment: 'Test environment',
+    alipay: 'Alipay',
+    weChatPayment: 'WeChat Payment',
+    payId: 'Payment id',
+    weChatPaySmallProgram: 'WeChat Payment Applet',
+    weChatPayPublic: 'WeChat Pay Public',
+    weChatPayH5: 'WeChat Pay H5',
+    alipayH5: 'Alipay H5',
+    pleaseEnterTheAppId: 'Please enter the app id',
+    weChatMerchantId: 'WeChat Merchant id',
+    pleaseEnterWeChatMerchantId: 'Please enter WeChat merchant id',
+    alipayMerchantId: 'Alipay merchant id',
+    pleaseEnterTheAlipayMerchantId: 'Please enter the Alipay merchant id',
+    certificateStorageType: 'Certificate Storage Type',
+    pleaseSelectTheType: 'Please select the type',
+    noteNeedCertificateOfChoiceDoNotNeedNotChoose: 'Note: need certificate of choice do not need not choose',
+    privateKeyOrPrivateKeyCertificate: 'Private key or private key certificate',
+    pleaseEnterThePrivateKeyOrPrivateKeyCertificate: 'Please enter the private key or private key certificate',
+    publicKeyOrPublicKeyCertificate: 'Public key or public key certificate',
+    pleaseEnterThePublicKeyOrPublicKeyCertificate: 'Please enter the public key or public key certificate',
+    keyCertificate: 'key certificate',
+    pleaseEnterTheKeyCertificateAdditionalCertificatesToUseSuchAsSslCertificateOrUnionPayRootLevelCertificates:
+      'Please enter the key certificate, additional certificates to use, such as SSL certificate, or UnionPay root-level certificate aspects',
+    passwordOfTheCertificate: 'Password of the certificate',
+    pleaseEnterThePasswordOfThePrivateKeyCertificateOrKeyCertificate:
+      'Please enter the password of the private key certificate or key certificate.',
+    pleaseEnterTheAsynchronousCallback: 'Please enter the asynchronous callback',
+    pleaseEnterTheSynchronousCallbackAddressWhichIsMostlyUsedForPageJumpAfterSuccessfulPayment:
+      'Please enter the address of synchronous callback, which is mostly used for page jump after successful payment.',
+    pleaseSelectSignatureMethodMd5: 'Please select the signature method MD5',
+    subappid: 'Subappid',
+    pleaseEnterTheSubAppid: 'Please enter the sub-appid',
+    subMerchantId: 'Sub-merchant id',
+    pleaseEnterTheSubMerchantId: 'Please input the sub-merchant id',
+    paymentTypeCannotBeEmpty: 'Payment type (payment channel) cannot be empty.',
+    paymentIdCannotBeEmpty: 'Payment id cannot be empty',
+    applicationIdCannotBeEmpty: 'App id cannot be empty',
+    signatureMethodCannotBeEmpty: 'Signature method cannot be empty',
+    asynchronousCallbackAddressCannotBeEmpty: 'Asynchronous callback address cannot be empty'
+  },
+  Redirect: {},
+  score: {
+    all: 'All',
+    toBePaid: 'To be paid',
+    toBeShipped: 'To be shipped',
+    toBeReceived: 'To be received',
+    completed: 'Completed',
+    allOrders: 'All Orders',
+    orderStatus: 'Order Status',
+    userName: 'User Name',
+    pleaseEnterYourPhoneNumber: 'Please enter your phone number',
+    pleaseEnterTheOrderNumber: 'Please enter the order number',
+    userIdNickname: 'User id|Nickname',
+    productInformation: 'Product Information',
+    totalPointsConsumed: 'Total Points Consumed',
+    totalConsumptionAmount: 'Total Consumption',
+    paymentMethod: 'Payment Method',
+    balancePayment: 'Balance Payment',
+    weChatPayment: 'WeChat Payment',
+    alipayPayment: 'Alipay Payment',
+    cashPayment: 'Cash Payment',
+    shipping: 'Shipping',
+    more: 'More',
+    orderDetails: 'Order Details',
+    deleteOrder: 'Delete Order',
+    backstageReceiving: 'Backstage Receiving',
+    pointsMallOrdersXls: 'Shop-to-Earn Orders.xls',
+    modifyReceivingStatus: 'Modify Receiving Status',
+    receivingInformation: 'Receiving Information',
+    nickname: 'User Nickname',
+    consignee: 'Consignee',
+    contactPhoneNumber: 'Contact phone number',
+    address: 'Address',
+    productDetails: 'Product details',
+    goodsPicture: 'Picture',
+    productName: 'Product Name',
+    orderInformation: 'Order Information',
+    logisticsInformation: 'Logistics Information',
+    orderNo: 'Order No.',
+    quantity: 'Quantity',
+    spendingPoints: 'Spending Points',
+    payment: 'Payment or not',
+    whetherToShipOrNot: 'Whether shipment',
+    receiveOrNot: 'Receive or not',
+    expressCompany: 'Express company',
+    courierNumber: 'Courier Number',
+    selectType: 'Select type',
+    fillInManually: 'Fill in manually',
+    shippingType: 'Shipment type',
+    selectCourierCompany: 'Select courier company',
+    pleaseEnterTheCourierSingleNumber: 'Please enter the courier single number',
+    pleaseSelectTheCourierCompany: 'Please select the courier company',
+    courierSingleNumberCanNotBeEmpty: 'Courier single number can not be empty',
+    productTitle: 'Product Title',
+    pleaseEnterTheProductTitle: 'Please enter the product title',
+    selectCategory: 'Select Product Category',
+    productCategory: 'Product Category',
+    mainPicture: 'Main picture',
+    picture: 'Picture',
+    pointsConsumption: 'Points Consumption',
+    price: 'Price',
+    originalPrice: 'Original Price',
+    weight: 'Weight',
+    inventory: 'Inventory',
+    salesVolume: 'Sales Volume',
+    whetherItIsOnTheShelfOrNot: 'Whether it is on the shelf or not',
+    up: 'Up',
+    down: 'Down',
+    pointsProductsXls: 'Points Products.xls',
+    category: 'Product Category',
+    groupPicture: 'Group picture',
+    detail: 'Details',
+    purchaseAmount: 'Purchase Amount',
+    pleaseEnterThePointsConsumed: 'Please enter the points consumed',
+    pleaseEnterTheAmount: 'Please enter the amount',
+    tips: 'When both points and amount are greater than 0, it means that this product needs points + price to buy.',
+    pleaseEnterStock: 'Please enter stock',
+    pleaseEnterAWeight: 'Please enter the weight',
+    productTitleCannotBeEmpty: 'Product title cannot be empty',
+    pleaseSelectProductCategory: 'Please select product category',
+    mainPictureCannotBeEmpty: 'Main picture cannot be empty',
+    groupPictureCannotBeEmpty: 'Group picture cannot be empty',
+    detailsCannotBeEmpty: 'Details cannot be empty',
+    pointsConsumedCannotBeEmpty: 'Points consumed cannot be empty',
+    originalPriceCannotBeEmpty: 'Original price cannot be empty',
+    inventoryCannotBeEmpty: 'Inventory cannot be empty',
+    uploadImage: 'Upload image',
+    availability: 'Availability',
+    imageCannotBeEmpty: 'Image cannot be empty',
+    showOrNotCannotBeEmpty: 'Show or not cannot be empty',
+    weightCannotBeEmpty: 'Weight cannot be empty',
+    pointsMallAdvertisementMapManagementXls: 'Points mall advertisement map management.xls',
+    categoryName: 'Category Name',
+    sortByCategory: 'Category Sort',
+    enableStatus: 'Enable Status',
+    pleaseInputCategoryName: 'Please input category name',
+    pleaseInputCategorySorting: 'Please input category sort',
+    categoryNameCannotBeEmpty: 'Category name cannot be empty',
+    openStatusCannotBeEmpty: 'Open status cannot be empty',
+    categoryNumber: 'Category number',
+    pointsProductClassificationXls: 'Points Product Classification.xlss'
+  },
+  system: {
+    ipQuery: 'IP Query',
+    pleaseEnterIpAddress: 'Please enter an IP address',
+    showIpQueryResults: 'Show IP query results',
+    ipAddressCannotBeEmpty: 'IP address cannot be empty',
+    querySuccess: 'Query Successful',
+    no: 'Number',
+    placeName: 'Place Name',
+    superiorDepartment: 'Superior Department',
+    pleaseSelectTheParentDepartment: 'Please select the superior department',
+    departmentName: 'Department Name',
+    pleaseEnterADepartmentName: 'Please enter the name of the department',
+    departmentStatus: 'Department Status',
+    pleaseSelectDepartmentStatus: 'Please select department status',
+    displaySort: 'Display Sort',
+    personInCharge: 'Person in Charge',
+    pleaseEnterThePersonInCharge: 'Please enter the person in charge',
+    contactPhoneNumber: 'Contact phone number',
+    pleaseInputTheContactPhoneNumber: 'Please input contact phone number',
+    mailbox: 'Mailbox',
+    pleaseInputMailbox: 'Please input mailbox',
+    status: 'Status',
+    pleaseSelectStatus: 'Please select status',
+    parentDepartmentCannotBeEmpty: 'Parent department cannot be empty',
+    departmentNameCannotBeEmpty: 'Department name cannot be empty',
+    displayOrderCannotBeEmpty: 'Display order cannot be empty',
+    statusCannotBeEmpty: 'Status cannot be empty',
+    pleaseEnterTheCorrectEmailAddress: 'Please enter the correct email address',
+    pleaseEnterTheCorrectCellPhoneNumber: 'Please enter the correct mobile phone number',
+    topDepartment: 'Top Departments',
+    expandCollapse: 'Expand/Collapse',
+    dictionaryType: 'Dictionary Type',
+    dataLabel: 'Data Label',
+    dataKeyValue: 'Data Key Value',
+    colorType: 'Colour Type',
+    pleaseEnterParameterName: 'Please enter a parameter name',
+    pleaseEnterDataLabel: 'Please enter a data label',
+    pleaseEnterDataKeyValue: 'Please enter a data key value',
+    pleaseEnterCSSClass: 'Please enter CSS Class',
+    pleaseEnterContent: 'Please enter the content',
+    dataLabelCannotBeEmpty: 'Data tag cannot be empty',
+    dataKeyValueCannotBeEmpty: 'Data key value cannot be null',
+    dataOrderCannotBeEmpty: 'Data order cannot be null',
+    default: 'Default',
+    primary: 'Main',
+    success: 'Successful',
+    information: 'Message',
+    warning: 'Warning',
+    danger: 'Danger',
+    dictionaryName: 'Dictionary name',
+    dictionaryLabel: 'Dictionary label',
+    pleaseEnterDictionaryLabel: 'Please enter a dictionary label',
+    dataStatus: 'Data status',
+    dictionaryCode: 'Dictionary Code',
+    dictionaryKeyValue: 'Dictionary Key',
+    dictionarySort: 'Dictionary Sort',
+    dictionaryDataXls: 'Dictionary Data.xls',
+    pleaseEnterDictionaryName: 'Please enter a dictionary name',
+    dictionaryNameCannotBeEmpty: 'Dictionary name cannot be empty',
+    dictionaryTypeCannotBeEmpty: 'Dictionary Type cannot be empty',
+    dictionaryNumber: 'Dictionary Number',
+    pleaseEnterDictionaryType: 'Please enter the dictionary type',
+    pleaseSelectDictionaryStatus: 'Please select dictionary status',
+    newAdd: 'Add',
+    export: 'Export',
+    data: 'Data',
+    dictionaryTypeXls: 'DictionaryType.xls',
+    userName: 'User Name',
+    loginAddress: 'Login Address',
+    loginDate: 'Login Date',
+    pleaseEnterUserName: 'Please enter user name',
+    pleaseEnterLoginAddress: 'Please enter login address',
+    logNumber: 'Log number',
+    operationType: 'Operation type',
+    browser: 'Browser',
+    loginResult: 'Login Result',
+    details: 'Details',
+    loginLogxls: 'Login Log.xls',
+    email: 'Mailbox',
+    password: 'Password',
+    SMTPserverDomainName: 'SMTP server domain name',
+    SMTPserverPort: 'SMTP server port',
+    whetherToEnableSSL: 'Enable SSL',
+    whetherToEnableSTARTTLS: 'Enable or disable STARTTLS',
+    creationTime: 'Creation Time',
+    operation: 'Operation',
+    number: 'Number',
+    cache: 'Cache',
+    noCache: 'Not Cached',
+    cacheStatus: 'Cache Status',
+    always: 'Always',
+    no1: 'Not',
+    cache1: 'If you choose caching, it will be cached by `keep-alive`, you must fill in the `component name` field.',
+    cache2: 'When selecting not, when this menu has only one submenu, it will not show itself, but will show the submenu directly',
+    cache3: 'When hidden, the route will not appear in the sidebar, but will still be accessible.',
+    cache4: 'Permission character on Controller method, e.g. @PreAuthorize(`@ss.hasPermission(‘system:user:list’)`)',
+    cache5: 'The routing address of the access, e.g. `user`. If an extranet address is required, it starts with `http(s)://`.',
+    cache6: 'For example, say SystemUser',
+    pushSucceeded: 'Push Success',
+    isItNecessaryToPushTheSelectedNotification: 'Is the selected notification pushed?',
+    sendingTime: 'Send time',
+    receivingEmail: 'Received mailbox',
+    userId: 'User ID',
+    userType: 'User Type',
+    emailTitle: 'Title',
+    emailContent: 'Mail Content',
+    emailParameters: 'Parameters',
+    sendingStatus: 'Send Status',
+    emailAccount: 'Email account',
+    sendingEmailAddress: 'Send Email Address',
+    templateNumber: 'Template number',
+    templateCode: 'Template Code',
+    templateSenderName: 'Template sender name',
+    sendingReturnedMessageNumber: 'Send Return Message Number',
+    sendingException: 'Send Exception',
+    test: 'Test',
+    templateContent: 'Template content',
+    recipientEmail: 'Incoming Email',
+    enterRecipientEmail: 'Enter your email address',
+    pleaseEnter: 'Please enter',
+    emailCannotBeEmpty: 'Mailbox can not be empty',
+    templateNumberCannotBeEmpty: 'Template number can not be empty',
+    templateName: 'Template Name',
+    templateTitle: 'Title of the template',
+    senderName: "Sender's name",
+    enableStatus: 'Open Status',
+    remarks: 'Remarks',
+    menuName: 'Menu Name',
+    pleaseEnterMenuName: 'Please input the menu name',
+    pleaseSelectMenuStatus: 'Please select menu status',
+    refreshMenuCache: 'Refresh menu cache',
+    permissionIdentity: 'Permission ID',
+    componentPath: 'Component Path',
+    componentName: 'Component name',
+    browserShow: 'The cache will be updated soon to refresh the browser!',
+    parentMenu: 'Parent Menu',
+    menuType: 'Menu Type',
+    menuIcon: 'Menu Icon',
+    routeAddress: 'Routing Address',
+    componentAddress: 'Component Address',
+    menuStatus: 'Menu Status',
+    displayStatus: 'Display status',
+    alwaysDisplay: 'Always displayed',
+    pleaseEnterRouteAddress: 'Please enter a route address',
+    pleaseEnterPermissionIdentity: 'Please enter a permission code',
+    menuNameCannotBeEmpty: 'Menu name cannot be empty',
+    menuOrderCannotBeEmpty: 'Menu order cannot be empty',
+    routeAddressCannotBeEmpty: 'Route address cannot be empty',
+    thePathMustStartWith: 'Route must start with /.',
+    thePathCannotStartWith: 'Path must not begin with /.',
+    mainCategory: 'Main Category',
+    announcementTitle: 'Announcement title',
+    announcementStatus: 'Announcement Status',
+    announcementNumber: 'Bulletin Number',
+    coverImage: 'Cover Image',
+    announcementType: 'Bulletin Type',
+    pleaseEnterAnnouncementTitle: 'Please enter the title of the announcement',
+    pleaseSelectAnnouncementStatus: 'Please select the announcement status',
+    push: 'Push',
+    announcementContent: 'Announcement content',
+    pleaseSelectAnnouncementType: 'Please select the type of announcement',
+    pleaseEnterRemarks: 'Please enter a note',
+    announcementTitleCannotBeEmpty: 'Title cannot be empty',
+    coverImageCannotBeEmpty: 'Cover picture cannot be empty',
+    announcementTypeCannotBeEmpty: 'Announcement type cannot be empty',
+    announcementContentCannotBeEmpty: 'Announcement content cannot be empty',
+    templateType: 'Template type',
+    templateParameters: 'Template Parameters',
+    isRead: 'Whether it has been read',
+    readingTime: 'Read time',
+    pleaseEnterUserId: 'Please enter the user number',
+    pleaseSelectUserType: 'Please select user type',
+    pleaseEnterTemplateCode: 'Please enter the template code',
+    pleaseSelectTemplateType: 'Please select template type',
+    markAsRead: 'Mark as read',
+    markAllAsRead: 'Read All',
+    sender: 'Sender',
+    messageContent: 'Message content',
+    read: 'Read',
+    messageDetails: 'Message details',
+    pleaseEnterTemplateName: 'Please enter a template name',
+    pleaseSelectEnableStatus: 'Please select the on state',
+    pleaseEnterSenderName: 'Please enter the sender name',
+    pleaseEnterTemplateContent: 'Please enter template content',
+    messageTypeCannotBeEmpty: 'Message type cannot be empty',
+    enableStatusCannotBeEmpty: 'Open status cannot be empty',
+    templateCodeCannotBeEmpty: 'Template code cannot be empty',
+    templateNameCannotBeEmpty: 'Template name cannot be empty',
+    senderNameCannotBeEmpty: 'Sender name cannot be empty',
+    templateContentCannotBeEmpty: 'Template content cannot be empty',
+    additionSuccessful: 'Add Success',
+    ModificationSuccessful: 'Modify Succeed',
+    recipientID: 'Recipient ID',
+    recipient: 'Recipient',
+    redirectableURIAddress: 'Redirectable URI Address',
+    pleaseEnterRedirectableURIAddress: 'Please enter a redirectable URI address.',
+    pleaseSelectRecipient: 'Please select the recipient',
+    userIdCannotBeEmpty: 'User ID cannot be empty',
+    submissionAndSendingWereSuccessfulTheSendingResultPleaseReferToTheSendingLogNumber:
+      'The commit was sent successfully! The result of the send, see the send log number:',
+    clientNumber: 'Client number',
+    clientSecretKey: 'Client key',
+    appName: 'Application name',
+    appIcon: 'Application icon',
+    appDescription: 'Application description',
+    validityPeriodOfAccessToken: 'Access Token Expiry Date',
+    validityPeriodOfRefreshToken: 'Refresh Token Validity Period',
+    authorizationType: 'Authorisation type',
+    authorizationScope: 'Authorisation range',
+    automaticAuthorizationScope: 'Automatic authorisation range',
+    redirectable: 'Redirectable',
+    permissions: 'Authorisation',
+    resources: 'Resources',
+    additionalInformation: 'Additional Information',
+    pleaseEnterClientNumber: 'Please enter a client number',
+    pleaseEnterClientSecretKey: 'Please enter the client key',
+    pleaseEnterAppName: 'Please enter the application name',
+    unitSeconds: 'Unit: seconds',
+    pleaseEnterAuthorizationType: 'Please enter the authorisation type',
+    pleaseEnterAuthorizationScope: 'Please enter the authorisation range',
+    pleaseEnterRedirectable: 'Please enter the redirectable',
+    pleaseEnterPermissions: 'Please enter the permissions',
+    pleaseEnterResources: 'Please enter resources',
+    pleaseEnterAdditionalInformationJSON: 'Please enter additional information, JSON format data.',
+    clientNumberCannotBeEmpty: 'Client number cannot be empty',
+    clientSecretKeyCannotBeEmpty: 'Client key cannot be null',
+    appNameCannotBeEmpty: 'Application name cannot be empty',
+    appIconCannotBeEmpty: 'Application icon cannot be null',
+    validityPeriodOfAccessTokenCannotBeEmpty: 'Access token expiration date cannot be null',
+    validityPeriodOfRefreshTokenCannotBeEmpty: 'The expiration date of the refresh token cannot be null.',
+    redirectableURIAddressCannotBeEmpty: 'Redirectable URI address cannot be null.',
+    authorizationTypeCannotBeEmpty: 'Authorisation type cannot be null',
+    whetherToForceTheUserToLogOut: 'Whether to force logout the user',
+    forceLogout: 'Force logout',
+    clientId: 'Client Number',
+    accessToken: 'Access Token',
+    refreshToken: 'Refresh Token',
+    expirationTime: 'Expiration Time',
+    pleaseEnterClientId: 'Please enter client number',
+    operator: 'Operator',
+    operationModule: 'Operation Module',
+    operationContent: 'Operation content',
+    operationTime: 'Operation Time',
+    businessNumber: 'Operation number',
+    operatorLogXls: 'Operator',
+    operationName: 'Operation Name',
+    IP: 'IP',
+    pleaseEnterOperator: 'Please input operator',
+    pleaseEnterOperationModule: 'Please input operation module',
+    pleaseEnterOperationName: 'Please input operation name',
+    pleaseEnterBusinessNumber: 'Please input operation number',
+    logPrimaryKey: 'Log key',
+    linkTracing: 'Link Trace',
+    operatorId: 'Operator number',
+    operatorName: 'Operator Name',
+    operatorIP: 'Operator IP',
+    operatorUA: 'Operator UA',
+    operationExtendedParameters: 'Operation Expansion Parameters',
+    requestURL: 'Request URL',
+    positionName: 'Job Name',
+    positionCode: 'Job Code',
+    positionNumber: 'Position number',
+    positionOrder: 'Position Order',
+    positionRemarks: 'Position Remarks',
+    pleaseEnterPositionName: 'Please enter the post name',
+    pleaseEnterPositionCode: 'Please enter the post code',
+    positionListXls: 'Position List.xls',
+    positionTitle: 'Position Title',
+    pleaseEnterPositionTitle: 'Please enter the post title',
+    pleaseEnterPositionOrder: 'Please input job order',
+    positionTitleCannotBeEmpty: 'Job title cannot be empty',
+    positionCodeCannotBeEmpty: 'Job Code cannot be empty',
+    positionStatusCannotBeEmpty: 'Job Status cannot be empty',
+    positionContentCannotBeEmpty: 'Job content cannot be empty',
+    roleName: 'Role Name',
+    roleIdentity: 'Role Identifier',
+    roleNumber: 'Role Number',
+    roleType: 'Role Type',
+    displayOrder: 'Display order',
+    pleaseEnterRoleName: 'Please enter role name',
+    pleaseEnterRoleIdentity: 'Please enter role identification',
+    menuPermissions: 'Menu Rights',
+    dataPermissions: 'Data permissions',
+    selectAllDeselectAll: 'Select all/unselect all.',
+    expandAllCollapseAll: 'Expand/Collapse All.',
+    permissionScope: 'Permission range',
+    pleaseEnterDisplayOrder: 'Please enter the display order',
+    roleNameCannotBeEmpty: 'Role name cannot be empty',
+    roleIdentityCannotBeEmpty: 'Role Identifier cannot be empty',
+    remarksCannotBeEmpty: 'Remarks cannot be empty',
+    roleListXls: 'Role List.xls',
+    parentChildLinkage: 'Parent-child linkage (select parent node, automatically select child node).',
+    loadingPleaseWaitAMoment: 'Loading, please wait',
+    pleaseSelectChannelCode: 'Please select channel code',
+    smsSignatureCannotBeEmpty: 'SMS Signature cannot be empty',
+    channelCodeCannotBeEmpty: 'Channel Code cannot be empty',
+    theAccountOfSmsAPICannotBeEmpty: 'The account number of SMS API cannot be empty',
+    theAccountOfSmsAPI: 'Account number of SMS API',
+    theSecretKeyOfSmsAPI: 'SMS API key',
+    smsSendingCallbackURL: 'SMS send callback URL',
+    pleaseEntertheAccountOfSmsAPI: 'Please enter the account number of the SMS API',
+    pleaseEntertheSecretKeyOfSmsAPI: 'Please enter the key of the SMS API',
+    pleaseEnterSmsSendingCallbackURL: 'Please enter the SMS send callback URL',
+    smsLogXls: 'SMS Log.xls',
+    smsSignature: 'SMS Signature',
+    channelCode: 'Channel Code',
+    sms: 'SMS',
+    smsSendingCallback: 'SMS Send Callback',
+    pleaseEnterSmsSignature: 'Please enter the SMS signature',
+    phoneNumber: 'Mobile phone number',
+    smsChannel: 'SMS Channel',
+    receivingStatus: 'Receive Status',
+    receivingTime: 'Receive Time',
+    smsContent: 'SMS Content',
+    templateNumberOfSmsAPI: 'Template number of the SMS API',
+    pleaseEnterTemplateNumberOfSmsAPI: 'Please enter the template number of the SMS API',
+    smsTemplateXls: 'SMS Template.xls',
+    smsType: 'SMS Type',
+    pleaseEnterPhoneNumber: 'Please enter your mobile phone number',
+    pleaseSelectSmsChannel: 'Please select the SMS channel',
+    pleaseEnterTemplateNumber: 'Please enter the template number',
+    pleaseSelectSendingStatus: 'Please select send status',
+    pleaseSelectReceivingStatus: 'Please select the receiving status',
+    smsTemplate: 'SMS Template',
+    templateNumberOfAPI: 'Template number of the API',
+    userInformation: 'User Information',
+    smsParameters: 'SMS Parameters',
+    APIsmsResult: 'API Send Result',
+    APIsmsNumber: 'API SMS Number',
+    APIrequestNumber: 'API Request Number',
+    APIreceivingStatus: 'API Receive Status',
+    APIreceivingResult: 'API Receive Result',
+    smsChannelNumber: 'SMS Channel Number',
+    smsAPITemplateNumber: 'SMS API Template Number',
+    pleaseSelectSmsChannelNumber: 'Please select the SMS channel number',
+    pleaseSelectSmsType: 'Please select the SMS type',
+    pleaseEnterSms: 'Please enter the SMS API template number',
+    pleaseEnterTheTemplateNumberOfTheSmsAPI: 'Please enter the SMS API template number',
+    phoneNumberCannotBeEmpty: 'Mobile phone cannot be empty',
+    smsTypeCannotBeEmpty: 'SMS Type cannot be empty',
+    theTemplateNumberOfTheSmsAPICannotBeEmpty: 'The template number of the SMS API cannot be empty',
+    smsChannelNumberCannotBeEmpty: 'The SMS channel number cannot be empty',
+    submitTips: 'The submission was successful! See the delivery log number for delivery results:',
+    pleaseSelectSocialPlatform: 'Please select social platform',
+    pleaseEnterClientNumberTips: 'Please enter the client number, which corresponds to the appKey of each platform.',
+    pleaseEnterClientSecretKeyTips: 'Please enter the client key, corresponding to the appSecret of each platform.',
+    authorizedPartyWebApplicationTips: "Authorised party's web application ID, fill in if you have one.",
+    socialPlatformCannotBeEmpty: 'Social platform cannot be empty',
+    userTypeCannotBeEmpty: 'User type cannot be empty',
+    socialOpenid: 'Social openid',
+    pleaseEnterSocialOpenid: 'Please enter the social openid',
+    social: 'Social',
+    updateTime: 'Update time',
+    socialPlatform: 'Social platform',
+    userAvatar: 'User avatar',
+    socialToken: 'Social Token',
+    originalTokenData: 'Raw Token Data',
+    originalUserData: 'Raw User data',
+    lastAuthenticationCode: 'Last authentication code',
+    lastAuthenticationState: 'Last authentication state',
+    tenantName: 'Tenant Name',
+    contactPerson: 'Contact person',
+    tenantStatus: 'Tenant state',
+    tenantId: 'Tenant number',
+    tenantPackage: 'Tenant package',
+    accountQuota: 'Account Limit',
+    boundDomainName: 'Bound Domain Name',
+    pleaseEnterTenantName: 'Please enter tenant name',
+    pleaseEnterContactPerson: 'Please input contact person',
+    pleaseEnterContactPhoneNumber: 'Please enter your mobile phone',
+    pleaseSelectTenantStatus: 'Please select tenant status',
+    systemTenant: 'System Tenant',
+    tenantListXls: 'Tenant List.xls',
+    tenantNameCannotBeEmpty: 'Tenant name cannot be empty',
+    tenantPackageCannotBeEmpty: 'Tenant Package cannot be empty',
+    contactPersonCannotBeEmpty: 'Contact person cannot be empty',
+    tenantStatusCannotBeEmpty: 'Tenant Status cannot be empty',
+    accountQuotaCannotBeEmpty: 'Account Limit cannot be empty',
+    expirationTimeCannotBeEmpty: 'Expired time cannot be empty',
+    boundDomainNameCannotBeEmpty: 'Bound domain name cannot be empty',
+    userNameCannotBeEmpty: 'User name cannot be empty',
+    userPasswordCannotBeEmpty: 'User password cannot be empty',
+    userPassword: 'User password',
+    pleaseSelectTenantPackage: 'Please select tenant package',
+    loadingPleaseWaitAWhile: 'Loading, please wait',
+    packageNameCannotBeEmpty: 'Package name cannot be empty',
+    associatedMenuNumberCannotBeEmpty: 'Associated menu number cannot be empty',
+    pleaseEnterUserPassword: 'Please enter your password',
+    pleaseEnterAccountQuota: 'Please enter the account limit',
+    pleaseSelectExpirationTime: 'Please select the expiry time',
+    pleaseEnterBoundDomainName: 'Please enter the binding domain name',
+    packageName: 'Package Name',
+    packageNumber: 'Package Number',
+    pleaseEnterPackageName: 'Please enter the package name',
+    menuPermission: 'Menu Permission',
+    department: 'Department',
+    userStatus: 'User Status',
+    userDataXls: 'User Data.xls',
+    assignRole: 'Assign Roles',
+    role: 'Role',
+    pleaseSelectRole: 'Please select a role',
+    affiliatedDepartment: 'Department',
+    userGender: 'User Gender',
+    position: 'Position',
+    pleaseSelectAffiliatedDepartment: 'Please select the department',
+    pleaseEnterEmail: 'Please enter your email address',
+    userNicknameCannotBeEmpty: 'Nickname cannot be empty',
+    pleaseEnterTheCorrectPhoneNumber: 'Please enter the correct mobile phone number',
+    modificationSucceededTheNewPasswordIs: 'Modified successfully, the new password is:',
+    userImport: 'User import',
+    dragTheFileHereOr: 'Drag the file here, or',
+    clickToUpload: 'Click Upload',
+    whetherToUpdateExistingUserData: 'Whether to update existing user data',
+    onlyFilesInXlsAndXlsxFormatsAreAllowedForImport: 'Only xls, xlsx format files are allowed to be imported.',
+    downloadTemplate: 'Download template',
+    uploadFailedPleaseUploadAgain: 'The upload failed, please re-upload!',
+    atMostOnlyOneFileCanBeUploaded: 'Only a maximum of one file can be uploaded!',
+    userImportTemplateXls: 'User import template.xls',
+    numberOfSuccessfulUploads: 'Number of successful uploads:',
+    numberOfFailedUploads: 'Number of successful uploads:',
+    numberOfFailedUpdates: 'Update Failed Quantity:',
+    pleaseUploadTheFile: 'Please upload a file'
+  },
+  public: {
+    all: 'All',
+    sort: 'Sort',
+    operate: 'Operation',
+    status: 'Status',
+    startDate: 'Start Date',
+    endDate: 'End Date',
+    delete: 'Delete',
+    createTime: 'Created',
+    update: 'Modified',
+    none: 'None',
+    close: 'Close',
+    normal: 'Normal',
+    addTime: 'Add Time',
+    no: 'No',
+    yes: 'Yes',
+    more: 'More',
+    startTime: 'Start time',
+    endTime: 'End time',
+    up: 'Up',
+    down: 'Down',
+    enable: 'Enable',
+    disable: 'Disable',
+    remark: 'Remarks',
+    pleaseEnterNotes: 'Please enter a comment',
+    expand: 'Expand',
+    collapse: 'Collapse',
+    scord: 'Seconds'
+  },
+  'OAuth 2.0': 'OAuth 2.0' // 避免菜单名是 OAuth 2.0 时,一直 warn 报错
 }

+ 1845 - 22
src/locales/zh-CN.ts

@@ -142,7 +142,16 @@ export default {
     btnQRCode: '二维码登录',
     qrcode: '扫描二维码登录',
     btnRegister: '注册',
-    SmsSendMsg: '验证码已发送'
+    SmsSendMsg: '验证码已发送',
+    loadingSystem: '正在加载系统中...',
+    YSHOPSourceCode: 'YSHOP源码',
+    retrievableAfterSeconds: '秒后可重新获取',
+    thisThirdPartyApplicationRequestsTheFollowingPermissions: '此第三方应用请求获得以下权限',
+    agreeToAuthorization: '同意授权',
+    authorizationIn: '授 权 中...',
+    rejection: '拒绝',
+    accessYourPersonalInformation: '访问你的个人信息',
+    modifyYourPersonalInformation: '修改你的个人信息'
   },
   captcha: {
     verification: '请完成安全验证',
@@ -395,10 +404,8 @@ export default {
       rememberMe: '记住我',
       forgetPassword: '忘记密码?',
       otherSignIn: '其他登录方式',
-      // notify
       loginSuccessTitle: '登录成功',
       loginSuccessDesc: '欢迎回来',
-      // placeholder
       accountPlaceholder: '请输入账号',
       passwordPlaceholder: '请输入密码',
       smsPlaceholder: '请输入验证码',
@@ -450,7 +457,15 @@ export default {
       cfPwdMsg: '请输入确认密码',
       pwdRules: '长度在 6 到 20 个字符',
       diffPwd: '两次输入密码不一致'
-    }
+    },
+    serialNumber: '序号',
+    socialPlatform: '社交平台',
+    bound: '已绑定',
+    unbound: '未绑定',
+    unbound1: '(解绑)',
+    bound1: '(绑定)',
+    boundSuccessfully: '绑定成功',
+    unboundSuccessfully: '解绑成功'
   },
   cropper: {
     selectImage: '选择图片',
@@ -466,24 +481,6 @@ export default {
     btn_zoom_out: '缩小',
     preview: '预览'
   },
-  index: {
-    totalMembers: '会员总数',
-    allStores: '全门店',
-    todayOrderCount: '今日订单数',
-    orders: '单',
-    totalOrderCount: '订单总数',
-    yesterdaysOrderCount: '昨日订单数',
-    totalAmount: '总金额',
-    last7DaysOrderCount: '近七天订单数',
-    totalProductCount: '商品总数',
-    thisMonthOrderCount: '本月订单数',
-    productSalesRanking: '商品销售排行',
-    userSpendingRankingAllStores: '用户消费排行(全门店)',
-    currentStore: '当前门店',
-    productName: '商品名称',
-    salesVolume: '销量',
-    consumptionAmount: '消费金额'
-  },
   work: {
     selectStore: '选择门店',
     orderReminderOn: '订单提醒开启中',
@@ -504,5 +501,1831 @@ export default {
     newOrderNotification: '新订单通知',
     youHaveNewOrderPleaseCheckOut: '你有个新的订单哦,请注意查看!'
   },
+  home: {
+    totalMembers: '会员总数',
+    allStores: '全门店',
+    todayOrderCount: '今日订单数',
+    orders: '单',
+    totalOrderCount: '订单总数',
+    yesterdaysOrderCount: '昨日订单数',
+    totalAmount: '总金额',
+    last7DaysOrderCount: '近七天订单数',
+    totalProductCount: '商品总数',
+    thisMonthOrderCount: '本月订单数',
+    productSalesRanking: '商品销售排行',
+    userSpendingRankingAllStores: '用户消费排行(全门店)',
+    currentStore: '当前门店',
+    productName: '商品名称',
+    salesVolume: '销量',
+    consumptionAmount: '消费金额',
+    productManagement: '商品管理',
+    memberManagement: '会员管理',
+    orderManagement: '订单管理',
+    couponManagement: '优惠券管理',
+    printerManagement: '打印机管理',
+    storeManagement: '门店管理',
+    paymentManagement: '支付管理',
+    messageManagement: '消息管理'
+  },
+  product: {
+    cost: '成本价',
+    barCode: '商品编号',
+    weight: '重量(KG)',
+    volume: '体积(m³)',
+    productName: '商品名称',
+    enterProductName: '请输入商品名称',
+    shopName: '店铺名称',
+    enterShopName: '请输入店铺名称',
+    productImage: '商品图片',
+    productPrice: '商品价格',
+    sales: '销量',
+    stock: '库存',
+    status: '状态',
+    onSale: '已上架',
+    offSale: '已下架',
+    addTime: '添加时间',
+    actions: '操作',
+    edit: '编辑',
+    delete: '删除',
+    onSaleProducts: '出售中产品',
+    pendingProducts: '待上架产品',
+    soldOutProducts: '已售罄产品',
+    confirmSale: '确定要上下架?',
+    operationSuccess: '操作成功',
+    displayShop: '展示店铺',
+    productCategory: '商品分类',
+    keyword: '关键字',
+    unitName: '单位名',
+    marketPrice: '市场价',
+    coverImage: '封面图',
+    sliderImage: '轮播图',
+    productStatus: '商品状态',
+    productDescription: '商品简介',
+    productSpec: '商品规格',
+    singleSpec: '单规格',
+    multipleSpec: '多规格',
+    selectSpec: '选择规格',
+    productAttributes: '商品属性',
+    productDetails: '商品详情',
+    marketingSettings: '营销设置',
+    getPoints: '获得积分',
+    basicInfo: '基本信息',
+    specSettings: '规格设置',
+    logisticsSettings: '物流设置',
+    freightSettings: '运费设置',
+    postage: '邮费',
+    freightTemplate: '运费模板',
+    newProduct: '是否新品',
+    yes: '是',
+    no: '否'
+  },
+  express: {
+    courierCompanyNumber: '快递公司编号',
+    pleaseEnterTheCourierCompanyNumber: '请输入快递公司编号',
+    fullNameOfCourierCompany: '快递公司全称',
+    pleaseEnterTheFullNameOfCourierCompany: '请输入快递公司全称',
+    sort: '排序',
+    pleaseEnterTheSort: '请输入排序',
+    theAbbreviationCourierCompanyEmpty: '快递公司简称不能为空',
+    fullNameCourierCompanyEmpty: '快递公司全称不能为空',
+    sortCannotEmpty: '排序不能为空',
+    pleaseEnterTheCourierBirdAppId: '请输入快递鸟appId',
+    pleaseEnterTheCourierBirdAppKey: '请输入快递鸟appKey',
+    isPaidPackage: '是否收费套餐',
+    theThirdPartyTips: 'yshop-pro系统使用的第三方快递鸟api实现了快递查询,注册地址请点击,',
+    iRegister: '我注册!',
+    courierBirdAppIdCannotBeEmpty: '快递鸟appId不能为空',
+    courierBirdAppKeyCannotBeEmpty: '快递鸟appKey不能为空',
+    ompanyCode: '公司编码',
+    pleaseEnterTheCourierCompanyCode: '请输入快递公司编码',
+    companyFullName: '公司全称',
+    pleaseEnterTheCourierCompanyFullName: '请输入快递公司全称',
+    courierCompanyCode: '快递公司编码',
+    courierCompanyFullName: '快递公司全称',
+    addTime: '添加时间',
+    courierCompanyXls: '快递公司.xls'
+  },
+  infra: {
+    logPrimaryKey: '日志主键',
+    linkTrace: '链路追踪',
+    applicationName: '应用名',
+    userInformation: '用户信息',
+    userIp: '用户 IP',
+    userUa: '用户 UA',
+    requestInformation: '请求信息',
+    requestParameters: '请求参数',
+    requestResult: '请求结果',
+    requestTime: '请求时间',
+    requestTimeConsumption: '请求耗时',
+    operationResult: '操作结果',
+    normal: '正常',
+    failed: '失败',
+    operationModule: '操作模块',
+    operationName: '操作名',
+    userId: '用户编号',
+    pleaseEnterTheUserNumber: '请输入用户编号',
+    userType: '用户类型',
+    pleaseSelectUserType: '请选择用户类型',
+    pleaseEnterTheApplicationName: '请输入应用名',
+    pleaseEnterTheExecutionTime: '请输入执行时长',
+    resultCode: '结果码',
+    pleaseEnterTheResultCode: '请输入结果码',
+    logNumber: '日志编号',
+    requestMethod: '请求方法',
+    requestAddress: '请求地址',
+    successful: '成功',
+    failure: '失败',
+    operationType: '操作类型',
+    detailed: '详细',
+    operate: '操作',
+    aPIAccessLogs_xls: 'API 访问日志.xls',
+    exceptionTime: '异常时间',
+    exceptionName: '异常名',
+    exceptionStack: '异常堆栈',
+    handlingStatus: '处理状态',
+    handler: '处理人',
+    handlingTime: '处理时间',
+    pleaseSelectTheProcessingStatus: '请选择处理状态',
+    timeOfException: '异常发生时间',
+    handled: '已处理',
+    ignored: '已忽略',
+    confirmationFlaggedAs: '确认标记为',
+    exceptionLogXls: '异常日志.xls',
+    generateJSON: '生成 JSON',
+    generateOptions: '生成 Options',
+    generateComponents: '生成组件',
+    numberOfExecutions: '第几次执行',
+    executionTime: '执行时间',
+    executionDuration: '执行时长',
+    executionResult: '执行结果',
+    successfulExecution: '执行成功',
+    confirmThatYouWantToExecuteOnceImmediately: '确认要立即执行一次',
+    open: '开启',
+    close: '关闭',
+    pause: '暂停',
+    confirmTo: '确认要',
+    timingTaskNumber: '定时任务编号为',
+    ofTheDataItem: '的数据项',
+    timedTaskExecutionLogXls: '定时任务执行日志.xls',
+    firstExecution: '第几次执行',
+    startExecutionTime: '开始执行时间',
+    endExecutionTime: '结束执行时间',
+    selectTheStartExecutionTime: '选择开始执行时间',
+    selectTheEndExecutionTime: '选择结束执行时间',
+    executeOnce: '执行一次',
+    taskDetails: '任务详细',
+    schedulingLog: '调度日志',
+    modify: '修改',
+    taskNumber: '任务编号',
+    taskName: '任务名称',
+    taskStatus: '任务状态',
+    processorName: '处理器的名字',
+    parametersOfTheProcessor: '处理器的参数',
+    executionLog: '执行日志',
+    pleaseEnterTheNameOfTheProcessor: '请输入处理器的名字',
+    pleaseSelectTheTaskStatus: '请选择任务状态',
+    pleaseEnterTheTaskName: '请输入任务名称',
+    milliseconds: '毫秒',
+    notOpened: '未开启',
+    cron: 'Cron 表达式',
+    numberOfRetries: '重试次数',
+    retryInterval: '重试间隔',
+    monitorTimeout: '监控超时时间',
+    subsequentExecutionTime: '后续执行时间',
+    pleaseEnterATaskName: '请输入任务名称',
+    pleaseEnterTheParametersOfTheProcessor: '请输入处理器的参数',
+    pleaseEnterTheNumberOfRetriesWhenSetTo0NoRetriesArePerformed: '请输入重试次数。设置为 0 时,不进行重试',
+    pleaseEnterTheRetryIntervalInMillisecondsWhenSetTo0NoIntervalIsRequired: '请输入重试间隔,单位:毫秒。设置为 0 时,无需间隔',
+    pleaseEnterTheMonitoringTimeoutInMilliseconds: '请输入监控超时时间,单位:毫秒',
+    cronExpression: 'CRON 表达式',
+    taskNameCannotBeNull: '任务名称不能为空',
+    processorNameCannotBeNull: '处理器的名字不能为空',
+    cronExpressionCannotBeNull: 'CRON 表达式不能为空',
+    retryCountCannotBeNull: '重试次数不能为空',
+    retryIntervalCannotBeNull: '重试间隔不能为空',
+    basicInformation: '基本信息',
+    modeOfOperation: '运行模式',
+    standalone: '单机',
+    cluster: '集群',
+    redisVersion: 'Redis版本 :',
+    runtimeMode: '运行模式 :',
+    ports: '端口 :',
+    numberOfClients: '客户端数 :',
+    runtimeDays: '运行时间(天) :',
+    memoryUsed: '使用内存 :',
+    cpuUsed: '使用CPU :',
+    memoryConfiguration: '内存配置 :',
+    whetherAOFIsEnabledOrNot: 'AOF是否开启 :',
+    whetherRDBSuccessfulOrNot: 'RDB是否成功 :',
+    numberOfKeys: 'Key数量 :',
+    networkIngressEgress: '网络入口/出口 :',
+    memoryUsage: '内存使用情况',
+    peak: '峰值',
+    commandStatistics: '命令统计',
+    commands: '命令',
+    memoryConsumption: '内存消耗',
+    anExceptionOccurredInProcessingTheMessage: '处理消息发生异常:',
+    messageNotProcessed: '未处理消息:',
+    systemNotification: '【系统通知】:',
+    groupSendingUserNumber: '【群发】用户编号',
+    groupNoticUserCode: '【群发】用户编号',
+    unknownMessageType: '未知的消息类型:',
+    messageReceived: '收到消息',
+    messageRecord: '消息记录',
+    sent: '发送',
+    allPeople: '所有人',
+    pleaseSelectSender: '请选择发送人',
+    closeConnection: '关闭连接',
+    openConnection: '开启连接',
+    serviceAddress: '服务地址',
+    connectionStatus: '连接状态',
+    connection: '连接',
+    messageInputBox: '消息输入框',
+    pleaseEnterMessageSend: '请输入你要发送的消息',
+    theTestPassedAndTheFileWasUploadedSuccessfullyAccessAddress: '测试通过,上传文件成功!访问地址:',
+    isItConfirmedToModifyTheConfigurationNumberOfTheDataItemIsTheMainConfiguration: '是否确认修改配置编号为',
+    theDataItemsInTheMainConfigurationOfThe: '的数据项为主配置?',
+    test: '测试',
+    masterConfiguration: '主配置',
+    no: '编号',
+    remarks: '备注',
+    configurationName: '配置名',
+    memory: '存储器',
+    pleaseEnterTheConfigurationName: '请输入配置名',
+    pleaseSelectMemory: '请选择存储器',
+    configurationNameCannotBeEmpty: '配置名不能为空',
+    memoryCannotBeEmpty: '存储器不能为空',
+    basePathCannotBeEmpty: '基础路径不能为空',
+    hostAddressCannotBeEmpty: '主机地址不能为空',
+    hostPortCannotBeEmpty: '主机端口不能为空',
+    userNameCannotBeEmpty: '用户名不能为空',
+    passwordCannotBeEmpty: '密码不能为空',
+    connectionModeCannotBeEmpty: '连接模式不能为空',
+    nodeAddressCannotBeEmpty: '节点地址不能为空',
+    storageBucketCannotBeEmpty: '存储 bucket 不能为空',
+    accessKeyCannotBeEmpty: 'accessKey 不能为空',
+    accessSecretCannotBeNull: 'accessSecret 不能为空',
+    storage: '存储',
+    customizedDomainNameCannotBeEmpty: '自定义域名不能为空',
+    basePath: '基础路径',
+    hostAddress: '主机地址',
+    hostPort: '主机端口',
+    userName: '用户名',
+    password: '密码',
+    connectionMode: '连接模式',
+    nodeAddress: '节点地址',
+    storageBucket: '存储 bucket',
+    customizedDomainName: '自定义域名',
+    pleaseEnterAConfigurationName: '请输入配置名',
+    pleaseEnterNotes: '请输入备注',
+    pleaseSelectStorage: '请选择存储器',
+    pleaseEnterTheBasePath: '请输入基础路径',
+    pleaseEnterTheHostAddress: '请输入主机地址',
+    pleaseEnterTheHostPort: '请输入主机端口',
+    pleaseEnterAPassword: '请输入密码',
+    pleaseEnterTheNodeAddress: '请输入节点地址',
+    pleaseEnterBucket: '请输入 bucket',
+    pleaseEnterACustomizedDomainName: '请输入自定义域名',
+    pleaseEnterACustomDomainName: '请输入自定义域名',
+    activeMode: '主动模式',
+    passiveMode: '被动模式',
+    pleaseEnterAccessKey: '请输入 accessKey',
+    pleaseEnterAccessSecret: '请输入 accessSecret',
+    pleaseEnterTheFilePath: '请输入文件路径',
+    pleaseEnterTheFileType: '请输入文件类型',
+    fileName: '文件名',
+    filePath: '文件路径',
+    fileSize: '文件大小',
+    fileType: '文件类型',
+    fileContent: '文件内容',
+    preview: '预览',
+    download: '下载',
+    uploadTime: '上传时间',
+    uploadFile: '上传文件',
+    dragTheFileHereOr: '将文件拖到此处,或',
+    clickUpload: '点击上传',
+    tipOnlyJpgPngGifFormatsAreAllowedToBeImported: '提示:仅允许导入 jpg、png、gif 格式文件!',
+    pleaseUploadTheFile: '请上传文件',
+    uploadFailedPleaseReUpload: '上传失败,请您重新上传!',
+    youCanOnlyUploadAMaximumOfOneFile: '最多只能上传一个文件!',
+    dataSourceName: '数据源名称',
+    dataSourceConnection: '数据源连接',
+    pleaseEnterAParameterName: '请输入参数名称',
+    pleaseEnterTheDataSourceConnection: '请输入数据源连接',
+    pleaseEnterAUserName: '请输入用户名',
+    dataSourceNameCannotBeEmpty: '数据源名称不能为空',
+    dataSourceConnectionCannotBeEmpty: '数据源连接不能为空',
+    primaryKeyNumber: '主键编号',
+    parameterConfigurationXls: '参数配置.xls',
+    parameterPrimaryKey: '参数主键',
+    parameterCategory: '参数分类',
+    parameterKeyName: '参数键名',
+    parameterKeyValue: '参数键值',
+    visibleOrNot: '是否可见',
+    parameterName: '参数名称',
+    builtInSystem: '系统内置',
+    pleaseEnterTheParameterName: '请输入参数名称',
+    pleaseEnterTheParameterKeyName: '请输入参数键名',
+    pleaseSelectSystemBuiltIn: '请选择系统内置',
+    pleaseEnterAParameterCategory: '请输入参数分类',
+    pleaseInputParameterName: '请输入参数名称',
+    pleaseInputParameterKeyName: '请输入参数键名',
+    pleaseEnterTheParameterKeyValue: '请输入参数键值',
+    pleaseEnterTheContent: '请输入内容',
+    parameterCategoryCannotBeEmpty: '参数分类不能为空',
+    parameterNameCannotBeEmpty: '参数名称不能为空',
+    parameterKeyNameCannotBeNull: '参数键名不能为空',
+    parameterKeyValueCannotBeNull: '参数键值不能为空',
+    visibleOrInvisibleCannotBeNull: '是否可见不能为空',
+    tableName: '表名称',
+    tableDescription: '表描述',
+    pleaseEnterAWarehouseName: '请输入仓库名称',
+    pleaseEnter: '请输入',
+    entityClassName: '实体类名称',
+    infraTips: '默认去除表名的前缀。如果存在重复,则需要手动添加前缀,避免 MyBatis 报 Alias 重复的问题。',
+    author: '作者',
+    fieldColumnName: '字段列名',
+    fieldDescription: '字段描述',
+    physicalType: '物理类型',
+    javaType: 'Java类型',
+    javaAttributes: 'java属性',
+    insert: '插入',
+    edit: '编辑',
+    list: '列表',
+    query: '查询',
+    queryMethod: '查询方式',
+    allowNull: '允许空',
+    displayType: '显示类型',
+    textBox: '文本框',
+    textField: '文本域',
+    dropdownBox: '下拉框',
+    radioBox: '单选框',
+    checkbox: '复选框',
+    dateControl: '日期控件',
+    imageUpload: '图片上传',
+    fileUpload: '文件上传',
+    richTextControls: '富文本控件',
+    dictionaryTypes: '字典类型',
+    examples: '示例',
+    generatedTemplates: '生成模板',
+    frontEndTypes: '前端类型',
+    generatedScenarios: '生成场景',
+    parentMenu: '上级菜单',
+    assignToASpecificMenuEgSystemManagement: '分配到指定菜单下,例如 系统管理',
+    pleaseSelectTheSystemMenu: '请选择系统菜单',
+    moduleName: '模块名',
+    moduleNameIeFirstLevelDirectoryEgSystemInfraToolEtc: '模块名,即一级目录,例如 system、infra、tool 等等',
+    businessName: '业务名',
+    businessNameIeSecondLevelDirectoryEgUserPermissionDictEtc: '业务名,即二级目录,例如 user、permission、dict 等等',
+    className: '类名称',
+    classNameInitialCapitalizedEgSysUserSysMenuSysDictDataEtc: '类名称(首字母大写),例如SysUser、SysMenu、SysDictData 等等',
+    classDescription: '类描述',
+    usedAsAClassDescriptionEgUser: '用作类描述,例如 用户',
+    customPath: '自定义路径',
+    fillInTheAbsolutePathToTheDiskIfNotItWillBeGeneratedUnderTheCurrentWebProject: '填写磁盘绝对路径,若不填写,则生成到当前Web项目下',
+    quickSelectionOfTheNearestPath: '最近路径快速选择',
+    restoreTheDefaultGeneratedBasePath: '恢复默认的生成基础路径',
+    treeTableInformation: '树表信息',
+    parentNumberField: '父编号字段',
+    theNameOfTheParentCodeFieldOfTheTreeDisplaySuchAsParentId: '树显示的父编码字段名, 如:parent_Id',
+    treeNameField: '树名称字段',
+    nameOfTheDisplayNameFieldOfTheTreeNodeEgDeptName: '树节点的显示名称字段名, 如:dept_name',
+    masterTableInformation: '主表信息',
+    associatedMasterTable: '关联的主表',
+    theNameOfTheAssociatedMasterParentTableEgSystemUser: '关联主表(父表)的表名, 如:system_user',
+    fieldsAssociatedWithChildTables: '子表关联的字段',
+    fieldsAssociatedWithTheChildTableSuchAsUserId: '子表关联的字段, 如:user_id',
+    relationship: '关联关系',
+    theRelationshipBetweenTheMasterTableAndTheChildTable: '主表与子表的关联关系',
+    oneToMany: '一对多',
+    oneToOne: '一对一',
+    fieldInformation: '字段信息',
+    generatedInformation: '生成信息',
+    importTable: '导入表',
+    importSuccessful: '导入成功',
+    dataSource: '数据源',
+    pleaseSelectADataSource: '请选择数据源',
+    pleaseEnterATableName: '请输入表名称',
+    pleaseEnterATableDescription: '请输入表描述',
+    generateCode: '生成代码',
+    entity: '实体',
+    updateTime: '更新时间',
+    areYouSureYouWantToForceSynchronizationOfTableStructure: '确认要强制同步',
+    tableStructure: '表结构吗?',
+    synchronizationSuccessful: '同步成功',
+    codePreview: '代码预览',
+    generateFileInDirectory: '生成文件目录中...',
+    loadingCode: '加载代码中...'
+  },
+  mall: {
+    orderNumber: '取单号',
+    totalOrderPrice: '订单总价',
+    specification: '规格',
+    orderPickup: '取单',
+    numberOfDiners: '就餐人数',
+    pleaseEnterTheNumberOfPeople: '请输入人数',
+    totalAmount: '总金额',
+    goToOrder: '去下单',
+    noProducts: '暂无商品...',
+    tableTop: '桌台',
+    pleaseSelectTheSpecification: '请选择规格!',
+    pleaseSelectTheStore: '请选择门店!',
+    quantityCannotBeLessThan1: '数量不能小于1哦',
+    noProductsListed: '暂无商品挂单',
+    pleaseAddTheProductFirst: '请先加入商品!',
+    theNumberOfDinersMustBeGreaterThan0: '就餐人数必须大于0!',
+    pleaseEnterTheProductKeywordProductName: '请输入商品关键字:商品名称',
+    checkProducts: '查询商品',
+    cashier: '收银员',
+    noItemsAvailableAtThisTime: '暂无结算商品',
+    totalNumberOfItems: '总件数',
+    pendingOrders: '挂单',
+    selectProductSpecification: '选择商品规格',
+    pleaseAddAStoreOrSelectAStore: '请添加门店或者选择门店',
+    pleaseUseTheScannerBoxOrScannerGunToScanTheMemberPaymentCode: '请使用扫码盒子或者扫描枪,扫描会员付款码!',
+    scanTheCodeAndPrintTheTicket: '扫码完成并打印小票',
+    successfulPayment: '支付成功',
+    printTicket: '打印小票',
+    settleMattersAdding: '加入结算',
+    settleMattersSubmit: '提交结算',
+    pleaseChooseThePaymentMethod: '请选择支付方式',
+    cash: '现金支付',
+    balancePayment: '余额支付',
+    weChatPayment: '微信支付',
+    alipayPayment: '支付宝支付',
+    settlementInformation: '结算信息',
+    remarkInformation: '备注信息',
+    pleaseEnterNoteInformation: '请输入备注信息',
+    discountDiscount: '折扣:(折)',
+    pleaseEnterDiscount: '请输入折扣',
+    reduction$: '立减:(元)',
+    pleaseEnterTheDiscountAmount: '请输入立减金额',
+    discountAmount: '优惠金额',
+    amountDue: '应付金额',
+    name: '名称',
+    cellPhoneNumber: '手机号',
+    availableBalance: '可用余额',
+    availablePoints: '可用积分',
+    confirmReceipt: '确定收款',
+    memberInformation: '会员信息',
+    unbound: '未绑定',
+    _$: '(元)',
+    storeName: '店铺名称',
+    couponName: '优惠券名称',
+    spendHowMuchAvailable: '消费多少可用',
+    couponAmount: '优惠券金额',
+    availableType: '可用类型',
+    pickup: '自取',
+    takeOut: '外卖',
+    generalPurpose: '通用',
+    used: '已使用',
+    unused: '未使用',
+    userNickname: '用户昵称',
+    usedNot: '是否使用',
+    pickupTime: '领取时间',
+    showStores: '展示店铺',
+    selectStore: '选择店铺',
+    redeemCode: '兑换码',
+    picture: '图片',
+    howMuchToSpend: '消费多少可用',
+    startTime: '开始时间',
+    closingTime: '结束时间',
+    numberOfIssues: '发行数量',
+    pointsRequired: '所需积分',
+    limit: '限领数量',
+    instructionsForUse: '使用说明',
+    whetherItIsOnTheShelfOrNot: '是否上架',
+    pleaseEnterTheRedemptionCode: '请输入兑换码',
+    pleaseEnterTheNameOfTheCoupon: '请输入优惠券名称',
+    pleaseEnterTheAmountOfMoneySpent: '请输入消费多少可用',
+    pleaseEnterTheAmountOfTheCoupon: '请输入优惠券金额',
+    selectStartTime: '选择开始时间',
+    selectTheEndTime: '选择结束时间',
+    pleaseEnterTheNumberOfIssues: '请输入发行数量',
+    pleaseEnterTheNumberOfPointsRequired: '请输入所需积分',
+    pleaseEnterTheQuantityLimit: '请输入限领数量',
+    pleaseEnterTheInstructionsForUse: '请输入使用说明',
+    storeId0MeansGenericCantBeEmpty: '店铺id,0表示通用不能为空',
+    couponNameCannotBeEmpty: '优惠券名称不能为空',
+    consumptionOfHowMuchIsAvailableCanNotBeEmpty: '消费多少可用不能为空',
+    couponAmountCannotBeEmpty: '优惠券金额不能为空',
+    startTimeCannotBeEmpty: '开始时间不能为空',
+    endTimeCannotBeEmpty: '结束时间不能为空',
+    availableTypeCannotBeEmpty: '可用类型不能为空',
+    theNumberOfCouponsIssuedCannotBeEmpty: '发行数量不能为空',
+    limitOnNumberOfCouponsCannotBeEmpty: '限领数量不能为空',
+    descriptionOfUseCannotBeEmpty: '使用说明不能为空',
+    availableStores: '可用店铺',
+    whetherTheCouponIsOnTheShelfOrNot: '是否上架',
+    howMuchDoYouWantToSpend: '消费多少可用',
+    redemptionCode: '兑换码',
+    received: '已领',
+    endTime: '结束时间',
+    pleaseEnterAStoreName: '请输入店铺名称',
+    pleaseEnterTheCouponName: '请输入优惠券名称',
+    collectionRecord: '领取记录',
+    couponXls: '优惠券.xls',
+    tableNumber: '桌号',
+    id: 'id',
+    classification: '桌号分类',
+    tableName: '桌号名称',
+    numberOfOrders: '下单数',
+    consumptionAmount: '消费金额',
+    lastOrderTime: '上次下单时间',
+    pleaseEnterStoreName: '请输入店铺名称',
+    pleaseEnterTheNumber: '请输入编号',
+    batchAdd: '批量新增',
+    batchDownloadOrderCode: '批量下载点餐码',
+    import: '导入',
+    downloadAndImportTemplate: '下载导入模板',
+    qrCode: '二维码',
+    relatedOrders: '相关订单',
+    storesTableNumberXls: '门店 - 桌号.xls',
+    batchImportTableNumberTemplateXls: '批量导入桌号模板.xls',
+    smallProgramQrCodeCanOnlyDownloadTheOfficialOh: '小程序二维码只能下载正式的哦',
+    allOrders: '全部订单',
+    orderStatus: '订单状态',
+    all: '全部',
+    unpaid: '未支付',
+    inProgress: '制作中',
+    toBeReceived: '待收货',
+    receivedPickedUp: '已收货/已取餐',
+    refundOrder: '退款单',
+    deleted: '已删除',
+    alipay: '支付宝支付',
+    cashPayment: '现金支付',
+    userName: '用户姓名',
+    phoneNumber: '用户电话',
+    pleaseEnterTheOrderNumber: '请输入订单号',
+    pleaseEnterYourName: '请输入用户姓名',
+    pleaseEnterYourPhoneNumber: '请输入用户电话',
+    store: '门店',
+    userIdNickname: '用户id|昵称',
+    userNamePhoneNumber: '用户姓名|电话',
+    productInformation: '商品信息',
+    actualPayment: '实际支付',
+    paymentMethod: '支付方式',
+    purchaseType: '购买类型',
+    paymentTime: '支付时间',
+    notShipped: '未发货',
+    paymentConfirmed: '确认付款',
+    orderDetails: '订单详情',
+    modifyToPaymentStatus: '修改为支付状态',
+    dineIn: '堂食',
+    order: '出单',
+    selectTableCategory: '选择桌面分类',
+    tabletopPicture: '桌面图片',
+    remarks: '备注',
+    desktopPicture: '桌面图片',
+    pleaseEnterTableName: '请输入桌位名称',
+    pleaseEnterTableNumber: '请输入桌号',
+    storeCannotBeEmpty: '门店不能为空',
+    tableNumberCannotBeEmpty: '桌号不能为空',
+    tableNameCannotBeEmpty: '桌位名称不能为空',
+    status1Enabled2DisabledCannotBeEmpty: '状态:1=启用,2=禁用不能为空',
+    tableNumberPrefix: '桌号前缀',
+    tableNumberRange: '桌号范围',
+    remark: '备注',
+    tableNumberPrefixCannotBeEmpty: '桌号前缀不能为空',
+    tableNumberStartCannotBeEmpty: '桌号开始不能为空',
+    tableNumberEndCannotBeEmpty: '桌号结束不能为空',
+    status1EqualsEnable2EqualsDisableCannotBeEmpty: '状态:1=启用,2=禁用不能为空',
+    likeY: '比如:Y',
+    miniProgramVersion: '小程序版本',
+    miniProgramQrCode: '小程序二维码',
+    h5QrCode: 'H5二维码',
+    miniProgramNotConfigured: '小程序未配置',
+    statusOneEqualsEnableTwoEqualsDisableCannotBeEmpty: '状态:1=启用,2=禁用不能为空',
+    releaseVersion: '正式版',
+    experienceVersion: '体验版',
+    developmentVersion: '开发版',
+    miniProgramQrCodeCanOnlyBeDownloadedForReleaseVersion: '小程序二维码只能下载正式的哦',
+    dragFileHereOr: '将文件拖到此处,或',
+    clickToUpload: '点击上传',
+    onlyAllowImportXlsXlsxFiles: '仅允许导入 xls、xlsx 格式文件。',
+    downloadTemplate: '下载模板',
+    pleaseUploadFile: '请上传文件',
+    uploadSuccessCount: '上传成功数量:',
+    updateSuccessCount: '更新成功数量:',
+    updateFailureCount: '更新失败数量:',
+    uploadFailedPleaseReupload: '上传失败,请您重新上传!',
+    maxOneFileCanBeUploaded: '最多只能上传一个文件!',
+    categoryName: '分类名称',
+    pleaseEnterCategoryName: '请输入分类名称',
+    categoryNumber: '分类编号',
+    personCount: '人数',
+    categorySort: '分类排序',
+    openStatus: '开启状态',
+    storeTableNumberCategoryXls: '门店桌号分类.xls',
+    pleaseEnterPersonCount: '请输入人数',
+    pleaseSelectStore: '请选择店铺',
+    categoryNameCannotBeEmpty: '分类名称不能为空',
+    personCountCannotBeEmpty: '人数不能为空',
+    categorySortCannotBeEmpty: '分类排序不能为空',
+    wechatMiniProgram: '微信小程序',
+    officialAccount: '公众号',
+    h5: 'H5',
+    pleaseEnterUserNickname: '请输入用户昵称',
+    pleaseEnterPhoneNumber: '请输入手机号码',
+    userAvatar: '用户头像',
+    userBalance: '用户余额',
+    userLoginType: '用户登陆类型',
+    detail: '详情',
+    pointsBalance: '积分余额',
+    userXls: '用户.xls',
+    userInfo: '用户信息',
+    basicInfo: '基本信息',
+    balance: '余额',
+    birthday: '生日',
+    idCardNumber: '身份证号码',
+    boundMembershipCard: '绑定的会员卡',
+    points: '积分',
+    commissionAmount: '佣金金额',
+    consecutiveSignInDays: '连续签到天数',
+    loginIp: '登录ip',
+    level: '等级',
+    promotionId: '推广id',
+    purchaseCount: '购买次数',
+    subordinateCount: '下级人数',
+    loginType: '登陆类型',
+    registrationTime: '注册时间',
+    userOverview: '用户概况',
+    consumptionRecord: '消费记录',
+    expenseOrGain: '支出/获得',
+    expense: '支出',
+    gain: '获得',
+    unknown: '未知',
+    billTitle: '账单标题',
+    detailCategory: '明细种类',
+    detailType: '明细类型',
+    recharge: '充值',
+    rebate: '返佣',
+    consumption: '消费',
+    withdrawal: '提现',
+    refund: '退款',
+    systemAdd: '系统添加',
+    systemReduce: '系统减少',
+    subtract: '减去',
+    reward: '奖励',
+    signIn: '签到',
+    membershipCard: '会员卡',
+    detailAmountYuan: '明细数字(元)',
+    remainingYuan: '剩余(元)',
+    userAccount: '用户账户',
+    realName: '真实姓名',
+    userRemark: '用户备注',
+    userPoints: '用户积分',
+    detailedAddress: '详细地址',
+    pleaseEnterUserAccount: '请输入用户账户',
+    pleaseEnterRealName: '请输入真实姓名',
+    pleaseEnterBirthday: '请输入生日',
+    pleaseEnterUserRemark: '请输入用户备注',
+    pleaseEnterUserBalance: '请输入用户余额',
+    pleaseEnterCommissionAmount: '请输入佣金金额',
+    pleaseEnterUserRemainingPoints: '请输入用户剩余积分',
+    pleaseEnterDetailedAddress: '请输入详细地址',
+    userAccountCannotBeEmpty: '用户账户不能为空',
+    userNicknameCannotBeEmpty: '用户昵称不能为空',
+    phoneNumberCannotBeEmpty: '用户手机号码不能为空',
+    phoneNumber1: '手机号码',
+    selectMember: '选择会员',
+    select: '选择',
+    modifyBalance: '修改余额',
+    increase: '增加',
+    decrease: '减少',
+    pleaseEnterBalance: '请输入余额',
+    modifyPoints: '修改积分',
+    pleaseEnterPoints: '请输入积分',
+    amountCannotBeEmpty: '金额不能为空',
+    pointsCannotBeEmpty: '积分不能为空',
+    name1: '姓名',
+    phone: '电话',
+    consigneeName: '收货人姓名',
+    consigneePhone: '收货人电话',
+    consigneeAddress: '收货人地址',
+    consigneeDetailedAddress: '收货人详细地址',
+    isDefault: '是否默认',
+    pleaseEnterConsigneeName: '请输入收货人姓名',
+    pleaseEnterConsigneePhone: '请输入收货人电话',
+    consigneeNameCannotBeEmpty: '收货人姓名不能为空',
+    consigneePhoneCannotBeEmpty: '收货人电话不能为空',
+    consigneeAddressCannotBeEmpty: '收货人地址不能为空',
+    consigneeDetailedAddressCannotBeEmpty: '收货人详细地址不能为空',
+    isDefaultCannotBeEmpty: '是否默认不能为空',
+    pleaseEnterConsigneeProvince: '请输入收货人所在省',
+    desktopStatus: '桌面状态:',
+    idle: '空闲中',
+    dining: '就餐中',
+    noTableData: '暂无桌台数据',
+    dineInOrders: '堂食订单',
+    takeoutOrders: '外卖订单',
+    selfPickupOrders: '自取订单',
+    reservationOrders: '预约订单',
+    pendingOrder: '待出单',
+    pendingReceipt: '待收货',
+    receivedOrPickedUp: '已收货/已取餐',
+    refundOrders: '退款单',
+    reserving: '预约中',
+    cancelled: '已取消',
+    completed: '已完成',
+    wechatPayment: '微信支付',
+    userPhone: '用户电话',
+    pleaseEnterOrderNumber: '请输入订单号',
+    pleaseEnterUserName: '请输入用户姓名',
+    pleaseEnterUserPhone: '请输入用户电话',
+    pickupNumber: '取餐号',
+    orderNumber1: '订单号',
+    userNamePhone: '用户姓名|电话',
+    productInfo: '商品信息',
+    reservation: '预约',
+    reservationPickupTime: '预约取餐时间',
+    issueOrder: '出单',
+    confirmRefund: '确认退款',
+    cancelReservation: '取消预约',
+    confirmPayment: '确认付款',
+    orderRecords: '订单记录',
+    deleteOrder: '删除订单',
+    orderRemark: '订单备注',
+    backendReceipt: '后台收货',
+    modifyToPaidStatus: '修改为支付状态',
+    modifyReceiptStatus: '修改收货状态',
+    confirmCancelReservation: '确定取消预约',
+    orderXls: '订单.xls',
+    receivingInfoOne: '收货信息1',
+    consignee: '收货人',
+    contactPhone: '联系电话',
+    receivingAddress: '收货地址',
+    dishDetails: '菜品明细',
+    mealNotServed: '未出餐',
+    mealServed: '已出餐',
+    userOrdering: '用户点餐',
+    staffOrderingOnBehalf: '员工帮点',
+    productDetails: '商品明细',
+    reserveTable: '预约桌面',
+    price: '价格',
+    quantity: '数量',
+    orderInfo: '订单信息',
+    diningPersonCount: '就餐人数',
+    reservationTime: '预约时间',
+    arrivalTime: '到店时间',
+    reservationPerson: '预约人',
+    reservationPhone: '预约预留电话',
+    reservationStatus: '预约状态',
+    totalProductQuantity: '商品总数',
+    totalProductPrice: '商品总价',
+    shippingFee: '支付邮费',
+    pointsDeduction: '积分抵扣',
+    orderTotalPriceCannotBeEmpty: '订单总价不能为空',
+    actualPaymentAmountCannotBeEmpty: '实际支付金额不能为空',
+    consumptionEarnedPointsCannotBeEmpty: '消费赚取积分不能为空',
+    bonusPoints: '赠送积分',
+    orderIssued: '已出单',
+    pleasePlaceAnOrderFirst: '请先点餐哦!',
+    confirmOfflineCollection: '确定下线收款',
+    assistWithOrdering: '协助点餐',
+    confirmCollection: '确认收款',
+    issueOrderAndPrintReceipt: '出单打印小票',
+    print: '打 印',
+    receiptPrint: '小票打印',
+    displayStore: '展示店铺',
+    categoryImage: '分类图片',
+    categoryDescription: '分类描述',
+    pleaseEnterCategoryDescription: '请输入分类描述',
+    openStatusCannotBeEmpty: '开启状态不能为空',
+    belongingStore: '所属门店',
+    productName: '商品名称',
+    commentId: '评论ID',
+    productScore: '商品分数',
+    serviceScore: '服务分数',
+    commentContent: '评论内容',
+    commentTime: '评论时间',
+    adminReplyContent: '管理员回复内容',
+    adminReplyTime: '管理员回复时间',
+    pleaseEnterNickname: '请输入昵称',
+    reply: '回复',
+    weight: '权重',
+    pleaseEnterWeight: '请输入权重',
+    imageCannotBeEmpty: '图片不能为空',
+    weightCannotBeEmpty: '权重不能为空',
+    image: '图片',
+    isAvailable: '是否可用',
+    salesVolume: '销量',
+    value: '价值',
+    sellingPrice: '销售价',
+    pleaseEnterTitle: '请输入标题',
+    title: '标题',
+    pleaseEnterValue: '请输入价值',
+    pleaseEnterSellingPrice: '请输入销售价',
+    display: '显示',
+    hide: '隐藏',
+    titleCannotBeEmpty: '标题不能为空',
+    valueCannotBeEmpty: '价值不能为空',
+    sellingPriceCannotBeEmpty: '销售价不能为空',
+    icon: '图标',
+    type: '类型',
+    pagePath: '页面路径',
+    page: '页面',
+    jumpToMiniProgram: '跳转小程序',
+    content: '内容',
+    myServiceXls: '我的服务.xls',
+    selectType: '选择类型',
+    miniProgramAppId: '小程序app_id',
+    pleaseSelectType: '请选择类型',
+    pleaseEnterMiniProgramAppId: '请输入小程序app_id',
+    pleaseEnterPagePath: '请输入页面路径',
+    pleaseEnterPhone: '请输入电话',
+    typeCannotBeEmpty: '类型不能为空',
+    iconCannotBeEmpty: '图标不能为空',
+    specificationName: '规格名称',
+    specificationValue: '规格值',
+    pleaseEnterSpecificationName: '请输入规格名称',
+    pleaseEnterAttributeName: '请输入属性名称',
+    pleaseEnterSpecificationValue: '请输入规格值',
+    addNewSpecification: '添加新规格',
+    specificationNameCannotBeEmpty: '规格名称不能为空',
+    specificationValueCannotBeEmpty: '规格值不能为空',
+    rechargeAmountManagementXls: '充值金额管理.xls',
+    productRuleValueSpecificationXls: '商品规则值(规格).xls',
+    withdrawalAmountCannotBeEmpty: '提现金额不能为空',
+    bankCardCannotBeEmpty: '银行卡不能为空',
+    withdrawalAmount: '提现金额',
+    withdrawToBankCard: '提现到银行卡',
+    pleaseEnterWithdrawalAmount: '请输入提现金额',
+    selectBankCard: '选择银行卡',
+    pleaseSelectStatus: '请选择状态',
+    unreviewed: '未审核',
+    pendingArrival: '待到账',
+    reviewRejected: '审核拒绝',
+    arrived: '已到账',
+    withdrawalBankCard: '提现银行卡',
+    bankName: '银行名称',
+    bankCardNumber: '银行卡号',
+    reviewRejectionReason: '审核拒绝原因',
+    review: '审核',
+    bankNameColon: '银行名称:',
+    bankCardNumberColon: '银行卡号:',
+    realNameColon: '真实姓名:',
+    phoneNumberColon: '手机号码:',
+    pleaseEnterReviewRejectionReason: '请输入审核拒绝原因',
+    printerName: '打印机名称',
+    terminalNumber: '终端号',
+    terminalKey: '终端密钥',
+    pleaseEnterPrinterName: '请输入打印机名称',
+    configurePrinter: '配置打印机',
+    printerClientId: '打印机clientId',
+    printerClientSecret: '打印机clientSecret',
+    printerClientIdCannotBeEmpty: '打印机clientId不能为空',
+    printerClientSecretCannotBeEmpty: '打印机clientSecret不能为空',
+    pleaseEnterTerminalNumber: '请输入终端号',
+    pleaseEnterTerminalKey: '请输入终端密钥',
+    pleaseEnterBankName: '请输入银行名称',
+    pleaseEnterBankCardNumber: '请输入银行卡号',
+    pleaseEnterName: '请输入姓名',
+    bankNameCannotBeEmpty: '银行名称不能为空',
+    bankCardNumberCannotBeEmpty: '银行卡号不能为空',
+    nameCannotBeEmpty: '姓名不能为空',
+    ID: 'ID',
+    pleaseEnterUserId: '请输入用户id',
+    pleaseSelectUser: '请选择用户',
+    income: '收入',
+    amount: '金额',
+    storeId: '门店ID',
+    typeTips: '类型:1=收入,2=支出',
+    pleaseSelectDictionaryGeneration: '请选择字典生成',
+    user: '用户',
+    pleaseEnterStoreId: '请输入门店ID',
+    pleaseSelectTypeTips: '请选择类型:1=收入,2=支出',
+    pleaseEnterAmount: '请输入金额',
+    pleaseEnterUser: '请输入用户',
+    storeNameCannotBeEmpty: '店铺名称不能为空',
+    associatedTags: '所属标签',
+    selectTag: '选择标签',
+    intervalTimeUnitHours: '间隔时间(单位小时)',
+    pleaseEnterIntervalTimeUnitHours: '请输入间隔时间单位小时',
+    selectEndTime: '选择结束时间',
+    pleaseSelectTag: '请选择标签',
+    intervalTimeCannotBeEmpty: '间隔时间不能为空',
+    tagName: '标签名称',
+    pleaseEnterTagName: '请输入标签名称',
+    tagNameCannotBeEmpty: '标签名称不能为空',
+    storePhone: '店铺电话',
+    storeImage: '门店图片',
+    longitude: '经度',
+    latitude: '纬度',
+    minimumOrderPrice: '起送价钱',
+    deliveryPrice: '配送价格',
+    isOpen: '是否营业',
+    pleaseEnterStorePhone: '请输入店铺电话',
+    pleaseEnterPlaceKeyword: '请输入地名关键字',
+    selectOnMap: '地图选择',
+    pleaseSelectLocationAddress: '请选择定位地址',
+    storeAvatar: '门店头像',
+    storeGroupImages: '门店组图',
+    businessStartTime: '营业开始时间',
+    businessEndTime: '营业结束时间',
+    selectMapLocation: '选择地图定位',
+    mapLocationAddress: '地图定位地址',
+    takeoutDeliveryDistance: '外卖配送距离/千米',
+    announcement: '公告',
+    bindAdministrator: '绑定管理员',
+    selectBusinessStartTime: '选择营业开始时间',
+    selectBusinessEndTime: '选择营业结束时间',
+    pleaseEnterMapLocationAddress: '请输入地图定位地址',
+    pleaseEnterLongitude: '请输入经度',
+    pleaseEnterLatitude: '请输入纬度',
+    pleaseEnterTakeoutDeliveryDistance: '请输入外卖配送距离,单位为千米。0表示不送外卖',
+    pleaseEnterMinimumOrderPrice: '请输入起送价钱',
+    pleaseEnterDeliveryPrice: '请输入配送价格',
+    pleaseEnterAnnouncement: '请输入公告',
+    clickToSelectAddressToGetLongitudeAndLatitude: '点击选择地址获取经纬度',
+    selectUser: '选择用户',
+    bindAdministratorForBranchManagement: '绑定管理员用于分店管理',
+    isStoreReceiptPrintingEnabled: '是否开启门店小票打印',
+    bindPrinter: '绑定打印机',
+    selectPrinter: '选择打印机',
+    isCustomerReceiptPrintingEnabled: '是否开启顾客小票打印',
+    isKitchenReceiptPrintingEnabled: '是否开启厨房小票打印',
+    storePhoneCannotBeEmpty: '店铺电话不能为空',
+    multipleImagesCannotBeEmpty: '多张图片不能为空',
+    detailedAddressCannotBeEmpty: '详细地址不能为空',
+    mapLocationAddressCannotBeEmpty: '地图定位地址不能为空',
+    longitudeCannotBeEmpty: '经度不能为空',
+    latitudeCannotBeEmpty: '纬度不能为空',
+    takeoutDeliveryDistanceTips: '外卖配送距离,单位为千米。0表示不送外卖不能为空',
+    minimumOrderPriceCannotBeEmpty: '起送价钱不能为空',
+    deliveryPriceCannotBeEmpty: '配送价格不能为空',
+    announcementCannotBeEmpty: '公告不能为空',
+    isOpenTips: '是否营业:0=否,1=是不能为空',
+    administratorIdCannotBeEmpty: '管理员id不能为空',
+    printerIdCannotBeEmpty: '打印机id不能为空',
+    businessStartTimeCannotBeEmpty: '营业开始时间不能为空',
+    businessEndTimeCannotBeEmpty: '营业结束时间不能为空',
+    pleaseBindStorePrinter: '请绑定门店打印机',
+    pleaseBindCustomerPrinter: '请绑定顾客打印机',
+    pleaseBindKitchenPrinter: '请绑定后厨打印机',
+    storeManagementXls: '门店管理.xls',
+    inStoreConsumption: '到店消费',
+    appointmentLabelXls: '预约标签.xls',
+    appointmentRuleXls: '预约规则.xls',
+    storeMobileMerchantUserAssociationXls: '门店移动端商家用户关联.xls'
+  },
+  market: {
+    orderNumber: '订单号',
+    userIdAndNickname: '用户id|昵称',
+    billTitle: '账单标题',
+    detailedFigureYuan: '明细数字(元)',
+    paid: '已支付',
+    unpaid: '未支付',
+    addTime: '添加时间',
+    cardName: '会员卡名称',
+    pleaseEnterTheNameOfTheMembershipCard: '请输入会员卡名称',
+    discountRatio: '折扣比例',
+    break: '折',
+    validPeriod: '有效期',
+    permanent: '永久',
+    month: '月',
+    purchasePrice: '购买的价格',
+    bonusPoints: '赠送积分',
+    bonusAmount: '赠送的金额',
+    delete: '删除',
+    purchaseRecord: '购买记录',
+    membershipCardXls: '会员卡.xls',
+    basicInformation: '基本信息',
+    cardStyle: '会员卡样式',
+    pleaseEnterTheOrder: '请输入排序',
+    discount: '是否有折扣',
+    pleaseEnterThePercentageOfDiscount: '请输入折扣比例',
+    freeGiftWhenYouOpenTheCard: '开卡赠送',
+    balance: '余额',
+    NumberBonusPoints: '赠送积分数量',
+    pleaseEnterTheNumberOfBonusPoints: '请输入赠送积分数量',
+    bonusBalance: '赠送的余额',
+    pleaseEnterTheBalanceOfTheGift: '请输入赠送的余额',
+    receiveConfiguration: '领取配置',
+    validityPeriod: '有效期',
+    pleaseEnterTheValidityPeriod: '请输入有效期',
+    theValidityPeriodIsInMonths0MeansPermanent: '有效期单位月,0-表示永久',
+    pleaseEnterThePurchasedPrice: '请输入购买的价格',
+    rulesForUse: '使用的规则',
+    cardNameCannotBeEmpty: '会员卡名称不能为空',
+    cardStyleCannotBeEmpty: '会员卡样式不能为空',
+    expiryDateCannotBeEmpty: '有效期不能为空',
+    purchasePriceCannotBeEmpty1: '购买价格不能为空',
+    orderTotalPriceCannotBeEmpty: '订单总价不能为空',
+    refundAmountCannotBeEmpty: '退款金额金额不能为空',
+    orderTotalPrice: '订单总价',
+    refundAmount: '退款金额',
+    pleaseEnterOrderNumber: '请输入订单号',
+    pleaseEnterOrderTotalPrice: '请输入订单总价',
+    actualPaymentAmountCannotBeEmpty: '实际支付金额不能为空',
+    consumptionEarnedPointsCannotBeEmpty: '消费赚取积分不能为空',
+    actualPaymentAmount: '实际支付金额',
+    pleaseEnterActualPaymentAmount: '请输入实际支付金额',
+    pleaseEnterBonusPoints: '请输入赠送积分',
+    expressCompanyCannotBeEmpty: '快递公司不能为空',
+    expressTrackingNumberCannotBeEmpty: '快递单号不能为空',
+    expressCompany: '快递公司',
+    selectExpressCompany: '选择快递公司',
+    pleaseEnterExpressTrackingNumber: '请输入快递单号',
+    courierNumber: '快递单号',
+    tableNumber: '桌号',
+    pickupNumber: '取餐号',
+    address: '地址',
+    orderId: '订单id',
+    operationRecord: '操作记录',
+    operationTime: '操作时间'
+  },
+  message: {
+    templateName: '模板名',
+    pleaseEnterTheTemplateName: '请输入模板名',
+    templateNumber: '模板编号',
+    templateId: '模板ID',
+    type: '类型',
+    templateMessage: '模板消息',
+    subscribeMessage: '订阅消息',
+    addTime: '添加时间',
+    weChatTemplateXls: '微信模板.xls',
+    messageType: '消息类型',
+    pleaseSelectType: '请选择类型',
+    pleaseSelectMessageType: '请选消息类型',
+    pleaseEnterTheTemplateNumber: '请输入模板编号',
+    pleaseEnterTheTemplateId: '请输入模板ID',
+    templateNumberCannotBeEmpty: '模板编号不能为空',
+    templateNameCannotBeEmpty: '模板名不能为空',
+    messageTypeCannotBeEmpty: '模板ID不能为空',
+    templateIdCannotBeEmpty: '消息类型不能为空',
+    open: '开启'
+  },
+  mp: {
+    name: '名称',
+    wechatAccount: '微信号',
+    messageEncryptionKey: '消息加解密密钥',
+    pleaseEnterName: '请输入名称',
+    pleaseEnterWechatAccount: '请输入微信号',
+    pleaseEnterOfficialAccount: '请输入公众号 appSecret',
+    pleaseEnterOfficialAccountToken: '请输入公众号token',
+    pleaseEnterMessageEncryptionKey: '请输入消息加解密密钥',
+    pleaseEnterMiniProgramAppId: '请输入小程序 appId',
+    pleaseEnterMiniProgramAppSecret: '请输入小程序 appSecret',
+    tip11: '在微信公众平台(mp.weixin.qq.com)的菜单 [设置与开发 - 公众号设置 - 账号详情] 中能找到「微信号」',
+    tip12: '在微信公众平台(mp.weixin.qq.com)的菜单 [设置与开发 - 公众号设置 - 基本设置] 中能找到「开发者ID(AppID)」',
+    tip13: '在微信公众平台(mp.weixin.qq.com)的菜单 [设置与开发 - 公众号设置 - 基本设置] 中能找到「开发者密码(AppSecret)」',
+    nameCannotBeEmpty: '名称不能为空',
+    officialAccountCannotBeEmpty: '公众号账号不能为空',
+    officialAccountAppIdCannotBeEmpty: '公众号 appId 不能为空',
+    officialAccountSecretCannotBeEmpty: '公众号密钥不能为空',
+    officialAccountTokenCannotBeEmpty: '公众号 token 不能为空',
+    appId: 'appId',
+    serverAddressUrl: '服务器地址(URL)',
+    qrCode: '二维码',
+    generateQRCode: '生成二维码',
+    isMainAccount: '是否是主账户',
+    search: '搜索',
+    reset: '重置',
+    clearApiQuota: '清空 API 配额',
+    setAsMainAccount: '设置为主账户',
+    settingSucceeded: '设置成功',
+    messageType: '消息类型',
+    matchingType: '匹配类型',
+    pleaseSelectMatchingType: '请选择匹配类型',
+    pleaseEnterContent: '请输入内容',
+    keyword: '关键词',
+    replyMessage: '回复消息',
+    requestedKeywordCannotBeEmpty: '请求的关键字不能为空',
+    requestedKeywordMatchingCannotBeEmpty: '请求的关键字的匹配不能为空',
+    requestMessageType: '请求消息类型',
+    cover: '封面',
+    tip3: '你正在通过发布的方式发表内容。 发布不占用群发次数,一天可多次发布。',
+    tip4: '已发布内容不会推送给用户,也不会展示在公众号主页中。',
+    tip5: '发布后,你可以前往发表记录获取链接,也可以将发布内容添加到自定义菜单、自动回复、话题和页面模板中。',
+    replyMessageType: '回复消息类型',
+    replyContent: '回复内容',
+    officialAccount: '公众号',
+    addNew: '新增',
+    replyOnFollow: '关注时回复',
+    messageReply: '消息回复',
+    keywordReply: '关键词回复',
+    addNewAutoReply: '新增自动回复',
+    modifyAutoReply: '修改自动回复',
+    areYouSureToDeleteThisData: '是否确认删除此数据',
+    deletionSucceeded: '删除成功',
+    modificationSucceeded: '修改成功',
+    additionSucceeded: '新增成功',
+    updateitionSucceeded: '更新成功',
+    uploadLocally: '本地上传',
+    supportsBmpPngJpegJpgGifFormatsSizeNotExceeding2M: '支持 bmp/png/jpeg/jpg/gif 格式,大小不超过 2M',
+    uploadError: '上传出错:',
+    uploadFailed: '上传失败:',
+    pleaseEnterTitleRequired: '请输入标题(必填)',
+    pleaseEnterAuthor: '请输入作者',
+    pleaseEnterOriginalArticleAddress: '请输入原文地址',
+    pleaseEnterAbstract: '请输入摘要',
+    areYouSureToDeleteThisGraphic: '确定删除该图文吗?',
+    createNewGraphic: '新建图文',
+    modifyGraphic: '修改图文',
+    modifiedContentMayNotBeSavedAreYouSureToClose: '修改内容可能还未保存,确定关闭吗?',
+    publishingSucceeded: '发布成功',
+    thisOperationWillPermanentlyDeleteTheDraftAreYouSureToContinue: '此操作将永久删除该草稿, 是否继续?',
+    afterDeletionUsersCannotAccessThisPageAreYouSureToDelete: '删除后用户将无法访问此页面,确定删除?',
+    image: '图片',
+    voice: '语音',
+    video: '视频',
+    clickToUpload: '点击上传',
+    uploadSucceeded: '上传成功',
+    createNewVideo: '新建视频',
+    selectVideo: '选择视频',
+    tip0: '格式支持 MP4,文件大小不超过 10MB',
+    tips1: '标题将展示在相关播放页面,建议填写清晰、准确、生动的标题',
+    tips2: '介绍语将展示在相关播放页面,建议填写简洁明确、有信息量的内容',
+    pleaseEnterTitle: '请输入标题',
+    pleaseEnterDescription: '请输入描述',
+    number: '编号',
+    fileName: '文件名',
+    introduction: '介绍',
+    uploadTime: '上传时间',
+    download: '下载',
+    delete: '删除',
+    description: '描述',
+    formatSupportsMp3WmaWavAmrFileSizeNotExceeding2MPlaybackLengthNotExceeding60s:'格式支持 mp3/wma/wav/amr,文件大小不超过 2M,播放长度不超过 60s',
+    thisOperationWillPermanentlyDeleteTheFileAreYouSureToContinue: '此操作将永久删除该文件, 是否继续?',
+    deleteCurrentMenu: '删除当前菜单',
+    menuName: '菜单名称',
+    pleaseEnterMenuName: '请输入菜单名称',
+    menuIdentifier: '菜单标识',
+    pleaseEnterMenuKey: '请输入菜单 KEY',
+    menuContent: '菜单内容',
+    jumpLink: '跳转链接',
+    pleaseEnterLink: '请输入链接',
+    miniProgramAppId: '小程序的 appid ',
+    miniProgramPagePath: '小程序的页面路径',
+    pleaseEnterMiniProgramPagePathEgPagesIndex: '请输入小程序的页面路径,如:pages/index',
+    miniProgramBackupWebpage: '小程序的备用网页:',
+    OlderVersionsOfTheClientThatDoNotSupportMiniProgramsWillOpenThisWebpage: '不支持小程序的老版本客户端将打开本网页',
+    tipsYouNeedToAssociateWithTheOfficialAccountToBindTheMiniProgramToTheWeChatMenu:'tips:需要和公众号进行关联才可以把小程序绑定带微信菜单上哟!',
+    selectFromMaterialLibrary: '素材库选择',
+    selectGraphic: '选择图文',
+    YouHaveSelectedAMultiGraphicItWillDefaultToJumpToTheFirstOne: '您选择的是多图文,将默认跳转第一篇',
+    jumpToWebpage: '跳转网页',
+    jumpToMiniProgram: '跳转小程序',
+    clickToReply: '点击回复',
+    jumpToGraphicMessage: '跳转图文消息',
+    scanCodeToReturnResultDirectly: '扫码直接返回结果',
+    scanCodeToReply: '扫码回复',
+    systemTakePhotoAndSendImage: '系统拍照发图',
+    takePhotoOrSelectFromAlbum: '拍照或者相册',
+    wechatAlbum: '微信相册',
+    selectLocation: '选择地理位置',
+    subMenuName: '子菜单名称',
+    saveAndPublishMenu: '保存并发布菜单',
+    clearMenu: '清空菜单',
+    pleaseSelectMenuConfiguration: '请选择菜单配置',
+    areYouSureToDelete: '确定要删除吗?',
+    areYouSureToSave: '确定要保存吗?',
+    clearingSucceeded: '清空成功',
+    userIdentifier: '用户标识',
+    pleaseSelectMessageType: '请选择消息类型',
+    pleaseEnterUserIdentifier: '请输入用户标识',
+    fanMessageList: '粉丝消息列表',
+    sendTime: '发送时间',
+    sender: '发送方',
+    fan: '粉丝',
+    follow: '关注',
+    unfollow: '取消关注',
+    clickMenu: '点击菜单',
+    clickMenuLink: '点击菜单链接',
+    scanCodeResult: '扫码结果',
+    unknownEventType: '未知事件类型',
+    link: '链接',
+    unknownMessageType: '未知消息类型',
+    message: '消息',
+    timeRange: '时间范围',
+    userIncreaseDecreaseData: '用户增减数据',
+    cumulativeUserData: '累计用户数据',
+    messageOverviewData: '消息概况数据',
+    interfaceAnalysisData: '接口分析数据',
+    newUsers: '新增用户',
+    unfollowedUsers: '取消关注的用户',
+    cumulativeUserCount: '累计用户量',
+    numberOfUsersSendingMessages: '用户发送人数',
+    numberOfMessagesSentByUsers: '用户发送条数',
+    numberOfPassiveRepliesToUserMessages: '被动回复用户消息的次数',
+    numberOfFailures: '失败次数',
+    maximumTimeConsumed: '最大耗时',
+    totalTimeConsumed: '总耗时',
+    noOfficialAccountSelectedCannotStatisticData: '未选中公众号,无法统计数据',
+    timeIntervalShouldBeWithin7DaysPleaseReSelect: '时间间隔 7 天以内,请重新选择',
+    synchronize: '同步',
+    numberOfFans: '粉丝数',
+    areYouSureToSynchronizeTags: '是否确认同步标签?',
+    tagSynchronizationSucceeded: '同步标签成功',
+    pleaseEnterTagName: '请输入标签名称',
+    nickname: '昵称',
+    tag: '标签',
+    subscriptionStatus: '订阅状态',
+    subscriptionTime: '订阅时间',
+    areYouSureToSynchronizeFans: '是否确认同步粉丝?',
+    startingToSynchronizeFanInfoFromWechatOfficialAccountItTakesTimePleaseQueryLater:'开始从微信公众号同步粉丝信息,同步需要一段时间,建议稍后再查询',
+    pleaseSelectTag: '请选择标签',
+    subscribed: '已订阅',
+    unsubscribed: '未订阅'
+  },
+  pay: {
+    idTenantId: 'id(+租户ID)',
+    paymentType: '支付类型(支付渠道)',
+    applicationId: '应用id',
+    merchantId: '商户id',
+    asynchronousCallbackAddress: '异步回调地址',
+    synchronousCallbackAddress: '同步回调地址',
+    signature: '签名方式',
+    testEnvironment: '是否为测试环境',
+    alipay: '支付宝支付',
+    weChatPayment: '微信支付',
+    payId: '支付id',
+    weChatPaySmallProgram: '微信支付小程序',
+    weChatPayPublic: '微信支付公众号',
+    weChatPayH5: '微信支付H5',
+    alipayH5: '支付宝H5',
+    pleaseEnterTheAppId: '请输入应用id',
+    weChatMerchantId: '微信商户id',
+    pleaseEnterWeChatMerchantId: '请输入微信商户id',
+    alipayMerchantId: '支付宝商户id',
+    pleaseEnterTheAlipayMerchantId: '请输入支付宝商户id',
+    certificateStorageType: '证书存储类型',
+    pleaseSelectTheType: '请选择类型',
+    noteNeedCertificateOfChoiceDoNotNeedNotChoose: '注意:需要证书的选择不需要不选择',
+    privateKeyOrPrivateKeyCertificate: '私钥或私钥证书',
+    pleaseEnterThePrivateKeyOrPrivateKeyCertificate: '请输入私钥或私钥证书',
+    publicKeyOrPublicKeyCertificate: '公钥或公钥证书',
+    pleaseEnterThePublicKeyOrPublicKeyCertificate: '请输入公钥或公钥证书',
+    keyCertificate: 'key证书',
+    pleaseEnterTheKeyCertificateAdditionalCertificatesToUseSuchAsSslCertificateOrUnionPayRootLevelCertificates:'请输入key证书,附加证书使用,如SSL证书,或者银联根级证书方面',
+    passwordOfTheCertificate: '证书的密码',
+    pleaseEnterThePasswordOfThePrivateKeyCertificateOrKeyCertificate: '请输入私钥证书或key证书的密码',
+    pleaseEnterTheAsynchronousCallback: '请输入异步回调',
+    pleaseEnterTheSynchronousCallbackAddressWhichIsMostlyUsedForPageJumpAfterSuccessfulPayment:'请输入同步回调地址,大部分用于付款成功后页面转跳',
+    pleaseSelectSignatureMethodMd5: '请选择签名方式MD5',
+    subappid: '子appid',
+    pleaseEnterTheSubAppid: '请输入子appid',
+    subMerchantId: '子商户id',
+    pleaseEnterTheSubMerchantId: '请输入子商户id',
+    paymentTypeCannotBeEmpty: '支付类型(支付渠道)不能为空',
+    paymentIdCannotBeEmpty: '支付id不能为空',
+    applicationIdCannotBeEmpty: '应用id不能为空',
+    signatureMethodCannotBeEmpty: '签名方式不能为空',
+    asynchronousCallbackAddressCannotBeEmpty: '异步回调地址不能为空'
+  },
+  Redirect: {},
+  score: {
+    all: '全部',
+    toBePaid: '待支付',
+    toBeShipped: '待发货',
+    toBeReceived: '待收货',
+    completed: '已完成',
+    allOrders: '全部订单',
+    orderStatus: '订单状态',
+    userName: '用户名',
+    pleaseEnterYourPhoneNumber: '请输入电话',
+    pleaseEnterTheOrderNumber: '请输入订单号',
+    userIdNickname: '用户id|昵称',
+    productInformation: '商品信息',
+    totalPointsConsumed: '总消耗积分',
+    totalConsumptionAmount: '总消耗金额',
+    paymentMethod: '支付方式',
+    balancePayment: '余额支付',
+    weChatPayment: '微信支付',
+    alipayPayment: '支付宝支付',
+    cashPayment: '现金支付',
+    shipping: '发货',
+    more: '更多',
+    orderDetails: '订单详情',
+    deleteOrder: '删除订单',
+    backstageReceiving: '后台收货',
+    pointsMallOrdersXls: '积分商城订单.xls',
+    modifyReceivingStatus: '修改收货状态',
+    receivingInformation: '收货信息',
+    nickname: '用户昵称',
+    consignee: '收货人',
+    contactPhoneNumber: '联系电话',
+    address: '收货地址',
+    productDetails: '商品明细',
+    goodsPicture: '商品图片',
+    productName: '商品名称',
+    orderInformation: '订单信息',
+    logisticsInformation: '物流信息',
+    orderNo: '订单号',
+    quantity: '数量',
+    spendingPoints: '花费积分',
+    payment: '是否支付',
+    whetherToShipOrNot: '是否发货',
+    receiveOrNot: '是否收货',
+    expressCompany: '快递公司',
+    courierNumber: '快递单号',
+    selectType: '选择类型',
+    fillInManually: '手动填写',
+    shippingType: '发货类型',
+    selectCourierCompany: '选择快递公司',
+    pleaseEnterTheCourierSingleNumber: '请输入快递单号',
+    pleaseSelectTheCourierCompany: '请选择快递公司',
+    courierSingleNumberCanNotBeEmpty: '快递单号不能为空',
+    productTitle: '产品标题',
+    pleaseEnterTheProductTitle: '请输入产品标题',
+    selectCategory: '选择商品分类',
+    productCategory: '产品分类',
+    mainPicture: '主图',
+    picture: '图片',
+    pointsConsumption: '消耗积分',
+    price: '商品价格',
+    originalPrice: '商品原价',
+    weight: '权重',
+    inventory: '库存',
+    salesVolume: '销售量',
+    whetherItIsOnTheShelfOrNot: '是否上架',
+    up: '上架',
+    down: '下架',
+    pointsProductsXls: '积分产品.xls',
+    category: '商品分类',
+    groupPicture: '组图',
+    detail: '详情',
+    purchaseAmount: '购买金额',
+    pleaseEnterThePointsConsumed: '请输入消耗积分',
+    pleaseEnterTheAmount: '请输入金额',
+    tips: '当积分与金额都大于0表示此商品需要积分+价格购买',
+    pleaseEnterStock: '请输入库存',
+    pleaseEnterAWeight: '请输入权重',
+    productTitleCannotBeEmpty: '产品标题不能为空',
+    pleaseSelectProductCategory: '请选择商品分类',
+    mainPictureCannotBeEmpty: '主图不能为空',
+    groupPictureCannotBeEmpty: '组图不能为空',
+    detailsCannotBeEmpty: '详情不能为空',
+    pointsConsumedCannotBeEmpty: '消耗积分不能为空',
+    originalPriceCannotBeEmpty: '商品原价不能为空',
+    inventoryCannotBeEmpty: '库存不能为空',
+    uploadImage: '上传图片',
+    availability: '是否可用',
+    imageCannotBeEmpty: '图片不能为空',
+    showOrNotCannotBeEmpty: '是否显现不能为空',
+    weightCannotBeEmpty: '权重不能为空',
+    pointsMallAdvertisementMapManagementXls: '积分商城广告图管理.xls',
+    categoryName: '分类名称',
+    sortByCategory: '分类排序',
+    enableStatus: '开启状态',
+    pleaseInputCategoryName: '请输入分类名称',
+    pleaseInputCategorySorting: '请输入分类排序',
+    categoryNameCannotBeEmpty: '分类名称不能为空',
+    openStatusCannotBeEmpty: '开启状态不能为空',
+    categoryNumber: '分类编号',
+    pointsProductClassificationXls: '积分商品分类.xls'
+  },
+  system: {
+    ipQuery: 'IP 查询',
+    pleaseEnterIpAddress: '请输入 IP 地址',
+    showIpQueryResults: '展示查询 IP 结果',
+    ipAddressCannotBeEmpty: 'IP 地址不能为空',
+    querySuccess: '查询成功',
+    no: '编号',
+    placeName: '地名',
+    superiorDepartment: '上级部门',
+    pleaseSelectTheParentDepartment: '请选择上级部门',
+    departmentName: '部门名称',
+    pleaseEnterADepartmentName: '请输入部门名称',
+    departmentStatus: '部门状态',
+    pleaseSelectDepartmentStatus: '请选择部门状态',
+    displaySort: '显示排序',
+    personInCharge: '负责人',
+    pleaseEnterThePersonInCharge: '请输入负责人',
+    contactPhoneNumber: '联系电话',
+    pleaseInputTheContactPhoneNumber: '请输入联系电话',
+    mailbox: '邮箱',
+    pleaseInputMailbox: '请输入邮箱',
+    status: '状态',
+    pleaseSelectStatus: '请选择状态',
+    parentDepartmentCannotBeEmpty: '上级部门不能为空',
+    departmentNameCannotBeEmpty: '部门名称不能为空',
+    displayOrderCannotBeEmpty: '显示排序不能为空',
+    statusCannotBeEmpty: '状态不能为空',
+    pleaseEnterTheCorrectEmailAddress: '请输入正确的邮箱地址',
+    pleaseEnterTheCorrectCellPhoneNumber: '请输入正确的手机号码',
+    topDepartment: '顶级部门',
+    expandCollapse: '展开/折叠',
+    dictionaryType: '字典类型',
+    dataLabel: '数据标签',
+    dataKeyValue: '数据键值',
+    colorType: '颜色类型',
+    pleaseEnterParameterName: '请输入参数名称',
+    pleaseEnterDataLabel: '请输入数据标签',
+    pleaseEnterDataKeyValue: '请输入数据键值',
+    pleaseEnterCSSClass: '请输入CSS Class',
+    pleaseEnterContent: '请输入内容',
+    dataLabelCannotBeEmpty: '数据标签不能为空',
+    dataKeyValueCannotBeEmpty: '数据键值不能为空',
+    dataOrderCannotBeEmpty: '数据顺序不能为空',
+    default: '默认',
+    primary: '主要',
+    success: '成功',
+    information: '信息',
+    warning: '警告',
+    danger: '危险',
+    dictionaryName: '字典名称',
+    dictionaryLabel: '字典标签',
+    pleaseEnterDictionaryLabel: '请输入字典标签',
+    dataStatus: '数据状态',
+    dictionaryCode: '字典编码',
+    dictionaryKeyValue: '字典键值',
+    dictionarySort: '字典排序',
+    dictionaryDataXls: '字典数据.xls',
+    pleaseEnterDictionaryName: '请输入字典名称',
+    dictionaryNameCannotBeEmpty: '字典名称不能为空',
+    dictionaryTypeCannotBeEmpty: '字典类型不能为空',
+    dictionaryNumber: '字典编号',
+    pleaseEnterDictionaryType: '请输入字典类型',
+    pleaseSelectDictionaryStatus: '请选择字典状态',
+    newAdd: '新增',
+    export: '导出',
+    data: '数据',
+    dictionaryTypeXls: '字典类型.xls',
+    userName: '用户名称',
+    loginAddress: '登录地址',
+    loginDate: '登录日期',
+    pleaseEnterUserName: '请输入用户名称',
+    pleaseEnterLoginAddress: '请输入登录地址',
+    logNumber: '日志编号',
+    operationType: '操作类型',
+    browser: '浏览器',
+    loginResult: '登陆结果',
+    details: '详情',
+    loginLogxls: '登录日志.xls',
+    email: '邮箱',
+    password: '密码',
+    SMTPserverDomainName: 'SMTP 服务器域名',
+    SMTPserverPort: 'SMTP 服务器端口',
+    whetherToEnableSSL: '是否开启 SSL',
+    whetherToEnableSTARTTLS: '是否开启 STARTTLS',
+    creationTime: '创建时间',
+    operation: '操作',
+    number: '编号',
+    cache: '缓存',
+    noCache: '不缓存',
+    cacheStatus: '缓存状态',
+    always: '总是',
+    no1: '不是',
+    cache1: '选择缓存时,则会被 `keep-alive` 缓存,必须填写「组件名称」字段',
+    cache2: '选择不是时,当该菜单只有一个子菜单时,不展示自己,直接展示子菜单',
+    cache3: '选择隐藏时,路由将不会出现在侧边栏,但仍然可以访问',
+    cache4: "Controller 方法上的权限字符,如:@PreAuthorize(`@ss.hasPermission('system:user:list')`)",
+    cache5: '访问的路由地址,如:`user`。如需外网地址时,则以 `http(s)://` 开头',
+    cache6: '例如说:SystemUser',
+    pushSucceeded: '推送成功',
+    isItNecessaryToPushTheSelectedNotification: '是否推送所选中通知?',
+    sendingTime: '发送时间',
+    receivingEmail: '接收邮箱',
+    userId: '用户编号',
+    userType: '用户类型',
+    emailTitle: '邮件标题',
+    emailContent: '邮件内容',
+    emailParameters: '邮箱参数',
+    sendingStatus: '发送状态',
+    emailAccount: '邮箱账号',
+    sendingEmailAddress: '发送邮箱地址',
+    templateNumber: '模板编号',
+    templateCode: '模板编码',
+    templateSenderName: '模版发送人名称',
+    sendingReturnedMessageNumber: '发送返回的消息编号',
+    sendingException: '发送异常',
+    test: '测试',
+    templateContent: '模板内容',
+    recipientEmail: '收件邮箱',
+    enterRecipientEmail: '输入收件邮箱',
+    pleaseEnter: '请输入',
+    emailCannotBeEmpty: '邮箱不能为空',
+    templateNumberCannotBeEmpty: '模版编号不能为空',
+    templateName: '模板名称',
+    templateTitle: '模板标题',
+    senderName: '发送人名称',
+    enableStatus: '开启状态',
+    remarks: '备注',
+    menuName: '菜单名称',
+    pleaseEnterMenuName: '请输入菜单名称',
+    pleaseSelectMenuStatus: '请选择菜单状态',
+    refreshMenuCache: '刷新菜单缓存',
+    permissionIdentity: '权限标识',
+    componentPath: '组件路径',
+    componentName: '组件名称',
+    browserShow: '即将更新缓存刷新浏览器!',
+    parentMenu: '上级菜单',
+    menuType: '菜单类型',
+    menuIcon: '菜单图标',
+    routeAddress: '路由地址',
+    componentAddress: '组件地址',
+    menuStatus: '菜单状态',
+    displayStatus: '显示状态',
+    alwaysDisplay: '总是显示',
+    pleaseEnterRouteAddress: '请输入路由地址',
+    pleaseEnterPermissionIdentity: '请输入权限标识',
+    menuNameCannotBeEmpty: '菜单名称不能为空',
+    menuOrderCannotBeEmpty: '菜单顺序不能为空',
+    routeAddressCannotBeEmpty: '路由地址不能为空',
+    thePathMustStartWith: '路径必须以 / 开头',
+    thePathCannotStartWith: '路径不能以 / 开头',
+    mainCategory: '主类目',
+    announcementTitle: '公告标题',
+    announcementStatus: '公告状态',
+    announcementNumber: '公告编号',
+    coverImage: '封面图片',
+    announcementType: '公告类型',
+    pleaseEnterAnnouncementTitle: '请输入公告标题',
+    pleaseSelectAnnouncementStatus: '请选择公告状态',
+    push: '推送',
+    announcementContent: '公告内容',
+    pleaseSelectAnnouncementType: '请选择公告类型',
+    pleaseEnterRemarks: '请输备注',
+    announcementTitleCannotBeEmpty: '公告标题不能为空',
+    coverImageCannotBeEmpty: '封面图不能为空',
+    announcementTypeCannotBeEmpty: '公告类型不能为空',
+    announcementContentCannotBeEmpty: '公告内容不能为空',
+    templateType: '模版类型',
+    templateParameters: '模版参数',
+    isRead: '是否已读',
+    readingTime: '阅读时间',
+    pleaseEnterUserId: '请输入用户编号',
+    pleaseSelectUserType: '请选择用户类型',
+    pleaseEnterTemplateCode: '请输入模板编码',
+    pleaseSelectTemplateType: '请选择模版类型',
+    markAsRead: '标记已读',
+    markAllAsRead: '全部已读',
+    sender: '发送人',
+    messageContent: '消息内容',
+    read: '已读',
+    messageDetails: '消息详情',
+    pleaseEnterTemplateName: '请输入模板名称',
+    pleaseSelectEnableStatus: '请选择开启状态',
+    pleaseEnterSenderName: '请输入发件人名称',
+    pleaseEnterTemplateContent: '请输入模板内容',
+    messageTypeCannotBeEmpty: '消息类型不能为空',
+    enableStatusCannotBeEmpty: '开启状态不能为空',
+    templateCodeCannotBeEmpty: '模板编码不能为空',
+    templateNameCannotBeEmpty: '模板名称不能为空',
+    senderNameCannotBeEmpty: '发件人姓名不能为空',
+    templateContentCannotBeEmpty: '模板内容不能为空',
+    additionSuccessful: '新增成功',
+    ModificationSuccessful: '修改成功',
+    recipientID: '接收人ID',
+    recipient: '接收人',
+    redirectableURIAddress: '可重定向的 URI 地址',
+    pleaseEnterRedirectableURIAddress: '请输入可重定向的 URI 地址',
+    pleaseSelectRecipient: '请选择接收人',
+    userIdCannotBeEmpty: '用户编号不能为空',
+    submissionAndSendingWereSuccessfulTheSendingResultPleaseReferToTheSendingLogNumber: '提交发送成功!发送结果,见发送日志编号:',
+    clientNumber: '客户端编号',
+    clientSecretKey: '客户端密钥',
+    appName: '应用名',
+    appIcon: '应用图标',
+    appDescription: '应用描述',
+    validityPeriodOfAccessToken: '访问令牌的有效期',
+    validityPeriodOfRefreshToken: '刷新令牌的有效期',
+    authorizationType: '授权类型',
+    authorizationScope: '授权范围',
+    automaticAuthorizationScope: '自动授权范围',
+    redirectable: '可重定向的',
+    permissions: '权限',
+    resources: '资源',
+    additionalInformation: '附加信息',
+    pleaseEnterClientNumber: '请输入客户端编号',
+    pleaseEnterClientSecretKey: '请输入客户端密钥',
+    pleaseEnterAppName: '请输入应用名',
+    unitSeconds: '单位:秒',
+    pleaseEnterAuthorizationType: '请输入授权类型',
+    pleaseEnterAuthorizationScope: '请输入授权范围',
+    pleaseEnterRedirectable: '请输入可重定向的',
+    pleaseEnterPermissions: '请输入权限',
+    pleaseEnterResources: '请输入资源',
+    pleaseEnterAdditionalInformationJSON: '请输入附加信息,JSON 格式数据',
+    clientNumberCannotBeEmpty: '客户端编号不能为空',
+    clientSecretKeyCannotBeEmpty: '客户端密钥不能为空',
+    appNameCannotBeEmpty: '应用名不能为空',
+    appIconCannotBeEmpty: '应用图标不能为空',
+    validityPeriodOfAccessTokenCannotBeEmpty: '访问令牌的有效期不能为空',
+    validityPeriodOfRefreshTokenCannotBeEmpty: '刷新令牌的有效期不能为空',
+    redirectableURIAddressCannotBeEmpty: '可重定向的 URI 地址不能为空',
+    authorizationTypeCannotBeEmpty: '授权类型不能为空',
+    whetherToForceTheUserToLogOut: '是否要强制退出用户',
+    forceLogout: '强退',
+    clientId: '客户端编号',
+    accessToken: '访问令牌',
+    refreshToken: '刷新令牌',
+    expirationTime: '过期时间',
+    pleaseEnterClientId: '请输入客户端编号',
+    operator: '操作人',
+    operationModule: '操作模块',
+    operationContent: '操作内容',
+    operationTime: '操作时间',
+    businessNumber: '业务编号',
+    operatorLogXls: '操作人',
+    operationName: '操作名',
+    IP: 'IP',
+    pleaseEnterOperator: '请输入操作人员',
+    pleaseEnterOperationModule: '请输入操作模块',
+    pleaseEnterOperationName: '请输入操作名',
+    pleaseEnterBusinessNumber: '请输入业务编号',
+    logPrimaryKey: '日志主键',
+    linkTracing: '链路追踪',
+    operatorId: '操作人编号',
+    operatorName: '操作人名字',
+    operatorIP: '操作人IP',
+    operatorUA: '操作人UA',
+    operationExtendedParameters: '操作拓展参数',
+    requestURL: '请求URL',
+    positionName: '岗位名称',
+    positionCode: '岗位编码',
+    positionNumber: '岗位编号',
+    positionOrder: '岗位顺序',
+    positionRemarks: '岗位备注',
+    pleaseEnterPositionName: '请输入岗位名称',
+    pleaseEnterPositionCode: '请输入岗位编码',
+    positionListXls: '岗位列表.xls',
+    positionTitle: '岗位标题',
+    pleaseEnterPositionTitle: '请输入岗位标题',
+    pleaseEnterPositionOrder: '请输入岗位顺序',
+    positionTitleCannotBeEmpty: '岗位标题不能为空',
+    positionCodeCannotBeEmpty: '岗位编码不能为空',
+    positionStatusCannotBeEmpty: '岗位状态不能为空',
+    positionContentCannotBeEmpty: '岗位内容不能为空',
+    roleName: '角色名称',
+    roleIdentity: '角色标识',
+    roleNumber: '角色编号',
+    roleType: '角色类型',
+    displayOrder: '显示顺序',
+    pleaseEnterRoleName: '请输入角色名称',
+    pleaseEnterRoleIdentity: '请输入角色标识',
+    menuPermissions: '菜单权限',
+    dataPermissions: '数据权限',
+    selectAllDeselectAll: '全选/全不选:',
+    expandAllCollapseAll: '全部展开/折叠:',
+    permissionScope: '权限范围',
+    pleaseEnterDisplayOrder: '请输入显示顺序',
+    roleNameCannotBeEmpty: '角色名称不能为空',
+    roleIdentityCannotBeEmpty: '角色标识不能为空',
+    remarksCannotBeEmpty: '备注不能为空',
+    roleListXls: '角色列表.xls',
+    parentChildLinkage: '父子联动(选中父节点,自动选择子节点):',
+    loadingPleaseWaitAMoment: '加载中,请稍后',
+    pleaseSelectChannelCode: '请选择渠道编码',
+    smsSignatureCannotBeEmpty: '短信签名不能为空',
+    channelCodeCannotBeEmpty: '渠道编码不能为空',
+    theAccountOfSmsAPICannotBeEmpty: '短信  API 的账号不能为空',
+    theAccountOfSmsAPI: '短信 API 的账号',
+    theSecretKeyOfSmsAPI: '短信 API 的密钥',
+    smsSendingCallbackURL: '短信发送回调 URL',
+    pleaseEntertheAccountOfSmsAPI: '请输入短信 API 的账号',
+    pleaseEntertheSecretKeyOfSmsAPI: '请输入短信 API 的密钥',
+    pleaseEnterSmsSendingCallbackURL: '请输入短信发送回调 URL',
+    smsLogXls: '短信日志.xls',
+    smsSignature: '短信签名',
+    channelCode: '渠道编码',
+    sms: '短信',
+    smsSendingCallback: '短信发送回调',
+    pleaseEnterSmsSignature: '请输入短信签名',
+    phoneNumber: '手机号',
+    smsChannel: '短信渠道',
+    receivingStatus: '接收状态',
+    receivingTime: '接收时间',
+    smsContent: '短信内容',
+    templateNumberOfSmsAPI: '短信 API 的模板编号',
+    pleaseEnterTemplateNumberOfSmsAPI: '请输入短信 API 的模板编号',
+    smsTemplateXls: '短信模板.xls',
+    smsType: '短信类型',
+    pleaseEnterPhoneNumber: '请输入手机号',
+    pleaseSelectSmsChannel: '请选择短信渠道',
+    pleaseEnterTemplateNumber: '请输入模板编号',
+    pleaseSelectSendingStatus: '请选择发送状态',
+    pleaseSelectReceivingStatus: '请选择接收状态',
+    smsTemplate: '短信模板',
+    templateNumberOfAPI: 'API 的模板编号',
+    userInformation: '用户信息',
+    smsParameters: '短信参数',
+    APIsmsResult: 'API 发送结果',
+    APIsmsNumber: 'API 短信编号',
+    APIrequestNumber: 'API 请求编号',
+    APIreceivingStatus: 'API 接收状态',
+    APIreceivingResult: 'API 接收结果',
+    smsChannelNumber: '短信渠道编号',
+    smsAPITemplateNumber: '短信 API 模板编号',
+    pleaseSelectSmsChannelNumber: '请选择短信渠道编号',
+    pleaseSelectSmsType: '请选择短信类型',
+    pleaseEnterSms: '请输入短信 API 的模板编号',
+    pleaseEnterTheTemplateNumberOfTheSmsAPI: '请输入短信 API 的模板编号',
+    phoneNumberCannotBeEmpty: '手机不能为空',
+    smsTypeCannotBeEmpty: '短信类型不能为空',
+    theTemplateNumberOfTheSmsAPICannotBeEmpty: '短信 API 的模板编号不能为空',
+    smsChannelNumberCannotBeEmpty: '短信渠道编号不能为空',
+    submitTips: '提交发送成功!发送结果,见发送日志编号:',
+    pleaseSelectSocialPlatform: '请选择社交平台',
+    pleaseEnterClientNumberTips: '请输入客户端编号,对应各平台的appKey',
+    pleaseEnterClientSecretKeyTips: '请输入客户端密钥,对应各平台的appSecret',
+    authorizedPartyWebApplicationTips: '授权方的网页应用 ID,有则填',
+    socialPlatformCannotBeEmpty: '社交平台不能为空',
+    userTypeCannotBeEmpty: '用户类型不能为空',
+    socialOpenid: '社交 openid',
+    pleaseEnterSocialOpenid: '请输入社交 openid',
+    social: '社交',
+    updateTime: '更新时间',
+    socialPlatform: '社交平台',
+    userAvatar: '用户头像',
+    socialToken: '社交 token',
+    originalTokenData: '原始 Token 数据',
+    originalUserData: '原始 User 数据',
+    lastAuthenticationCode: '最后一次的认证 code',
+    lastAuthenticationState: '最后一次的认证 state',
+    tenantName: '租户名',
+    contactPerson: '联系人',
+    tenantStatus: '租户状态',
+    tenantId: '租户编号',
+    tenantPackage: '租户套餐',
+    accountQuota: '账号额度',
+    boundDomainName: '绑定域名',
+    pleaseEnterTenantName: '请输入租户名',
+    pleaseEnterContactPerson: '请输入联系人',
+    pleaseEnterContactPhoneNumber: '请输入联系手机',
+    pleaseSelectTenantStatus: '请选择租户状态',
+    systemTenant: '系统租户',
+    tenantListXls: '租户列表.xls',
+    tenantNameCannotBeEmpty: '租户名不能为空',
+    tenantPackageCannotBeEmpty: '租户套餐不能为空',
+    contactPersonCannotBeEmpty: '联系人不能为空',
+    tenantStatusCannotBeEmpty: '租户状态不能为空',
+    accountQuotaCannotBeEmpty: '账号额度不能为空',
+    expirationTimeCannotBeEmpty: '过期时间不能为空',
+    boundDomainNameCannotBeEmpty: '绑定域名不能为空',
+    userNameCannotBeEmpty: '用户名称不能为空',
+    userPasswordCannotBeEmpty: '用户密码不能为空',
+    userPassword: '用户密码',
+    pleaseSelectTenantPackage: '请选择租户套餐',
+    loadingPleaseWaitAWhile: '加载中,请稍候',
+    packageNameCannotBeEmpty: '套餐名不能为空',
+    associatedMenuNumberCannotBeEmpty: '关联的菜单编号不能为空',
+    pleaseEnterUserPassword: '请输入用户密码',
+    pleaseEnterAccountQuota: '请输入账号额度',
+    pleaseSelectExpirationTime: '请选择过期时间',
+    pleaseEnterBoundDomainName: '请输入绑定域名',
+    packageName: '套餐名',
+    packageNumber: '套餐编号',
+    pleaseEnterPackageName: '请输入套餐名',
+    menuPermission: '菜单权限',
+    department: '部门',
+    userStatus: '用户状态',
+    userDataXls: '用户数据.xls',
+    assignRole: '分配角色',
+    role: '角色',
+    pleaseSelectRole: '请选择角色',
+    affiliatedDepartment: '归属部门',
+    userGender: '用户性别',
+    position: '岗位',
+    pleaseSelectAffiliatedDepartment: '请选择归属部门',
+    pleaseEnterEmail: '请输入邮箱',
+    userNicknameCannotBeEmpty: '用户昵称不能为空',
+    pleaseEnterTheCorrectPhoneNumber: '请输入正确的手机号码',
+    modificationSucceededTheNewPasswordIs: '修改成功,新密码是:',
+    userImport: '用户导入',
+    dragTheFileHereOr: '将文件拖到此处,或',
+    clickToUpload: '点击上传',
+    whetherToUpdateExistingUserData: '是否更新已经存在的用户数据',
+    onlyFilesInXlsAndXlsxFormatsAreAllowedForImport: '仅允许导入 xls、xlsx 格式文件。',
+    downloadTemplate: '下载模板',
+    uploadFailedPleaseUploadAgain: '上传失败,请您重新上传!',
+    atMostOnlyOneFileCanBeUploaded: '最多只能上传一个文件!',
+    userImportTemplateXls: '用户导入模版.xls',
+    numberOfSuccessfulUploads: '上传成功数量:',
+    numberOfFailedUploads: '上传成功数量:',
+    numberOfFailedUpdates: '更新失败数量:',
+    pleaseUploadTheFile: '请上传文件'
+  },
+  public: {
+    all: '全部',
+    sort: '排序',
+    operate: '操作',
+    status: '状态',
+    startDate: '开始日期',
+    endDate: '结束日期',
+    delete: '删除',
+    createTime: '创建时间',
+    update: '修改',
+    none: '无',
+    close: '关闭',
+    normal: '正常',
+    addTime: '添加时间',
+    no: '否',
+    yes: '是',
+    more: '更多',
+    startTime: '开始时间',
+    endTime: '结束时间',
+    up: '上架',
+    down: '下架',
+    enable: '启用',
+    disable: '禁用',
+    remark: '备注',
+    pleaseEnterNotes: '请输入备注',
+    expand: '展开',
+    collapse: '折叠',
+    scord: '秒'
+  },
   'OAuth 2.0': 'OAuth 2.0' // 避免菜单名是 OAuth 2.0 时,一直 warn 报错
 }

+ 1 - 1
src/plugins/vueI18n/index.ts

@@ -24,7 +24,7 @@ const createI18nOptions = async (): Promise<I18nOptions> => {
     legacy: false,
     locale: locale.lang,
     fallbackLocale: locale.lang,
-    globalInjection: true,
+    // globalInjection: true,
     messages: {
       [locale.lang]: message
     },

+ 21 - 21
src/views/Home/Index.vue

@@ -6,16 +6,16 @@
           <el-card :bordered="false" dis-hover :padding="12">
             <template #header>
               <div  class="acea-row row-between-wrapper">
-                <span>{{$t('index.totalMembers')}}</span> 
-                <el-tag type="success">{{$t('index.allStores')}}</el-tag>
+                <span>{{t('home.totalMembers')}}</span> 
+                <el-tag type="success">{{t('home.allStores')}}</el-tag>
               </div>
             </template>
             <div class="content" v-if="count">
               <span class="content-number spBlock mb15"><count-to :start-val="0" :end-val="count.userCount" :duration="2600" class="card-panel-num" /></span>
               <el-divider />
               <div class="acea-row row-between-wrapper">
-                <span class="content-time">{{$t('index.todayOrderCount')}}</span>
-                <span>{{ count.todayCount }} {{$t('index.orders')}}</span>
+                <span class="content-time">{{t('home.todayOrderCount')}}</span>
+                <span>{{ count.todayCount }} {{t('home.orders')}}</span>
               </div>
             </div>
           </el-card>
@@ -24,7 +24,7 @@
           <el-card :bordered="false" dis-hover :padding="12">
             <template #header>
               <div class="acea-row row-between-wrapper">
-                <span>{{$t('index.totalOrderCount')}}</span>
+                <span>{{t('home.totalOrderCount')}}</span>
                 <el-tag type="success">{{countName}}</el-tag>
               </div>
             </template>
@@ -32,8 +32,8 @@
               <span class="content-number spBlock mb15"><count-to :start-val="0" :end-val="count.orderCount" :duration="3000" class="card-panel-num" /></span>
               <el-divider />
               <div class="acea-row row-between-wrapper">
-                <span class="content-time">{{$t('index.yesterdaysOrderCount')}}</span>
-                <span>{{ count.proCount }} {{$t('index.orders')}}</span>
+                <span class="content-time">{{t('home.yesterdaysOrderCount')}}</span>
+                <span>{{ count.proCount }} {{t('home.orders')}}</span>
               </div>
             </div>
           </el-card>
@@ -42,7 +42,7 @@
           <el-card :bordered="false" dis-hover :padding="12">
             <template #header>
               <div  class="acea-row row-between-wrapper">
-                <span>{{$t('index.totalAmount')}}</span>
+                <span>{{t('home.totalAmount')}}</span>
                 <el-tag type="success">{{countName}}</el-tag>
               </div>
             </template>
@@ -50,8 +50,8 @@
               <span class="content-number spBlock mb15"><count-to :start-val="0" :end-val="count.priceCount" :duration="3200" class="card-panel-num" /></span>
               <el-divider />
               <div class="acea-row row-between-wrapper">
-                <span class="content-time">{{$t('index.last7DaysOrderCount')}}</span>
-                <span>{{ count.lastWeekCount }} {{$t('index.orders')}}</span>
+                <span class="content-time">{{t('home.last7DaysOrderCount')}}</span>
+                <span>{{ count.lastWeekCount }} {{t('home.orders')}}</span>
               </div>
             </div>
           </el-card>
@@ -60,7 +60,7 @@
           <el-card :bordered="false" dis-hover :padding="12">
             <template #header>
               <div class="acea-row row-between-wrapper">
-                <span>{{$t('index.totalProductCount')}}</span>
+                <span>{{t('home.totalProductCount')}}</span>
                 <el-tag type="success">{{countName}}</el-tag>
               </div>
             </template>
@@ -68,8 +68,8 @@
               <span class="content-number spBlock mb15"><count-to :start-val="0" :end-val="count.goodsCount" :duration="3600" class="card-panel-num" /></span>
               <el-divider />
               <div class="acea-row row-between-wrapper">
-                <span class="content-time">{{$t('index.thisMonthOrderCount')}}</span>
-                <span>{{ count.monthCount }} {{$t('index.orders')}}</span>
+                <span class="content-time">{{t('home.thisMonthOrderCount')}}</span>
+                <span>{{ count.monthCount }} {{t('home.orders')}}</span>
               </div>
             </div>
           </el-card>
@@ -83,14 +83,14 @@
           <el-card shadow="never" class="mt-10px">
             <template #header>
               <div style="font-weight:bold">
-                {{$t('index.productSalesRanking')}}({{countName}})
+                {{t('home.productSalesRanking')}}({{countName}})
               </div>
             </template>
             <el-skeleton :loading="loading" animated>
               <el-table :data="count.productTopVO" style="width: 100%">
                 <el-table-column prop="id" label="ID" />
-                <el-table-column prop="goodsName" :label="$t('index.productName')" />
-                <el-table-column prop="saleNum" :label="$t('index.salesVolume')" />
+                <el-table-column prop="goodsName" :label="t('home.productName')" />
+                <el-table-column prop="saleNum" :label="t('home.salesVolume')" />
               </el-table>
             </el-skeleton>
           </el-card>
@@ -99,14 +99,14 @@
           <el-card shadow="never" class="mt-10px">
             <template #header>
               <div style="font-weight:bold">
-                {{$t('index.userSpendingRankingAllStores')}}
+                {{t('home.userSpendingRankingAllStores')}}
               </div>
             </template>
             <el-skeleton :loading="loading" animated>
               <el-table :data="count.userTopVO" style="width: 100%">
                 <el-table-column prop="id" label="ID" />
-                <el-table-column prop="nickname" :label="$t('login.username')" />
-                <el-table-column prop="price" :label="$t('index.consumptionAmount')" />
+                <el-table-column prop="nickname" :label="t('login.username')" />
+                <el-table-column prop="price" :label="t('home.consumptionAmount')" />
               </el-table>
             </el-skeleton>
           </el-card>
@@ -126,7 +126,7 @@ const userStore = useUserStore()
 const avatar = userStore.getUser.avatar ? userStore.getUser.avatar : avatarImg
 const shopId = userStore.getUser.shopId
 const { t } = useI18n()
-const countName = ref(t('index.allStores'))
+const countName = ref(t('home.allStores'))
 const count = ref({
         todayPrice: 0,
         todayCount: 0,
@@ -170,7 +170,7 @@ const getList = async () => {
 /** 初始化 **/
 onMounted(() => {
   if(shopId > 0) {
-    countName.value = t('index.currentStore')
+    countName.value = t('home.currentStore')
   }
   getData()
   getList()

+ 9 - 8
src/views/Home/PanelGroupT.vue

@@ -5,7 +5,7 @@
           <el-card :bordered="false">
             <router-link :to="{ path: '/product/store-product' }">
                <Icon icon="ep:goods" style="color: #69c0ff" :size="35" />
-              <p>商品管理</p>
+              <p>{{t('home.productManagement')}}</p>
             </router-link>
           </el-card>
         </el-col>
@@ -13,7 +13,7 @@
           <el-card :bordered="false">
             <router-link :to="{ path: '/member/user' }">
               <Icon icon="ep:user" style="color: #95de64" :size="35" />
-              <p>会员管理</p>
+              <p>{{t('home.memberManagement')}}</p>
             </router-link>
           </el-card>
         </el-col>
@@ -21,7 +21,7 @@
           <el-card :bordered="false">
             <router-link :to="{ path: '/order/store-order' }">
               <Icon icon="ep:list" style="color: #ff9c6e" :size="35" />
-              <p>订单管理</p>
+              <p>{{t('home.orderManagement')}}</p>
             </router-link>
           </el-card>
         </el-col>
@@ -29,7 +29,7 @@
           <el-card :bordered="false">
             <router-link :to="{ path: '/mall/coupons' }">
               <Icon icon="ep:ticket" style="color: #b37feb" :size="35" />
-              <p>优惠券管理</p>
+              <p>{{t('home.couponManagement')}}</p>
             </router-link>
           </el-card>
         </el-col>
@@ -37,7 +37,7 @@
           <el-card :bordered="false">
             <router-link :to="{ path: '/shop/web-print' }">
                <Icon icon="ep:postcard" style="color: #ffd666" :size="35" />
-              <p>打印机管理</p>
+              <p>{{t('home.printerManagement')}}</p>
             </router-link>
           </el-card>
         </el-col>
@@ -45,7 +45,7 @@
           <el-card :bordered="false">
             <router-link :to="{ path: '/shop/shop' }" >
                <Icon icon="ep:notebook" style="color: #5cdbd3" :size="35" />
-              <p>门店管理</p>
+              <p>{{t('home.storeManagement')}}</p>
             </router-link>
           </el-card>
         </el-col>
@@ -53,7 +53,7 @@
           <el-card :bordered="false">
             <router-link :to="{ path: '/pay/merchant-details' }">
               <Icon icon="ep:money" style="color: #ff85c0" :size="35" />
-              <p>支付管理</p>
+              <p>{{t('home.paymentManagement')}}</p>
             </router-link>
           </el-card>
         </el-col>
@@ -61,7 +61,7 @@
           <el-card :bordered="false">
             <router-link :to="{ path: '/message/wechat-templateo' }">
               <Icon icon="ep:message" style="color: #ffc069" :size="35" />
-              <p>消息管理</p>
+              <p>{{t('home.messageManagement')}}</p>
             </router-link>
           </el-card>
         </el-col>
@@ -72,6 +72,7 @@
 import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
 
 const { wsCache } = useCache()
+const { t } = useI18n()
 
 
 const grid =ref({

+ 3 - 0
src/views/Home/echarts-data.ts

@@ -306,3 +306,6 @@ export const wordOptions = {
     }
   ]
 }
+
+
+

+ 1 - 1
src/views/Login/SocialLogin.vue

@@ -289,7 +289,7 @@ const handleLogin = async (params) => {
     }
     loading.value = ElLoading.service({
       lock: true,
-      text: '正在加载系统中...',
+      text: t('login.loadingSystem'),
       background: 'rgba(0, 0, 0, 0.7)'
     })
     if (loginData.loginForm.rememberMe) {

+ 1 - 1
src/views/Login/components/LoginForm.vue

@@ -181,7 +181,7 @@ const handleLogin = async (params) => {
     }
     ElLoading.service({
       lock: true,
-      text: '正在加载系统中...',
+      text: t('login.loadingSystem'),
       background: 'rgba(0, 0, 0, 0.7)'
     })
     if (loginData.loginForm.rememberMe) {

+ 3 - 3
src/views/Login/components/MobileForm.vue

@@ -58,7 +58,7 @@
                     {{ t('login.getSmsCode') }}
                   </span>
                   <span v-if="mobileCodeTimer > 0" class="getMobileCode" style="cursor: pointer">
-                    {{ mobileCodeTimer }}秒后可重新获取
+                    {{ mobileCodeTimer }}{{t('login.retrievableAfterSeconds')}}
                   </span>
                 </template>
               </el-input>
@@ -133,7 +133,7 @@ const loginData = reactive({
   },
   loginForm: {
     uuid: '',
-    tenantName: 'YSHOP源码',
+    tenantName: t('login.YSHOPSourceCode'),
     mobileNumber: '',
     code: ''
   }
@@ -188,7 +188,7 @@ const signIn = async () => {
   if (!data) return
   ElLoading.service({
     lock: true,
-    text: '正在加载系统中...',
+    text: t('login.loadingSystem'),
     background: 'rgba(0, 0, 0, 0.7)'
   })
   loginLoading.value = true

+ 7 - 6
src/views/Login/components/SSOLogin.vue

@@ -8,7 +8,7 @@
     <div>
       <el-form :model="formData" class="login-form">
         <!-- 授权范围的选择 -->
-        此第三方应用请求获得以下权限:
+        {{t('login.thisThirdPartyApplicationRequestsTheFollowingPermissions')}}
         <el-form-item prop="scopes">
           <el-checkbox-group v-model="formData.scopes">
             <el-checkbox
@@ -29,10 +29,10 @@
             type="primary"
             @click.prevent="handleAuthorize(true)"
           >
-            <span v-if="!formLoading">同意授权</span>
-            <span v-else>授 权 中...</span>
+            <span v-if="!formLoading">{{t('login.agreeToAuthorization')}}</span>
+            <span v-else>{{t('login.authorizationIn')}}</span>
           </el-button>
-          <el-button class="w-3/10" @click.prevent="handleAuthorize(false)">拒绝</el-button>
+          <el-button class="w-3/10" @click.prevent="handleAuthorize(false)">{{t('login.rejection')}}</el-button>
         </el-form-item>
       </el-form>
     </div>
@@ -43,6 +43,7 @@ import LoginFormTitle from './LoginFormTitle.vue'
 import * as OAuth2Api from '@/api/login/oauth2'
 import { LoginStateEnum, useLoginState } from './useLogin'
 import type { RouteLocationNormalizedLoaded } from 'vue-router'
+const { t } = useI18n()
 
 defineOptions({ name: 'SSOLogin' })
 
@@ -177,9 +178,9 @@ const formatScope = (scope) => {
   // 这里仅仅是一个 demo,可以考虑录入到字典数据中,例如说字典类型 "system_oauth2_scope",它的每个 scope 都是一条字典数据。
   switch (scope) {
     case 'user.read':
-      return '访问你的个人信息'
+      return t('login.accessYourPersonalInformation')
     case 'user.write':
-      return '修改你的个人信息'
+      return t('login.modifyYourPersonalInformation')
     default:
       return scope
   }

+ 1 - 0
src/views/Profile/components/UserAvatar.vue

@@ -15,6 +15,7 @@ import { propTypes } from '@/utils/propTypes'
 import { uploadAvatar } from '@/api/system/user/profile'
 import { CropperAvatar } from '@/components/Cropper'
 import { useUserStore } from '@/store/modules/user'
+const { t } = useI18n()
 
 
 defineOptions({ name: 'UserAvatar' })

+ 10 - 9
src/views/Profile/components/UserSocial.vue

@@ -1,21 +1,21 @@
 <template>
   <el-table :data="socialUsers" :show-header="false">
-    <el-table-column fixed="left" title="序号" type="seq" width="60" />
-    <el-table-column align="left" label="社交平台" width="120">
+    <el-table-column fixed="left" :title="t('profile.serialNumber')" type="seq" width="60" />
+    <el-table-column align="left" :label="t('profile.socialPlatform')" width="120">
       <template #default="{ row }">
         <img :src="row.img" alt="" class="h-5 align-middle" />
         <p class="mr-5">{{ row.title }}</p>
       </template>
     </el-table-column>
-    <el-table-column align="center" label="操作">
+    <el-table-column align="center" :label="t('public.operate')">
       <template #default="{ row }">
         <template v-if="row.openid">
-          已绑定
-          <XTextButton class="mr-5" title="(解绑)" type="primary" @click="unbind(row)" />
+          {{t('profile.bound')}}
+          <XTextButton class="mr-5" :title="t('profile.bound')" type="primary" @click="unbind(row)" />
         </template>
         <template v-else>
-          未绑定
-          <XTextButton class="mr-5" title="(绑定)" type="primary" @click="bind(row)" />
+          {{t('profile.unbound')}}
+          <XTextButton class="mr-5" :title="t('profile.bound1')" type="primary" @click="bind(row)" />
         </template>
       </template>
     </el-table-column>
@@ -25,6 +25,7 @@
 import { SystemUserSocialTypeEnum } from '@/utils/constants'
 import { getUserProfile, ProfileVO } from '@/api/system/user/profile'
 import { socialAuthRedirect, socialBind, socialUnbind } from '@/api/system/user/socialUser'
+const { t } = useI18n()
 
 defineOptions({ name: 'UserSocial' })
 defineProps<{
@@ -64,7 +65,7 @@ const bindSocial = () => {
     return
   }
   socialBind(type, code, state).then(() => {
-    message.success('绑定成功')
+    message.success(t('profile.boundSuccessfully'))
     emit('update:activeName', 'userSocial')
   })
 }
@@ -88,7 +89,7 @@ const unbind = async (row) => {
   if (res) {
     row.openid = undefined
   }
-  message.success('解绑成功')
+  message.success(t('profile.unboundSuccessfully'))
 }
 
 onMounted(async () => {

+ 11 - 11
src/views/express/ExpressForm.vue

@@ -7,19 +7,19 @@
       label-width="120px"
       v-loading="formLoading"
     >
-      <el-form-item label="快递公司编号" prop="code">
-        <el-input v-model="formData.code" placeholder="请输入快递公司编号" />
+      <el-form-item :label="t('express.courierCompanyNumber')" prop="code">
+        <el-input v-model="formData.code" :placeholder="t('express.pleaseEnterTheCourierCompanyNumber')" />
       </el-form-item>
-      <el-form-item label="快递公司全称" prop="name">
-        <el-input v-model="formData.name" placeholder="请输入快递公司全称" />
+      <el-form-item :label="t('express.fullNameOfCourierCompany')" prop="name">
+        <el-input v-model="formData.name" :placeholder="t('express.pleaseEnterTheFullNameOfCourierCompany')" />
       </el-form-item>
-      <el-form-item label="排序" prop="sort">
-        <el-input v-model="formData.sort" placeholder="请输入排序" />
+      <el-form-item :label="t('express.sort')" prop="sort">
+        <el-input v-model="formData.sort" :placeholder="t('express.pleaseEnterTheSort')" />
       </el-form-item>
     </el-form>
     <template #footer>
-      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>
@@ -40,9 +40,9 @@ const formData = ref({
   sort: undefined
 })
 const formRules = reactive({
-  code: [{ required: true, message: '快递公司简称不能为空', trigger: 'blur' }],
-  name: [{ required: true, message: '快递公司全称不能为空', trigger: 'blur' }],
-  sort: [{ required: true, message: '排序不能为空', trigger: 'blur' }]
+  code: [{ required: true, message: t('express.theAbbreviationCourierCompanyEmpty'), trigger: 'blur' }],
+  name: [{ required: true, message: t('express.fullNameCourierCompanyEmpty'), trigger: 'blur' }],
+  sort: [{ required: true, message: t('express.sortCannotEmpty'), trigger: 'blur' }]
 })
 const formRef = ref() // 表单 Ref
 

+ 11 - 11
src/views/express/ExpressSet.vue

@@ -8,24 +8,24 @@
       v-loading="formLoading"
     >
       <el-form-item label="appId" prop="eBusinessID">
-        <el-input v-model="formData.ebusinessID" placeholder="请输入快递鸟appId" />
+        <el-input v-model="formData.ebusinessID" :placeholder="t('express.pleaseEnterTheCourierBirdAppId')" />
       </el-form-item>
       <el-form-item label="appKey" prop="apiKey">
-        <el-input v-model="formData.apiKey" type="password" placeholder="请输入快递鸟appKey" />
+        <el-input v-model="formData.apiKey" type="password" :placeholder="t('express.pleaseEnterTheCourierBirdAppKey')" />
       </el-form-item>
-      <el-form-item label="是否收费套餐" prop="isFree">
+      <el-form-item :label="t('express.isPaidPackage')" prop="isFree">
         <el-radio-group v-model="formData.isFree">
-          <el-radio :label="false"></el-radio>
-          <el-radio :label="true"></el-radio>
+          <el-radio :label="false">{{t('common.yes')}}</el-radio>
+          <el-radio :label="true">{{t('common.no')}}</el-radio>
         </el-radio-group>
       </el-form-item>
       <el-form-item label=" " prop="">
-        <el-button @click="submitForm" type="primary">确 定</el-button>
-        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button @click="submitForm" type="primary">{{t('common.confirm')}}</el-button>
+        <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
       </el-form-item>
       <el-form-item label=" " prop="">
-        <span><span style="color: red;">yshop-pro系统使用的第三方快递鸟api实现了快递查询,注册地址请点击,</span>
-          <a href="http://www.kdniao.com/reg?from=cbb-yx " style="color:blue">我注册!</a></span>
+        <span><span style="color: red;">{{t('express.theThirdPartyTips')}}</span>
+          <a href="http://www.kdniao.com/reg?from=cbb-yx " style="color:blue">{{t('express.iRegister')}}</a></span>
       </el-form-item>
     </el-form>
     </div>
@@ -47,8 +47,8 @@ const formData = ref({
 
 })
 const formRules = reactive({
-  appId: [{ required: true, message: '快递鸟appId不能为空', trigger: 'blur' }],
-  appKey: [{ required: true, message: '快递鸟appKey不能为空', trigger: 'blur' }]
+  appId: [{ required: true, message: t('express.courierBirdAppIdCannotBeEmpty'), trigger: 'blur' }],
+  appKey: [{ required: true, message: t('express.courierBirdAppKeyCannotBeEmpty'), trigger: 'blur' }]
 })
 const formRef = ref() // 表单 Ref
 

+ 17 - 17
src/views/express/index.vue

@@ -8,34 +8,34 @@
       :inline="true"
       label-width="68px"
     >
-      <el-form-item label="公司编码" prop="code">
+      <el-form-item :label="t('express.ompanyCode')" prop="code">
         <el-input
           v-model="queryParams.code"
-          placeholder="请输入快递公司编码"
+          :placeholder="t('express.pleaseEnterTheCourierCompanyCode')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="公司全称" prop="name">
+      <el-form-item :label="t('express.companyFullName')" prop="name">
         <el-input
           v-model="queryParams.name"
-          placeholder="请输入快递公司全称"
+          :placeholder="t('express.pleaseEnterTheCourierCompanyFullName')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{$t('common.search')}}</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{$t('common.reset')}}</el-button>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
         <el-button
           type="primary"
           plain
           @click="openForm('create')"
           v-hasPermi="['order:express:create']"
         >
-          <Icon icon="ep:plus" class="mr-5px" /> 新增
+          <Icon icon="ep:plus" class="mr-5px" /> {{t('action.add')}}
         </el-button>
         <el-button
           type="success"
@@ -44,7 +44,7 @@
           :loading="exportLoading"
           v-hasPermi="['order:express:export']"
         >
-          <Icon icon="ep:download" class="mr-5px" /> 导出
+          <Icon icon="ep:download" class="mr-5px" /> {{t('action.export')}}
         </el-button>
       </el-form-item>
     </el-form>
@@ -53,17 +53,17 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list">
-      <el-table-column label="id" align="center" prop="id" />
-      <el-table-column label="快递公司编码" align="center" prop="code" />
-      <el-table-column label="快递公司全称" align="center" prop="name" />
-      <el-table-column label="排序" align="center" prop="sort" />
+      <el-table-column :label="t('express.ompanyCode')" align="center" prop="id" />
+      <el-table-column :label="t('express.courierCompanyCode')" align="center" prop="code" />
+      <el-table-column :label="t('express.courierCompanyFullName')" align="center" prop="name" />
+      <el-table-column :label="t('express.sort')" align="center" prop="sort" />
       <el-table-column
-        label="添加时间"
+        :label="t('express.addTime')"
         align="center"
         prop="createTime"
         :formatter="dateFormatter"
       />
-      <el-table-column label="操作" align="center">
+      <el-table-column :label="t('public.operate')" align="center">
         <template #default="scope">
           <el-button
             link
@@ -71,7 +71,7 @@
             @click="openForm('update', scope.row.id)"
             v-hasPermi="['order:express:update']"
           >
-            编辑
+            {{t('action.edit')}}
           </el-button>
           <el-button
             link
@@ -79,7 +79,7 @@
             @click="handleDelete(scope.row.id)"
             v-hasPermi="['order:express:delete']"
           >
-            删除
+            {{t('action.delete')}}
           </el-button>
         </template>
       </el-table-column>
@@ -168,7 +168,7 @@ const handleExport = async () => {
     // 发起导出
     exportLoading.value = true
     const data = await ExpressApi.exportExpress(queryParams)
-    download.excel(data, '快递公司.xls')
+    download.excel(data, t('express.courierCompanyXls'))
   } catch {
   } finally {
     exportLoading.value = false

+ 19 - 18
src/views/infra/apiAccessLog/ApiAccessLogDetail.vue

@@ -1,51 +1,51 @@
 <template>
-  <Dialog v-model="dialogVisible" :max-height="500" :scroll="true" title="详情" width="800">
+  <Dialog v-model="dialogVisible" :max-height="500" :scroll="true" :title="t('common.detail')" width="800">
     <el-descriptions :column="1" border>
-      <el-descriptions-item label="日志主键" min-width="120">
+      <el-descriptions-item :label="t('infra.logPrimaryKey')" min-width="120">
         {{ detailData.id }}
       </el-descriptions-item>
-      <el-descriptions-item label="链路追踪">
+      <el-descriptions-item :label="t('infra.linkTrace')">
         {{ detailData.traceId }}
       </el-descriptions-item>
-      <el-descriptions-item label="应用名">
+      <el-descriptions-item :label="t('infra.applicationName')">
         {{ detailData.applicationName }}
       </el-descriptions-item>
-      <el-descriptions-item label="用户信息">
+      <el-descriptions-item :label="t('infra.userInformation')">
         {{ detailData.userId }}
         <dict-tag :type="DICT_TYPE.USER_TYPE" :value="detailData.userType" />
       </el-descriptions-item>
-      <el-descriptions-item label="用户 IP">
+      <el-descriptions-item :label="t('infra.userIp')">
         {{ detailData.userIp }}
       </el-descriptions-item>
-      <el-descriptions-item label="用户 UA">
+      <el-descriptions-item :label="t('infra.userUa')">
         {{ detailData.userAgent }}
       </el-descriptions-item>
-      <el-descriptions-item label="请求信息">
+      <el-descriptions-item :label="t('infra.requestInformation')">
         {{ detailData.requestMethod }} {{ detailData.requestUrl }}
       </el-descriptions-item>
-      <el-descriptions-item label="请求参数">
+      <el-descriptions-item :label="t('infra.requestParameters')">
         {{ detailData.requestParams }}
       </el-descriptions-item>
-      <el-descriptions-item label="请求结果">
+      <el-descriptions-item :label="t('infra.requestResult')">
         {{ detailData.responseBody }}
       </el-descriptions-item>
-      <el-descriptions-item label="请求时间">
+      <el-descriptions-item :label="t('infra.requestTime')">
         {{ formatDate(detailData.beginTime) }} ~ {{ formatDate(detailData.endTime) }}
       </el-descriptions-item>
-      <el-descriptions-item label="请求耗时">{{ detailData.duration }} ms</el-descriptions-item>
-      <el-descriptions-item label="操作结果">
-        <div v-if="detailData.resultCode === 0">正常</div>
+      <el-descriptions-item :label="t('infra.requestTimeConsumption')">{{ detailData.duration }} ms</el-descriptions-item>
+      <el-descriptions-item :label="t('infra.operationResult')">
+        <div v-if="detailData.resultCode === 0">{{t('infra.normal')}}</div>
         <div v-else-if="detailData.resultCode > 0">
-          失败 | {{ detailData.resultCode }} | {{ detailData.resultMsg }}
+          {{t('infra.failed')}} | {{ detailData.resultCode }} | {{ detailData.resultMsg }}
         </div>
       </el-descriptions-item>
-      <el-descriptions-item label="操作模块">
+      <el-descriptions-item :label="t('infra.operationModule')">
         {{ detailData.operateModule }}
       </el-descriptions-item>
-      <el-descriptions-item label="操作名">
+      <el-descriptions-item :label="t('infra.operationName')">
         {{ detailData.operateName }}
       </el-descriptions-item>
-      <el-descriptions-item label="操作名">
+      <el-descriptions-item :label="t('infra.operationName')">
         <dict-tag :type="DICT_TYPE.INFRA_OPERATE_TYPE" :value="detailData.operateType" />
       </el-descriptions-item>
     </el-descriptions>
@@ -56,6 +56,7 @@
 import { DICT_TYPE } from '@/utils/dict'
 import { formatDate } from '@/utils/formatTime'
 import * as ApiAccessLog from '@/api/infra/apiAccessLog'
+const { t } = useI18n()
 
 defineOptions({ name: 'ApiAccessLogDetail' })
 

+ 32 - 31
src/views/infra/apiAccessLog/index.vue

@@ -8,19 +8,19 @@
       :inline="true"
       label-width="68px"
     >
-      <el-form-item label="用户编号" prop="userId">
+      <el-form-item :label="t('infra.userId')" prop="userId">
         <el-input
           v-model="queryParams.userId"
-          placeholder="请输入用户编号"
+          :placeholder="t('infra.pleaseEnterTheUserNumber')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="用户类型" prop="userType">
+      <el-form-item :label="t('infra.userType')" prop="userType">
         <el-select
           v-model="queryParams.userType"
-          placeholder="请选择用户类型"
+          :placeholder="t('infra.pleaseSelectUserType')"
           clearable
           class="!w-240px"
         >
@@ -32,47 +32,47 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="应用名" prop="applicationName">
+      <el-form-item :label="t('infra.applicationName')" prop="applicationName">
         <el-input
           v-model="queryParams.applicationName"
-          placeholder="请输入应用名"
+          :placeholder="t('infra.pleaseEnterTheApplicationName')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="请求时间" prop="beginTime">
+      <el-form-item :label="t('infra.requestTime')" prop="beginTime">
         <el-date-picker
           v-model="queryParams.beginTime"
           value-format="YYYY-MM-DD HH:mm:ss"
           type="daterange"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
+          :start-placeholder="t('public.startDate')"
+          :end-placeholder="t('public.endDate')"
           :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="执行时长" prop="duration">
+      <el-form-item :label="t('infra.executionTime')" prop="duration">
         <el-input
           v-model="queryParams.duration"
-          placeholder="请输入执行时长"
+          :placeholder="t('infra.pleaseEnterTheExecutionTime')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="结果码" prop="resultCode">
+      <el-form-item :label="t('infra.resultCode')" prop="resultCode">
         <el-input
           v-model="queryParams.resultCode"
-          placeholder="请输入结果码"
+          :placeholder="t('infra.pleaseEnterTheResultCode')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{$t('common.search')}}</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{$t('common.reset')}}</el-button>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
         <el-button
           type="success"
           plain
@@ -80,7 +80,7 @@
           :loading="exportLoading"
           v-hasPermi="['infra:api-access-log:export']"
         >
-          <Icon icon="ep:download" class="mr-5px" /> 导出
+          <Icon icon="ep:download" class="mr-5px" /> {{t('action.export')}}
         </el-button>
       </el-form-item>
     </el-form>
@@ -89,37 +89,37 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list">
-      <el-table-column label="日志编号" align="center" prop="id" width="100" fix="right" />
-      <el-table-column label="用户编号" align="center" prop="userId" />
-      <el-table-column label="用户类型" align="center" prop="userType">
+      <el-table-column :label="t('infra.logNumber')" align="center" prop="id" width="100" fix="right" />
+      <el-table-column :label="t('infra.userId')" align="center" prop="userId" />
+      <el-table-column :label="t('infra.userType')" align="center" prop="userType">
         <template #default="scope">
           <dict-tag :type="DICT_TYPE.USER_TYPE" :value="scope.row.userType" />
         </template>
       </el-table-column>
-      <el-table-column label="应用名" align="center" prop="applicationName" width="150" />
-      <el-table-column label="请求方法" align="center" prop="requestMethod" width="80" />
-      <el-table-column label="请求地址" align="center" prop="requestUrl" width="500" />
-      <el-table-column label="请求时间" align="center" prop="beginTime" width="180">
+      <el-table-column :label="t('infra.applicationName')" align="center" prop="applicationName" width="150" />
+      <el-table-column :label="t('infra.requestMethod')" align="center" prop="requestMethod" width="80" />
+      <el-table-column :label="t('infra.requestAddress')" align="center" prop="requestUrl" width="500" />
+      <el-table-column :label="t('infra.requestTime')" align="center" prop="beginTime" width="180">
         <template #default="scope">
           <span>{{ formatDate(scope.row.beginTime) }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="执行时长" align="center" prop="duration" width="180">
+      <el-table-column :label="t('infra.executionTime')" align="center" prop="duration" width="180">
         <template #default="scope"> {{ scope.row.duration }} ms </template>
       </el-table-column>
-      <el-table-column label="操作结果" align="center" prop="status">
+      <el-table-column :label="t('infra.operationResult')" align="center" prop="status">
         <template #default="scope">
           {{ scope.row.resultCode === 0 ? '成功' : '失败(' + scope.row.resultMsg + ')' }}
         </template>
       </el-table-column>
-      <el-table-column label="操作模块" align="center" prop="operateModule" width="180" />
-      <el-table-column label="操作名" align="center" prop="operateName" width="180" />
-      <el-table-column label="操作类型" align="center" prop="operateType">
+      <el-table-column :label="t('infra.operationModule')" align="center" prop="operateModule" width="180" />
+      <el-table-column :label="t('infra.operationName')" align="center" prop="operateName" width="180" />
+      <el-table-column :label="t('infra.operationType')" align="center" prop="operateType">
         <template #default="scope">
           <dict-tag :type="DICT_TYPE.INFRA_OPERATE_TYPE" :value="scope.row.operateType" />
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center" fixed="right" width="60">
+      <el-table-column :label="t('infra.operate')" align="center" fixed="right" width="60">
         <template #default="scope">
           <el-button
             link
@@ -127,7 +127,7 @@
             @click="openDetail(scope.row)"
             v-hasPermi="['infra:api-access-log:query']"
           >
-            详细
+            {{ t('infra.detailed') }}
           </el-button>
         </template>
       </el-table-column>
@@ -150,6 +150,7 @@ import download from '@/utils/download'
 import { formatDate } from '@/utils/formatTime'
 import * as ApiAccessLogApi from '@/api/infra/apiAccessLog'
 import ApiAccessLogDetail from './ApiAccessLogDetail.vue'
+const { t } = useI18n()
 
 defineOptions({ name: 'InfraApiAccessLog' })
 
@@ -210,7 +211,7 @@ const handleExport = async () => {
     // 发起导出
     exportLoading.value = true
     const data = await ApiAccessLogApi.exportApiAccessLog(queryParams)
-    download.excel(data, 'API 访问日志.xls')
+    download.excel(data, t('infra.apiAccessLog.aPIAccessLogs_xls'))
   } catch {
   } finally {
     exportLoading.value = false

+ 16 - 15
src/views/infra/apiErrorLog/ApiErrorLogDetail.vue

@@ -1,38 +1,38 @@
 <template>
-  <Dialog v-model="dialogVisible" :max-height="500" :scroll="true" title="详情" width="800">
+  <Dialog v-model="dialogVisible" :max-height="500" :scroll="true" :title="t('common.detail')" width="800">
     <el-descriptions :column="1" border>
-      <el-descriptions-item label="日志主键" min-width="120">
+      <el-descriptions-item :label="t('infra.logPrimaryKey')" min-width="120">
         {{ detailData.id }}
       </el-descriptions-item>
-      <el-descriptions-item label="链路追踪">
+      <el-descriptions-item :label="t('infra.linkTrace')">
         {{ detailData.traceId }}
       </el-descriptions-item>
-      <el-descriptions-item label="应用名">
+      <el-descriptions-item :label="t('infra.applicationName')">
         {{ detailData.applicationName }}
       </el-descriptions-item>
-      <el-descriptions-item label="用户编号">
+      <el-descriptions-item :label="t('infra.userId')">
         {{ detailData.userId }}
         <dict-tag :type="DICT_TYPE.USER_TYPE" :value="detailData.userType" />
       </el-descriptions-item>
-      <el-descriptions-item label="用户 IP">
+      <el-descriptions-item :label="t('infra.userIp')">
         {{ detailData.userIp }}
       </el-descriptions-item>
-      <el-descriptions-item label="用户 UA">
+      <el-descriptions-item :label="t('infra.userUa')">
         {{ detailData.userAgent }}
       </el-descriptions-item>
-      <el-descriptions-item label="请求信息">
+      <el-descriptions-item :label="t('infra.requestInformation')">
         {{ detailData.requestMethod }} {{ detailData.requestUrl }}
       </el-descriptions-item>
-      <el-descriptions-item label="请求参数">
+      <el-descriptions-item :label="t('infra.requestParameters')">
         {{ detailData.requestParams }}
       </el-descriptions-item>
-      <el-descriptions-item label="异常时间">
+      <el-descriptions-item :label="t('infra.exceptionTime')">
         {{ formatDate(detailData.exceptionTime) }}
       </el-descriptions-item>
-      <el-descriptions-item label="异常名">
+      <el-descriptions-item :label="t('infra.exceptionName')">
         {{ detailData.exceptionName }}
       </el-descriptions-item>
-      <el-descriptions-item v-if="detailData.exceptionStackTrace" label="异常堆栈">
+      <el-descriptions-item v-if="detailData.exceptionStackTrace" :label="t('infra.exceptionStack')">
         <el-input
           v-model="detailData.exceptionStackTrace"
           :autosize="{ maxRows: 20 }"
@@ -40,16 +40,16 @@
           type="textarea"
         />
       </el-descriptions-item>
-      <el-descriptions-item label="处理状态">
+      <el-descriptions-item :label="t('infra.handlingStatus')">
         <dict-tag
           :type="DICT_TYPE.INFRA_API_ERROR_LOG_PROCESS_STATUS"
           :value="detailData.processStatus"
         />
       </el-descriptions-item>
-      <el-descriptions-item v-if="detailData.processUserId" label="处理人">
+      <el-descriptions-item v-if="detailData.processUserId" :label="t('infra.handler')">
         {{ detailData.processUserId }}
       </el-descriptions-item>
-      <el-descriptions-item v-if="detailData.processTime" label="处理时间">
+      <el-descriptions-item v-if="detailData.processTime" :label="t('infra.handlingTime')">
         {{ formatDate(detailData.processTime) }}
       </el-descriptions-item>
     </el-descriptions>
@@ -59,6 +59,7 @@
 import { DICT_TYPE } from '@/utils/dict'
 import { formatDate } from '@/utils/formatTime'
 import * as ApiErrorLog from '@/api/infra/apiErrorLog'
+const { t } = useI18n()
 
 defineOptions({ name: 'ApiErrorLogDetail' })
 

+ 32 - 31
src/views/infra/apiErrorLog/index.vue

@@ -8,19 +8,19 @@
       :inline="true"
       label-width="68px"
     >
-      <el-form-item label="用户编号" prop="userId">
+      <el-form-item :label="t('infra.userId')" prop="userId">
         <el-input
           v-model="queryParams.userId"
-          placeholder="请输入用户编号"
+          :placeholder="t('infra.pleaseEnterTheUserNumber')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="用户类型" prop="userType">
+      <el-form-item :label="t('infra.userType')" prop="userType">
         <el-select
           v-model="queryParams.userType"
-          placeholder="请选择用户类型"
+          :placeholder="t('infra.pleaseSelectUserType')"
           clearable
           class="!w-240px"
         >
@@ -32,30 +32,30 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="应用名" prop="applicationName">
+      <el-form-item :label="t('infra.applicationName')" prop="applicationName">
         <el-input
           v-model="queryParams.applicationName"
-          placeholder="请输入应用名"
+          :placeholder="t('infra.pleaseEnterTheApplicationName')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="异常时间" prop="exceptionTime">
+      <el-form-item :label="t('infra.exceptionTime')" prop="exceptionTime">
         <el-date-picker
           v-model="queryParams.exceptionTime"
           value-format="YYYY-MM-DD HH:mm:ss"
           type="daterange"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
+          :start-placeholder="t('public.startDate')"
+          :end-placeholder="t('public.endDate')"
           :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="处理状态" prop="processStatus">
+      <el-form-item :label="t('infra.handlingStatus')" prop="processStatus">
         <el-select
           v-model="queryParams.processStatus"
-          placeholder="请选择处理状态"
+          :placeholder="t('infra.pleaseSelectTheProcessingStatus')"
           clearable
           class="!w-240px"
         >
@@ -68,8 +68,8 @@
         </el-select>
       </el-form-item>
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{$t('common.search')}}</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{$t('common.reset')}}</el-button>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
         <el-button
           type="success"
           plain
@@ -77,7 +77,7 @@
           :loading="exportLoading"
           v-hasPermi="['infra:api-error-log:export']"
         >
-          <Icon icon="ep:download" class="mr-5px" /> 导出
+          <Icon icon="ep:download" class="mr-5px" /> {{t('action.export')}}
         </el-button>
       </el-form-item>
     </el-form>
@@ -86,25 +86,25 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list">
-      <el-table-column label="日志编号" align="center" prop="id" />
-      <el-table-column label="用户编号" align="center" prop="userId" />
-      <el-table-column label="用户类型" align="center" prop="userType">
+      <el-table-column :label="t('infra.logNumber')" align="center" prop="id" />
+      <el-table-column :label="t('infra.userId')" align="center" prop="userId" />
+      <el-table-column :label="t('infra.userId')" align="center" prop="userType">
         <template #default="scope">
           <dict-tag :type="DICT_TYPE.USER_TYPE" :value="scope.row.userType" />
         </template>
       </el-table-column>
-      <el-table-column label="应用名" align="center" prop="applicationName" width="200" />
-      <el-table-column label="请求方法" align="center" prop="requestMethod" width="80" />
-      <el-table-column label="请求地址" align="center" prop="requestUrl" width="180" />
+      <el-table-column :label="t('infra.applicationName')" align="center" prop="applicationName" width="200" />
+      <el-table-column :label="t('infra.requestMethod')" align="center" prop="requestMethod" width="80" />
+      <el-table-column :label="t('infra.requestAddress')" align="center" prop="requestUrl" width="180" />
       <el-table-column
-        label="异常发生时间"
+        :label="t('infra.timeOfException')"
         align="center"
         prop="exceptionTime"
         width="180"
         :formatter="dateFormatter"
       />
-      <el-table-column label="异常名" align="center" prop="exceptionName" width="180" />
-      <el-table-column label="处理状态" align="center" prop="processStatus">
+      <el-table-column :label="t('infra.exceptionName')" align="center" prop="exceptionName" width="180" />
+      <el-table-column :label="t('infra.handlingStatus')" align="center" prop="processStatus">
         <template #default="scope">
           <dict-tag
             :type="DICT_TYPE.INFRA_API_ERROR_LOG_PROCESS_STATUS"
@@ -112,7 +112,7 @@
           />
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center" width="200">
+      <el-table-column :label="t('public.operate')" align="center" width="200">
         <template #default="scope">
           <el-button
             link
@@ -120,7 +120,7 @@
             @click="openDetail(scope.row)"
             v-hasPermi="['infra:api-error-log:query']"
           >
-            详细
+            {{ t('infra.detailed') }}
           </el-button>
           <el-button
             link
@@ -129,7 +129,7 @@
             @click="handleProcess(scope.row.id, InfraApiErrorLogProcessStatusEnum.DONE)"
             v-hasPermi="['infra:api-error-log:update-status']"
           >
-            已处理
+            {{ t('infra.handled') }}
           </el-button>
           <el-button
             link
@@ -138,7 +138,7 @@
             @click="handleProcess(scope.row.id, InfraApiErrorLogProcessStatusEnum.IGNORE)"
             v-hasPermi="['infra:api-error-log:update-status']"
           >
-            已忽略
+            {{ t('infra.ignored') }}
           </el-button>
         </template>
       </el-table-column>
@@ -160,9 +160,10 @@
 import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
 import { dateFormatter } from '@/utils/formatTime'
 import download from '@/utils/download'
-import * as ApiErrorLogApi from '@/api/infra/apiErrorLog'
+import * as ApiErrorLogApi from '@/api/infra/apiAccessLog'
 import ApiErrorLogDetail from './ApiErrorLogDetail.vue'
 import { InfraApiErrorLogProcessStatusEnum } from '@/utils/constants'
+const { t } = useI18n()
 
 defineOptions({ name: 'InfraApiErrorLog' })
 
@@ -218,8 +219,8 @@ const openDetail = (data: ApiErrorLogApi.ApiErrorLogVO) => {
 const handleProcess = async (id: number, processStatus: number) => {
   try {
     // 操作的二次确认
-    const type = processStatus === InfraApiErrorLogProcessStatusEnum.DONE ? '已处理' : '已忽略'
-    await message.confirm('确认标记为' + type + '?')
+    const type = processStatus === InfraApiErrorLogProcessStatusEnum.DONE ? t('infra.handled') : t('infra.ignored')
+    await message.confirm( t('infra.confirmationFlaggedAs') + type + '?')
     // 执行操作
     await ApiErrorLogApi.updateApiErrorLogPage(id, processStatus)
     await message.success(type)
@@ -236,7 +237,7 @@ const handleExport = async () => {
     // 发起导出
     exportLoading.value = true
     const data = await ApiErrorLogApi.exportApiErrorLog(queryParams)
-    download.excel(data, '异常日志.xls')
+    download.excel(data, t('infra.exceptionLogXls'))
   } catch {
   } finally {
     exportLoading.value = false

+ 6 - 6
src/views/infra/build/index.vue

@@ -3,9 +3,9 @@
     <el-row>
       <el-col>
         <div class="float-right mb-2">
-          <el-button size="small" type="primary" @click="showJson">生成 JSON</el-button>
-          <el-button size="small" type="success" @click="showOption">生成 Options</el-button>
-          <el-button size="small" type="danger" @click="showTemplate">生成组件</el-button>
+          <el-button size="small" type="primary" @click="showJson">{{t('infra.generateJSON')}}</el-button>
+          <el-button size="small" type="success" @click="showOption">{{t('infra.generateJSON')}}</el-button>
+          <el-button size="small" type="danger" @click="showTemplate">{{t('infra.generateComponents')}}</el-button>
         </div>
       </el-col>
     </el-row>
@@ -58,21 +58,21 @@ const openModel = (title: string) => {
 
 /** 生成 JSON */
 const showJson = () => {
-  openModel('生成 JSON')
+  openModel(t('infra.generateJSON'))
   formType.value = 0
   formData.value = designer.value.getRule()
 }
 
 /** 生成 Options */
 const showOption = () => {
-  openModel('生成 Options')
+  openModel(t('infra.generateOptions'))
   formType.value = 1
   formData.value = designer.value.getOption()
 }
 
 /** 生成组件 */
 const showTemplate = () => {
-  openModel('生成组件')
+  openModel(t('infra.generateComponents'))
   formType.value = 2
   formData.value = makeTemplate()
 }

+ 5 - 5
src/views/infra/codegen/EditTable.vue

@@ -1,13 +1,13 @@
 <template>
   <ContentWrap v-loading="formLoading">
     <el-tabs v-model="activeName">
-      <el-tab-pane label="基本信息" name="basicInfo">
+      <el-tab-pane :label="t('infra.basicInformation')" name="basicInfo">
         <basic-info-form ref="basicInfoRef" :table="formData.table" />
       </el-tab-pane>
-      <el-tab-pane label="字段信息" name="colum">
+      <el-tab-pane :label="t('infra.fieldInformation')" name="colum">
         <colum-info-form ref="columInfoRef" :columns="formData.columns" />
       </el-tab-pane>
-      <el-tab-pane label="生成信息" name="generateInfo">
+      <el-tab-pane :label="t('infra.generatedInformation')" name="generateInfo">
         <generate-info-form
           ref="generateInfoRef"
           :table="formData.table"
@@ -17,8 +17,8 @@
     </el-tabs>
     <el-form>
       <el-form-item style="float: right">
-        <el-button :loading="formLoading" type="primary" @click="submitForm">保存</el-button>
-        <el-button @click="close">返回</el-button>
+        <el-button :loading="formLoading" type="primary" @click="submitForm">{{t('common.save')}}</el-button>
+        <el-button @click="close">{{t('common.back')}}</el-button>
       </el-form-item>
     </el-form>
   </ContentWrap>

+ 14 - 13
src/views/infra/codegen/ImportTable.vue

@@ -1,12 +1,12 @@
 <template>
-  <Dialog v-model="dialogVisible" title="导入表" width="800px">
+  <Dialog v-model="dialogVisible" :title="t('infra.importTable')" width="800px">
     <!-- 搜索栏 -->
     <el-form ref="queryFormRef" :inline="true" :model="queryParams" label-width="68px">
-      <el-form-item label="数据源" prop="dataSourceConfigId">
+      <el-form-item :label="t('infra.dataSource')" prop="dataSourceConfigId">
         <el-select
           v-model="queryParams.dataSourceConfigId"
           class="!w-240px"
-          placeholder="请选择数据源"
+          :placeholder="t('infra.pleaseSelectADataSource')"
         >
           <el-option
             v-for="config in dataSourceConfigList"
@@ -16,32 +16,32 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="表名称" prop="name">
+      <el-form-item :label="t('infra.tableName')" prop="name">
         <el-input
           v-model="queryParams.name"
           class="!w-240px"
           clearable
-          placeholder="请输入表名称"
+          :placeholder="t('infra.pleaseEnterATableName')"
           @keyup.enter="getList"
         />
       </el-form-item>
-      <el-form-item label="表描述" prop="comment">
+      <el-form-item :label="t('infra.tableDescription')" prop="comment">
         <el-input
           v-model="queryParams.comment"
           class="!w-240px"
           clearable
-          placeholder="请输入表描述"
+          :placeholder="t('infra.pleaseEnterATableDescription')"
           @keyup.enter="getList"
         />
       </el-form-item>
       <el-form-item>
         <el-button @click="getList">
           <Icon class="mr-5px" icon="ep:search" />
-          搜索
+           {{ t('common.search') }}
         </el-button>
         <el-button @click="resetQuery">
           <Icon class="mr-5px" icon="ep:refresh" />
-          重置
+           {{ t('common.reset') }}
         </el-button>
       </el-form-item>
     </el-form>
@@ -56,8 +56,8 @@
         @selection-change="handleSelectionChange"
       >
         <el-table-column type="selection" width="55" />
-        <el-table-column :show-overflow-tooltip="true" label="表名称" prop="name" />
-        <el-table-column :show-overflow-tooltip="true" label="表描述" prop="comment" />
+        <el-table-column :show-overflow-tooltip="true" :label="t('infra.tableName')" prop="name" />
+        <el-table-column :show-overflow-tooltip="true" :label="t('infra.tableDescription')" prop="comment" />
       </el-table>
     </el-row>
     <!-- 操作 -->
@@ -65,7 +65,7 @@
       <el-button :disabled="tableList.length === 0" type="primary" @click="handleImportTable">
         导入
       </el-button>
-      <el-button @click="close">关闭</el-button>
+      <el-button @click="close">{{t('public.close')}}</el-button>
     </template>
   </Dialog>
 </template>
@@ -73,6 +73,7 @@
 import * as CodegenApi from '@/api/infra/codegen'
 import * as DataSourceConfigApi from '@/api/infra/dataSourceConfig'
 import { ElTable } from 'element-plus'
+const { t } = useI18n()
 
 defineOptions({ name: 'InfraCodegenImportTable' })
 
@@ -143,7 +144,7 @@ const handleImportTable = async () => {
     dataSourceConfigId: queryParams.dataSourceConfigId,
     tableNames: tableList.value
   })
-  message.success('导入成功')
+  message.success(t('infra.importSuccessful'))
   emit('success')
   close()
 }

+ 3 - 3
src/views/infra/codegen/PreviewCode.vue

@@ -3,7 +3,7 @@
     v-model="dialogVisible"
     align-center
     class="app-infra-codegen-preview-container"
-    title="代码预览"
+    :title="t('infra.codePreview')"
     width="80%"
   >
     <div class="flex">
@@ -12,7 +12,7 @@
         v-loading="loading"
         :gutter="12"
         class="w-1/3"
-        element-loading-text="生成文件目录中..."
+        :element-loading-text="t('infra.generateFileInDirectory')"
         shadow="hover"
       >
         <el-scrollbar height="calc(100vh - 88px - 40px)">
@@ -32,7 +32,7 @@
         v-loading="loading"
         :gutter="12"
         class="ml-3 w-2/3"
-        element-loading-text="加载代码中..."
+        :element-loading-text="t('infra.loadingCode')"
         shadow="hover"
       >
         <el-tabs v-model="preview.activeName">

+ 11 - 13
src/views/infra/codegen/components/BasicInfoForm.vue

@@ -2,38 +2,35 @@
   <el-form ref="formRef" :model="formData" :rules="rules" label-width="120px">
     <el-row>
       <el-col :span="12">
-        <el-form-item label="表名称" prop="tableName">
-          <el-input v-model="formData.tableName" placeholder="请输入仓库名称" />
+        <el-form-item :label="t('infra.tableName')" prop="tableName">
+          <el-input v-model="formData.tableName" :placeholder="t('infra.pleaseEnterAWarehouseName')" />
         </el-form-item>
       </el-col>
       <el-col :span="12">
-        <el-form-item label="表描述" prop="tableComment">
-          <el-input v-model="formData.tableComment" placeholder="请输入" />
+        <el-form-item :label="t('infra.tableDescription')" prop="tableComment">
+          <el-input v-model="formData.tableComment" :placeholder="t('common.inputText')" />
         </el-form-item>
       </el-col>
       <el-col :span="12">
         <el-form-item prop="className">
           <template #label>
             <span>
-              实体类名称
-              <el-tooltip
-                content="默认去除表名的前缀。如果存在重复,则需要手动添加前缀,避免 MyBatis 报 Alias 重复的问题。"
-                placement="top"
-              >
+              {{ t('infra.entityClassName') }}
+              <el-tooltip :content="t('infra.infraTips')" placement="top">
                 <Icon class="" icon="ep:question-filled" />
               </el-tooltip>
             </span>
           </template>
-          <el-input v-model="formData.className" placeholder="请输入" />
+          <el-input v-model="formData.className" :placeholder="t('common.inputText')" />
         </el-form-item>
       </el-col>
       <el-col :span="12">
-        <el-form-item label="作者" prop="author">
-          <el-input v-model="formData.author" placeholder="请输入" />
+        <el-form-item :label="t('infra.author')" prop="author">
+          <el-input v-model="formData.author" :placeholder="t('common.inputText')" />
         </el-form-item>
       </el-col>
       <el-col :span="24">
-        <el-form-item label="备注" prop="remark">
+        <el-form-item :label="t('infra.author')" prop="remark">
           <el-input v-model="formData.remark" :rows="3" type="textarea" />
         </el-form-item>
       </el-col>
@@ -43,6 +40,7 @@
 <script lang="ts" setup>
 import * as CodegenApi from '@/api/infra/codegen'
 import { PropType } from 'vue'
+const { t } = useI18n()
 
 defineOptions({ name: 'InfraCodegenBasicInfoForm' })
 

+ 25 - 24
src/views/infra/codegen/components/ColumInfoForm.vue

@@ -2,22 +2,22 @@
   <el-table ref="dragTable" :data="formData" :max-height="tableHeight" row-key="columnId">
     <el-table-column
       :show-overflow-tooltip="true"
-      label="字段列名"
+      :label="t('infra.fieldColumnName')"
       min-width="10%"
       prop="columnName"
     />
-    <el-table-column label="字段描述" min-width="10%">
+    <el-table-column :label="t('infra.fieldDescription')" min-width="10%">
       <template #default="scope">
         <el-input v-model="scope.row.columnComment" />
       </template>
     </el-table-column>
     <el-table-column
       :show-overflow-tooltip="true"
-      label="物理类型"
+      :label="t('infra.physicalType')"
       min-width="10%"
       prop="dataType"
     />
-    <el-table-column label="Java类型" min-width="11%">
+    <el-table-column :label="t('infra.javaType')" min-width="11%">
       <template #default="scope">
         <el-select v-model="scope.row.javaType">
           <el-option label="Long" value="Long" />
@@ -30,22 +30,22 @@
         </el-select>
       </template>
     </el-table-column>
-    <el-table-column label="java属性" min-width="10%">
+    <el-table-column :label="t('infra.javaAttributes')" min-width="10%">
       <template #default="scope">
         <el-input v-model="scope.row.javaField" />
       </template>
     </el-table-column>
-    <el-table-column label="插入" min-width="4%">
+    <el-table-column :label="t('infra.insert')" min-width="4%">
       <template #default="scope">
         <el-checkbox v-model="scope.row.createOperation" false-label="false" true-label="true" />
       </template>
     </el-table-column>
-    <el-table-column label="编辑" min-width="4%">
+    <el-table-column :label="t('infra.edit')" min-width="4%">
       <template #default="scope">
         <el-checkbox v-model="scope.row.updateOperation" false-label="false" true-label="true" />
       </template>
     </el-table-column>
-    <el-table-column label="列表" min-width="4%">
+    <el-table-column :label="t('infra.list')" min-width="4%">
       <template #default="scope">
         <el-checkbox
           v-model="scope.row.listOperationResult"
@@ -54,12 +54,12 @@
         />
       </template>
     </el-table-column>
-    <el-table-column label="查询" min-width="4%">
+    <el-table-column :label="t('infra.query')" min-width="4%">
       <template #default="scope">
         <el-checkbox v-model="scope.row.listOperation" false-label="false" true-label="true" />
       </template>
     </el-table-column>
-    <el-table-column label="查询方式" min-width="10%">
+    <el-table-column :label="t('infra.queryMethod')查询方式" min-width="10%">
       <template #default="scope">
         <el-select v-model="scope.row.listOperationCondition">
           <el-option label="=" value="=" />
@@ -73,29 +73,29 @@
         </el-select>
       </template>
     </el-table-column>
-    <el-table-column label="允许空" min-width="5%">
+    <el-table-column :label="t('infra.allowNull')" min-width="5%">
       <template #default="scope">
         <el-checkbox v-model="scope.row.nullable" false-label="false" true-label="true" />
       </template>
     </el-table-column>
-    <el-table-column label="显示类型" min-width="12%">
+    <el-table-column :label="t('infra.displayType')" min-width="12%">
       <template #default="scope">
         <el-select v-model="scope.row.htmlType">
-          <el-option label="文本框" value="input" />
-          <el-option label="文本域" value="textarea" />
-          <el-option label="下拉框" value="select" />
-          <el-option label="单选框" value="radio" />
-          <el-option label="复选框" value="checkbox" />
-          <el-option label="日期控件" value="datetime" />
-          <el-option label="图片上传" value="imageUpload" />
-          <el-option label="文件上传" value="fileUpload" />
-          <el-option label="富文本控件" value="editor" />
+          <el-option :label="t('infra.textBox')" value="input" />
+          <el-option :label="t('infra.textField')" value="textarea" />
+          <el-option :label="t('infra.dropdownBox')" value="select" />
+          <el-option :label="t('infra.radioBox')" value="radio" />
+          <el-option :label="t('infra.checkbox')" value="checkbox" />
+          <el-option :label="t('infra.dateControl')" value="datetime" />
+          <el-option :label="t('infra.imageUpload')" value="imageUpload" />
+          <el-option :label="t('infra.fileUpload')" value="fileUpload" />
+          <el-option :label="t('infra.richTextControls')" value="editor" />
         </el-select>
       </template>
     </el-table-column>
-    <el-table-column label="字典类型" min-width="12%">
+    <el-table-column :label="t('infra.dictionaryTypes')" min-width="12%">
       <template #default="scope">
-        <el-select v-model="scope.row.dictType" clearable filterable placeholder="请选择">
+        <el-select v-model="scope.row.dictType" clearable filterable :placeholder="t('common.selectText')">
           <el-option
             v-for="dict in dictOptions"
             :key="dict.id"
@@ -105,7 +105,7 @@
         </el-select>
       </template>
     </el-table-column>
-    <el-table-column label="示例" min-width="10%">
+    <el-table-column :label="t('infra.examples')" min-width="10%">
       <template #default="scope">
         <el-input v-model="scope.row.example" />
       </template>
@@ -116,6 +116,7 @@
 import { PropType } from 'vue'
 import * as CodegenApi from '@/api/infra/codegen'
 import * as DictDataApi from '@/api/system/dict/dict.type'
+const { t } = useI18n()
 
 defineOptions({ name: 'InfraCodegenColumInfoForm' })
 

+ 39 - 38
src/views/infra/codegen/components/GenerateInfoForm.vue

@@ -2,7 +2,7 @@
   <el-form ref="formRef" :model="formData" :rules="rules" label-width="150px">
     <el-row>
       <el-col :span="12">
-        <el-form-item label="生成模板" prop="templateType">
+        <el-form-item :label="t('infra.generatedTemplates')" prop="templateType">
           <el-select v-model="formData.templateType">
             <el-option
               v-for="dict in getIntDictOptions(DICT_TYPE.INFRA_CODEGEN_TEMPLATE_TYPE)"
@@ -14,7 +14,7 @@
         </el-form-item>
       </el-col>
       <el-col :span="12">
-        <el-form-item label="前端类型" prop="frontType">
+        <el-form-item :label="t('infra.frontEndTypes')" prop="frontType">
           <el-select v-model="formData.frontType">
             <el-option
               v-for="dict in getIntDictOptions(DICT_TYPE.INFRA_CODEGEN_FRONT_TYPE)"
@@ -27,7 +27,7 @@
       </el-col>
 
       <el-col :span="12">
-        <el-form-item label="生成场景" prop="scene">
+        <el-form-item :label="t('infra.generatedScenarios')" prop="scene">
           <el-select v-model="formData.scene">
             <el-option
               v-for="dict in getIntDictOptions(DICT_TYPE.INFRA_CODEGEN_SCENE)"
@@ -42,8 +42,8 @@
         <el-form-item>
           <template #label>
             <span>
-              上级菜单
-              <el-tooltip content="分配到指定菜单下,例如 系统管理" placement="top">
+              {{ t('infra.parentMenu') }}
+              <el-tooltip :content="t('infra.assignToASpecificMenuEgSystemManagement')" placement="top">
                 <Icon icon="ep:question-filled" />
               </el-tooltip>
             </span>
@@ -54,7 +54,7 @@
             :props="menuTreeProps"
             check-strictly
             node-key="id"
-            placeholder="请选择系统菜单"
+            :placeholder="t('infra.pleaseSelectTheSystemMenu')"
           />
         </el-form-item>
       </el-col>
@@ -64,9 +64,9 @@
         <el-form-item prop="moduleName">
           <template #label>
             <span>
-              模块名
+              {{ t('infra.moduleName') }}
               <el-tooltip
-                content="模块名,即一级目录,例如 system、infra、tool 等等"
+                :content="t('infra.moduleNameIeFirstLevelDirectoryEgSystemInfraToolEtc')"
                 placement="top"
               >
                 <Icon icon="ep:question-filled" />
@@ -81,9 +81,9 @@
         <el-form-item prop="businessName">
           <template #label>
             <span>
-              业务名
+              {{ t('infra.businessName') }}
               <el-tooltip
-                content="业务名,即二级目录,例如 user、permission、dict 等等"
+                :content="t('infra.businessNameIeSecondLevelDirectoryEgUserPermissionDictEtc')"
                 placement="top"
               >
                 <Icon icon="ep:question-filled" />
@@ -98,7 +98,7 @@
       <!--        <el-form-item prop="businessPackage">-->
       <!--          <span slot="label">-->
       <!--            业务包-->
-      <!--            <el-tooltip content="业务包,自定义二级目录。例如说,我们希望将 dictType 和 dictData 归类成 dict 业务" placement="top">-->
+      <!--            <el-tooltip :content="t('infra.xxxx')业务包,自定义二级目录。例如说,我们希望将 dictType 和 dictData 归类成 dict 业务" placement="top">-->
       <!--              <i class="el-icon-question"></i>-->
       <!--            </el-tooltip>-->
       <!--          </span>-->
@@ -110,9 +110,9 @@
         <el-form-item prop="className">
           <template #label>
             <span>
-              类名称
+              {{ t('infra.className') }}
               <el-tooltip
-                content="类名称(首字母大写),例如SysUser、SysMenu、SysDictData 等等"
+                :content="t('infra.classNameInitialCapitalizedEgSysUserSysMenuSysDictDataEtc')"
                 placement="top"
               >
                 <Icon icon="ep:question-filled" />
@@ -127,8 +127,8 @@
         <el-form-item prop="classComment">
           <template #label>
             <span>
-              类描述
-              <el-tooltip content="用作类描述,例如 用户" placement="top">
+              {{ t('infra.classDescription') }}
+              <el-tooltip :content="t('infra.usedAsAClassDescriptionEgUser')" placement="top">
                 <Icon icon="ep:question-filled" />
               </el-tooltip>
             </span>
@@ -141,9 +141,9 @@
         <el-form-item prop="genPath">
           <template #label>
             <span>
-              自定义路径
+              {{ t('infra.customPath') }}
               <el-tooltip
-                content="填写磁盘绝对路径,若不填写,则生成到当前Web项目下"
+                :content="t('infra.fillInTheAbsolutePathToTheDiskIfNotItWillBeGeneratedUnderTheCurrentWebProject')"
                 placement="top"
               >
                 <Icon icon="ep:question-filled" />
@@ -154,13 +154,13 @@
             <template #append>
               <el-dropdown>
                 <el-button type="primary">
-                  最近路径快速选择
+                  {{ t('infra.quickSelectionOfTheNearestPath') }}
                   <i class="el-icon-arrow-down el-icon--right"></i>
                 </el-button>
                 <template #dropdown>
                   <el-dropdown-menu>
                     <el-dropdown-item @click="formData.genPath = '/'">
-                      恢复默认的生成基础路径
+                      {{ t('infra.restoreTheDefaultGeneratedBasePath') }}
                     </el-dropdown-item>
                   </el-dropdown-menu>
                 </template>
@@ -174,19 +174,19 @@
     <!-- 树表信息 -->
     <el-row v-if="formData.templateType == 2">
       <el-col :span="24">
-        <h4 class="form-header">树表信息</h4>
+        <h4 class="form-header">{{ t('infra.treeTableInformation') }}</h4>
       </el-col>
       <el-col :span="12">
         <el-form-item prop="treeParentColumnId">
           <template #label>
             <span>
-              父编号字段
-              <el-tooltip content="树显示的父编码字段名, 如:parent_Id" placement="top">
+              {{ t('infra.parentNumberField') }}
+              <el-tooltip :content="t('infra.theNameOfTheParentCodeFieldOfTheTreeDisplaySuchAsParentId')" placement="top">
                 <Icon icon="ep:question-filled" />
               </el-tooltip>
             </span>
           </template>
-          <el-select v-model="formData.treeParentColumnId" placeholder="请选择">
+          <el-select v-model="formData.treeParentColumnId" :placeholder="t('common.selectText')">
             <el-option
               v-for="(column, index) in props.columns"
               :key="index"
@@ -200,13 +200,13 @@
         <el-form-item prop="treeNameColumnId">
           <template #label>
             <span>
-              树名称字段
-              <el-tooltip content="树节点的显示名称字段名, 如:dept_name" placement="top">
+              {{ t('infra.treeNameField') }}
+              <el-tooltip :content="t('infra.nameOfTheDisplayNameFieldOfTheTreeNodeEgDeptName')" placement="top">
                 <Icon icon="ep:question-filled" />
               </el-tooltip>
             </span>
           </template>
-          <el-select v-model="formData.treeNameColumnId" placeholder="请选择">
+          <el-select v-model="formData.treeNameColumnId" :placeholder="t('common.selectText')">
             <el-option
               v-for="(column, index) in props.columns"
               :key="index"
@@ -221,19 +221,19 @@
     <!-- 主表信息 -->
     <el-row v-if="formData.templateType == 15">
       <el-col :span="24">
-        <h4 class="form-header">主表信息</h4>
+        <h4 class="form-header">{{ t('infra.masterTableInformation') }}</h4>
       </el-col>
       <el-col :span="12">
         <el-form-item prop="masterTableId">
           <template #label>
             <span>
-              关联的主表
-              <el-tooltip content="关联主表(父表)的表名, 如:system_user" placement="top">
+              {{ t('infra.associatedMasterTable') }}
+              <el-tooltip :content="t('infra.theNameOfTheAssociatedMasterParentTableEgSystemUser')" placement="top">
                 <Icon icon="ep:question-filled" />
               </el-tooltip>
             </span>
           </template>
-          <el-select v-model="formData.masterTableId" placeholder="请选择">
+          <el-select v-model="formData.masterTableId" :placeholder="t('common.selectText')">
             <el-option
               v-for="(table0, index) in tables"
               :key="index"
@@ -247,13 +247,13 @@
         <el-form-item prop="subJoinColumnId">
           <template #label>
             <span>
-              子表关联的字段
-              <el-tooltip content="子表关联的字段, 如:user_id" placement="top">
+              {{ t('infra.fieldsAssociatedWithChildTables') }}
+              <el-tooltip :content="t('infra.fieldsAssociatedWithTheChildTableSuchAsUserId')" placement="top">
                 <Icon icon="ep:question-filled" />
               </el-tooltip>
             </span>
           </template>
-          <el-select v-model="formData.subJoinColumnId" placeholder="请选择">
+          <el-select v-model="formData.subJoinColumnId" :placeholder="t('common.selectText')">
             <el-option
               v-for="(column, index) in props.columns"
               :key="index"
@@ -267,15 +267,15 @@
         <el-form-item prop="subJoinMany">
           <template #label>
             <span>
-              关联关系
-              <el-tooltip content="主表与子表的关联关系" placement="top">
+              {{ t('infra.relationship') }}
+              <el-tooltip :content="t('infra.theRelationshipBetweenTheMasterTableAndTheChildTable')" placement="top">
                 <Icon icon="ep:question-filled" />
               </el-tooltip>
             </span>
           </template>
-          <el-radio-group v-model="formData.subJoinMany" placeholder="请选择">
-            <el-radio :label="true">一对多</el-radio>
-            <el-radio :label="false">一对一</el-radio>
+          <el-radio-group v-model="formData.subJoinMany" :placeholder="t('common.selectText')">
+            <el-radio :label="true">{{ t('infra.oneToOne') }}</el-radio>
+            <el-radio :label="false">{{ t('infra.oneToOne') }}</el-radio>
           </el-radio-group>
         </el-form-item>
       </el-col>
@@ -288,6 +288,7 @@ import { handleTree } from '@/utils/tree'
 import * as CodegenApi from '@/api/infra/codegen'
 import * as MenuApi from '@/api/system/menu'
 import { PropType } from 'vue'
+const { t } = useI18n()
 
 defineOptions({ name: 'InfraCodegenGenerateInfoForm' })
 

+ 24 - 24
src/views/infra/codegen/index.vue

@@ -8,31 +8,31 @@
       class="-mb-15px"
       label-width="68px"
     >
-      <el-form-item label="表名称" prop="tableName">
+      <el-form-item :label="t('infra.tableName')" prop="tableName">
         <el-input
           v-model="queryParams.tableName"
           class="!w-240px"
           clearable
-          placeholder="请输入表名称"
+          :placeholder="t('infra.pleaseEnterATableName')"
           @keyup.enter="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="表描述" prop="tableComment">
+      <el-form-item :label="t('infra.tableDescription')" prop="tableComment">
         <el-input
           v-model="queryParams.tableComment"
           class="!w-240px"
           clearable
-          placeholder="请输入表描述"
+          :placeholder="t('infra.pleaseEnterATableDescription')"
           @keyup.enter="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="创建时间" prop="createTime">
+      <el-form-item :label="t('public.createTime')" prop="createTime">
         <el-date-picker
           v-model="queryParams.createTime"
           :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
           class="!w-240px"
-          end-placeholder="结束日期"
-          start-placeholder="开始日期"
+          :end-placeholder="t('public.endDate')"
+          :start-placeholder="t('public.startDate')"
           type="daterange"
           value-format="YYYY-MM-DD HH:mm:ss"
         />
@@ -40,15 +40,15 @@
       <el-form-item>
         <el-button @click="handleQuery">
           <Icon class="mr-5px" icon="ep:search" />
-          搜索
+          {{ t('common.search') }}
         </el-button>
         <el-button @click="resetQuery">
           <Icon class="mr-5px" icon="ep:refresh" />
-          重置
+           {{ t('common.reset') }}
         </el-button>
         <el-button v-hasPermi="['infra:codegen:create']" type="primary" @click="openImportTable()">
           <Icon class="mr-5px" icon="ep:zoom-in" />
-          导入
+          {{ t('action.import') }}
         </el-button>
       </el-form-item>
     </el-form>
@@ -57,37 +57,37 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list">
-      <el-table-column align="center" label="数据源">
+      <el-table-column align="center" :label="t('infra.dataSource')">
         <template #default="scope">
           {{
             dataSourceConfigList.find((config) => config.id === scope.row.dataSourceConfigId)?.name
           }}
         </template>
       </el-table-column>
-      <el-table-column align="center" label="表名称" prop="tableName" width="200" />
+      <el-table-column align="center" :label="t('infra.tableName')" prop="tableName" width="200" />
       <el-table-column
         :show-overflow-tooltip="true"
         align="center"
-        label="表描述"
+        :label="t('infra.tableDescription')"
         prop="tableComment"
         width="200"
       />
-      <el-table-column align="center" label="实体" prop="className" width="200" />
+      <el-table-column align="center" :label="t('infra.entity')" prop="className" width="200" />
       <el-table-column
         :formatter="dateFormatter"
         align="center"
-        label="创建时间"
+        :label="t('public.createTime')"
         prop="createTime"
         width="180"
       />
       <el-table-column
         :formatter="dateFormatter"
         align="center"
-        label="更新时间"
+        :label="t('infra.updateTime')"
         prop="createTime"
         width="180"
       />
-      <el-table-column align="center" fixed="right" label="操作" width="300px">
+      <el-table-column align="center" fixed="right" :label="t('public.operate')" width="300px">
         <template #default="scope">
           <el-button
             v-hasPermi="['infra:codegen:preview']"
@@ -95,7 +95,7 @@
             type="primary"
             @click="handlePreview(scope.row)"
           >
-            预览
+          {{t('action.preview')}}
           </el-button>
           <el-button
             v-hasPermi="['infra:codegen:update']"
@@ -103,7 +103,7 @@
             type="primary"
             @click="handleUpdate(scope.row.id)"
           >
-            编辑
+          {{t('action.edit')}}
           </el-button>
           <el-button
             v-hasPermi="['infra:codegen:delete']"
@@ -111,7 +111,7 @@
             type="danger"
             @click="handleDelete(scope.row.id)"
           >
-            删除
+          {{ t('public.delete') }}
           </el-button>
           <el-button
             v-hasPermi="['infra:codegen:update']"
@@ -119,7 +119,7 @@
             type="primary"
             @click="handleSyncDB(scope.row)"
           >
-            同步
+          {{t('action.sync')}}
           </el-button>
           <el-button
             v-hasPermi="['infra:codegen:download']"
@@ -127,7 +127,7 @@
             type="primary"
             @click="handleGenTable(scope.row)"
           >
-            生成代码
+          {{t('infra.generateCode')}}
           </el-button>
         </template>
       </el-table-column>
@@ -232,9 +232,9 @@ const handleSyncDB = async (row: CodegenApi.CodegenTableVO) => {
   // 基于 DB 同步
   const tableName = row.tableName
   try {
-    await message.confirm('确认要强制同步' + tableName + '表结构吗?', t('common.reminder'))
+    await message.confirm(t('infra.areYouSureYouWantToForceSynchronizationOfTableStructure') + tableName + t('infra.tableStructure'), t('common.reminder'))
     await CodegenApi.syncCodegenFromDB(row.id)
-    message.success('同步成功')
+    message.success(t('infra.synchronizationSuccessful'))
   } catch {}
 }
 

+ 18 - 18
src/views/infra/config/ConfigForm.vue

@@ -7,19 +7,19 @@
       :rules="formRules"
       label-width="80px"
     >
-      <el-form-item label="参数分类" prop="category">
-        <el-input v-model="formData.category" placeholder="请输入参数分类" />
+      <el-form-item :label="t('infra.parameterCategory')" prop="category">
+        <el-input v-model="formData.category" :placeholder="t('infra.pleaseEnterAParameterCategory')" />
       </el-form-item>
-      <el-form-item label="参数名称" prop="name">
-        <el-input v-model="formData.name" placeholder="请输入参数名称" />
+      <el-form-item :label="t('infra.parameterName')" prop="name">
+        <el-input v-model="formData.name" :placeholder="t('infra.pleaseInputParameterName')" />
       </el-form-item>
-      <el-form-item label="参数键名" prop="key">
-        <el-input v-model="formData.key" placeholder="请输入参数键名" />
+      <el-form-item :label="t('infra.parameterKeyName')" prop="key">
+        <el-input v-model="formData.key" :placeholder="t('infra.pleaseInputParameterKeyName')" />
       </el-form-item>
-      <el-form-item label="参数键值" prop="value">
-        <el-input v-model="formData.value" placeholder="请输入参数键值" />
+      <el-form-item :label="t('infra.parameterKeyValue')" prop="value">
+        <el-input v-model="formData.value" :placeholder="t('infra.pleaseEnterTheParameterKeyValue')" />
       </el-form-item>
-      <el-form-item label="是否可见" prop="visible">
+      <el-form-item :label="t('infra.visibleOrNot')" prop="visible">
         <el-radio-group v-model="formData.visible">
           <el-radio
             v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
@@ -30,13 +30,13 @@
           </el-radio>
         </el-radio-group>
       </el-form-item>
-      <el-form-item label="备注" prop="remark">
-        <el-input v-model="formData.remark" placeholder="请输入内容" type="textarea" />
+      <el-form-item :label="t('infra.remarks')" prop="remark">
+        <el-input v-model="formData.remark" :placeholder="t('infra.pleaseEnterTheContent')" type="textarea" />
       </el-form-item>
     </el-form>
     <template #footer>
-      <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button :disabled="formLoading" type="primary" @click="submitForm">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>
@@ -63,11 +63,11 @@ const formData = ref({
   remark: ''
 })
 const formRules = reactive({
-  category: [{ required: true, message: '参数分类不能为空', trigger: 'blur' }],
-  name: [{ required: true, message: '参数名称不能为空', trigger: 'blur' }],
-  key: [{ required: true, message: '参数键名不能为空', trigger: 'blur' }],
-  value: [{ required: true, message: '参数键值不能为空', trigger: 'blur' }],
-  visible: [{ required: true, message: '是否可见不能为空', trigger: 'blur' }]
+  category: [{ required: true, message: t('infra.parameterCategoryCannotBeEmpty'), trigger: 'blur' }],
+  name: [{ required: true, message: t('infra.parameterNameCannotBeEmpty'), trigger: 'blur' }],
+  key: [{ required: true, message: t('infra.parameterKeyNameCannotBeNull'), trigger: 'blur' }],
+  value: [{ required: true, message: t('infra.parameterKeyValueCannotBeNull'), trigger: 'blur' }],
+  visible: [{ required: true, message: t('infra.visibleOrInvisibleCannotBeNull'), trigger: 'blur' }]
 })
 const formRef = ref() // 表单 Ref
 

+ 25 - 25
src/views/infra/config/index.vue

@@ -8,28 +8,28 @@
       :inline="true"
       label-width="68px"
     >
-      <el-form-item label="参数名称" prop="name">
+      <el-form-item :label="t('infra.parameterName')" prop="name">
         <el-input
           v-model="queryParams.name"
-          placeholder="请输入参数名称"
+          :placeholder="t('infra.pleaseEnterTheParameterName')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="参数键名" prop="key">
+      <el-form-item :label="t('infra.parameterKeyName')" prop="key">
         <el-input
           v-model="queryParams.key"
-          placeholder="请输入参数键名"
+          :placeholder="t('infra.pleaseEnterTheParameterKeyName')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="系统内置" prop="type">
+      <el-form-item :label="t('infra.builtInSystem')" prop="type">
         <el-select
           v-model="queryParams.type"
-          placeholder="请选择系统内置"
+          :placeholder="t('infra.pleaseSelectSystemBuiltIn')"
           clearable
           class="!w-240px"
         >
@@ -41,27 +41,27 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="创建时间" prop="createTime">
+      <el-form-item :label="t('public.createTime')" prop="createTime">
         <el-date-picker
           v-model="queryParams.createTime"
           value-format="YYYY-MM-DD HH:mm:ss"
           type="daterange"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
+          :start-placeholder="t('public.startDate')"
+          :end-placeholder="t('public.endDate')"
           :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
           class="!w-240px"
         />
       </el-form-item>
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{$t('common.search')}}</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{$t('common.reset')}}</el-button>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
         <el-button
           type="primary"
           plain
           @click="openForm('create')"
           v-hasPermi="['infra:config:create']"
         >
-          <Icon icon="ep:plus" class="mr-5px" /> 新增
+          <Icon icon="ep:plus" class="mr-5px" /> {{t('action.add')}}
         </el-button>
         <el-button
           type="success"
@@ -70,7 +70,7 @@
           :loading="exportLoading"
           v-hasPermi="['infra:config:export']"
         >
-          <Icon icon="ep:download" class="mr-5px" /> 导出
+          <Icon icon="ep:download" class="mr-5px" /> {{t('action.export')}}
         </el-button>
       </el-form-item>
     </el-form>
@@ -79,30 +79,30 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list">
-      <el-table-column label="参数主键" align="center" prop="id" />
-      <el-table-column label="参数分类" align="center" prop="category" />
-      <el-table-column label="参数名称" align="center" prop="name" :show-overflow-tooltip="true" />
-      <el-table-column label="参数键名" align="center" prop="key" :show-overflow-tooltip="true" />
-      <el-table-column label="参数键值" align="center" prop="value" />
-      <el-table-column label="是否可见" align="center" prop="visible">
+      <el-table-column :label="t('infra.parameterPrimaryKey')" align="center" prop="id" />
+      <el-table-column :label="t('infra.parameterCategory')" align="center" prop="category" />
+      <el-table-column :label="t('infra.parameterName')" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column :label="t('infra.parameterKeyName')" align="center" prop="key" :show-overflow-tooltip="true" />
+      <el-table-column :label="t('infra.parameterKeyValue')" align="center" prop="value" />
+      <el-table-column :label="t('infra.visibleOrNot')" align="center" prop="visible">
         <template #default="scope">
           <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.visible" />
         </template>
       </el-table-column>
-      <el-table-column label="系统内置" align="center" prop="type">
+      <el-table-column :label="t('infra.builtInSystem')" align="center" prop="type">
         <template #default="scope">
           <dict-tag :type="DICT_TYPE.INFRA_CONFIG_TYPE" :value="scope.row.type" />
         </template>
       </el-table-column>
-      <el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" />
+      <el-table-column :label="t('infra.remarks')" align="center" prop="remark" :show-overflow-tooltip="true" />
       <el-table-column
-        label="创建时间"
+        :label="t('public.createTime')"
         align="center"
         prop="createTime"
         width="180"
         :formatter="dateFormatter"
       />
-      <el-table-column label="操作" align="center">
+      <el-table-column :label="t('public.operate')" align="center">
         <template #default="scope">
           <el-button
             link
@@ -110,7 +110,7 @@
             @click="openForm('update', scope.row.id)"
             v-hasPermi="['infra:config:update']"
           >
-            编辑
+            {{t('action.edit')}}
           </el-button>
           <el-button
             link
@@ -118,7 +118,7 @@
             @click="handleDelete(scope.row.id)"
             v-hasPermi="['infra:config:delete']"
           >
-            删除
+          {{ t('public.delete') }}
           </el-button>
         </template>
       </el-table-column>

+ 14 - 14
src/views/infra/dataSourceConfig/DataSourceConfigForm.vue

@@ -7,22 +7,22 @@
       :rules="formRules"
       label-width="100px"
     >
-      <el-form-item label="数据源名称" prop="name">
-        <el-input v-model="formData.name" placeholder="请输入参数名称" />
+      <el-form-item :label="t('infra.dataSourceName')" prop="name">
+        <el-input v-model="formData.name" :placeholder="t('infra.pleaseEnterAParameterName')" />
       </el-form-item>
-      <el-form-item label="数据源连接" prop="url">
-        <el-input v-model="formData.url" placeholder="请输入数据源连接" />
+      <el-form-item :label="t('infra.dataSourceConnection')" prop="url">
+        <el-input v-model="formData.url" :placeholder="t('infra.pleaseEnterTheDataSourceConnection')" />
       </el-form-item>
-      <el-form-item label="用户名" prop="username">
-        <el-input v-model="formData.username" placeholder="请输入用户名" />
+      <el-form-item :label="t('infra.userName')" prop="username">
+        <el-input v-model="formData.username" :placeholder="t('infra.pleaseEnterAUserName')" />
       </el-form-item>
-      <el-form-item label="密码" prop="password">
-        <el-input v-model="formData.password" placeholder="请输入密码" />
+      <el-form-item :label="t('infra.password')" prop="password">
+        <el-input v-model="formData.password" :placeholder="t('infra.pleaseEnterAPassword')" />
       </el-form-item>
     </el-form>
     <template #footer>
-      <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button :disabled="formLoading" type="primary" @click="submitForm">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>
@@ -46,10 +46,10 @@ const formData = ref<DataSourceConfigApi.DataSourceConfigVO>({
   password: ''
 })
 const formRules = reactive({
-  name: [{ required: true, message: '数据源名称不能为空', trigger: 'blur' }],
-  url: [{ required: true, message: '数据源连接不能为空', trigger: 'blur' }],
-  username: [{ required: true, message: '用户名不能为空', trigger: 'blur' }],
-  password: [{ required: true, message: '密码不能为空', trigger: 'blur' }]
+  name: [{ required: true, message: t('infra.dataSourceNameCannotBeEmpty'), trigger: 'blur' }],
+  url: [{ required: true, message: t('infra.dataSourceConnectionCannotBeEmpty'), trigger: 'blur' }],
+  username: [{ required: true, message: t('infra.userNameCannotBeEmpty'), trigger: 'blur' }],
+  password: [{ required: true, message: t('infra.passwordCannotBeEmpty'), trigger: 'blur' }]
 })
 const formRef = ref() // 表单 Ref
 

+ 9 - 9
src/views/infra/dataSourceConfig/index.vue

@@ -9,7 +9,7 @@
           @click="openForm('create')"
           v-hasPermi="['infra:data-source-config:create']"
         >
-          <Icon icon="ep:plus" class="mr-5px" /> 新增
+          <Icon icon="ep:plus" class="mr-5px" /> {{t('action.add')}}
         </el-button>
       </el-form-item>
     </el-form>
@@ -18,18 +18,18 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list">
-      <el-table-column label="主键编号" align="center" prop="id" />
-      <el-table-column label="数据源名称" align="center" prop="name" />
-      <el-table-column label="数据源连接" align="center" prop="url" :show-overflow-tooltip="true" />
-      <el-table-column label="用户名" align="center" prop="username" />
+      <el-table-column :label="t('infra.primaryKeyNumber')" align="center" prop="id" />
+      <el-table-column :label="t('infra.dataSourceName')" align="center" prop="name" />
+      <el-table-column :label="t('infra.dataSourceConnection')" align="center" prop="url" :show-overflow-tooltip="true" />
+      <el-table-column :label="t('infra.userName')" align="center" prop="username" />
       <el-table-column
-        label="创建时间"
+        :label="t('public.createTime')"
         align="center"
         prop="createTime"
         width="180"
         :formatter="dateFormatter"
       />
-      <el-table-column label="操作" align="center">
+      <el-table-column :label="t('public.operate')" align="center">
         <template #default="scope">
           <el-button
             link
@@ -38,7 +38,7 @@
             v-hasPermi="['infra:data-source-config:update']"
             :disabled="scope.row.id === 0"
           >
-            编辑
+          {{t('action.edit')}}
           </el-button>
           <el-button
             link
@@ -47,7 +47,7 @@
             v-hasPermi="['infra:data-source-config:delete']"
             :disabled="scope.row.id === 0"
           >
-            删除
+          {{ t('public.delete') }}
           </el-button>
         </template>
       </el-table-column>

+ 2 - 2
src/views/infra/demo/demo01/Demo01ContactForm.vue

@@ -37,8 +37,8 @@
       </el-form-item>
     </el-form>
     <template #footer>
-      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>

+ 12 - 12
src/views/infra/demo/demo01/index.vue

@@ -27,27 +27,27 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="创建时间" prop="createTime">
+      <el-form-item :label="t('public.createTime')" prop="createTime">
         <el-date-picker
           v-model="queryParams.createTime"
           value-format="YYYY-MM-DD HH:mm:ss"
           type="daterange"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
+          :start-placeholder="t('public.startDate')"
+          :end-placeholder="t('public.endDate')"
           :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
           class="!w-240px"
         />
       </el-form-item>
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{$t('common.search')}}</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{$t('common.reset')}}</el-button>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
         <el-button
           type="primary"
           plain
           @click="openForm('create')"
           v-hasPermi="['infra:demo01-contact:create']"
         >
-          <Icon icon="ep:plus" class="mr-5px" /> 新增
+          <Icon icon="ep:plus" class="mr-5px" /> {{t('action.add')}}
         </el-button>
         <el-button
           type="success"
@@ -56,7 +56,7 @@
           :loading="exportLoading"
           v-hasPermi="['infra:demo01-contact:export']"
         >
-          <Icon icon="ep:download" class="mr-5px" /> 导出
+          <Icon icon="ep:download" class="mr-5px" /> {{t('action.export')}}
         </el-button>
       </el-form-item>
     </el-form>
@@ -65,7 +65,7 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
-      <el-table-column label="编号" align="center" prop="id" />
+      <el-table-column :label="t('mp.number')" align="center" prop="id" />
       <el-table-column label="名字" align="center" prop="name" />
       <el-table-column label="性别" align="center" prop="sex">
         <template #default="scope">
@@ -82,13 +82,13 @@
       <el-table-column label="简介" align="center" prop="description" />
       <el-table-column label="头像" align="center" prop="avatar" />
       <el-table-column
-        label="创建时间"
+        :label="t('public.createTime')"
         align="center"
         prop="createTime"
         :formatter="dateFormatter"
         width="180px"
       />
-      <el-table-column label="操作" align="center">
+      <el-table-column :label="t('public.operate')" align="center">
         <template #default="scope">
           <el-button
             link
@@ -96,7 +96,7 @@
             @click="openForm('update', scope.row.id)"
             v-hasPermi="['infra:demo01-contact:update']"
           >
-            编辑
+          {{t('action.edit')}}
           </el-button>
           <el-button
             link
@@ -104,7 +104,7 @@
             @click="handleDelete(scope.row.id)"
             v-hasPermi="['infra:demo01-contact:delete']"
           >
-            删除
+          {{ t('public.delete') }}
           </el-button>
         </template>
       </el-table-column>

+ 2 - 2
src/views/infra/demo/demo02/Demo02CategoryForm.vue

@@ -22,8 +22,8 @@
       </el-form-item>
     </el-form>
     <template #footer>
-      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>

+ 12 - 12
src/views/infra/demo/demo02/index.vue

@@ -17,27 +17,27 @@
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="创建时间" prop="createTime">
+      <el-form-item :label="t('public.createTime')" prop="createTime">
         <el-date-picker
           v-model="queryParams.createTime"
           value-format="YYYY-MM-DD HH:mm:ss"
           type="daterange"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
+          :start-placeholder="t('public.startDate')"
+          :end-placeholder="t('public.endDate')"
           :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
           class="!w-240px"
         />
       </el-form-item>
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{$t('common.search')}}</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{$t('common.reset')}}</el-button>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
         <el-button
           type="primary"
           plain
           @click="openForm('create')"
           v-hasPermi="['infra:demo02-category:create']"
         >
-          <Icon icon="ep:plus" class="mr-5px" /> 新增
+          <Icon icon="ep:plus" class="mr-5px" /> {{t('action.add')}}
         </el-button>
         <el-button
           type="success"
@@ -46,7 +46,7 @@
           :loading="exportLoading"
           v-hasPermi="['infra:demo02-category:export']"
         >
-          <Icon icon="ep:download" class="mr-5px" /> 导出
+          <Icon icon="ep:download" class="mr-5px" /> {{t('action.export')}}
         </el-button>
         <el-button type="danger" plain @click="toggleExpandAll">
           <Icon icon="ep:sort" class="mr-5px" /> 展开/折叠
@@ -66,16 +66,16 @@
       :default-expand-all="isExpandAll"
       v-if="refreshTable"
     >
-      <el-table-column label="编号" align="center" prop="id" />
+      <el-table-column :label="t('mp.number')" align="center" prop="id" />
       <el-table-column label="名字" align="center" prop="name" />
       <el-table-column
-        label="创建时间"
+        :label="t('public.createTime')"
         align="center"
         prop="createTime"
         :formatter="dateFormatter"
         width="180px"
       />
-      <el-table-column label="操作" align="center">
+      <el-table-column :label="t('public.operate')" align="center">
         <template #default="scope">
           <el-button
             link
@@ -83,7 +83,7 @@
             @click="openForm('update', scope.row.id)"
             v-hasPermi="['infra:demo02-category:update']"
           >
-            编辑
+          {{t('action.edit')}}
           </el-button>
           <el-button
             link
@@ -91,7 +91,7 @@
             @click="handleDelete(scope.row.id)"
             v-hasPermi="['infra:demo02-category:delete']"
           >
-            删除
+          {{ t('public.delete') }}
           </el-button>
         </template>
       </el-table-column>

+ 2 - 2
src/views/infra/demo/demo03/erp/Demo03StudentForm.vue

@@ -34,8 +34,8 @@
       </el-form-item>
     </el-form>
     <template #footer>
-      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>

+ 2 - 2
src/views/infra/demo/demo03/erp/components/Demo03CourseForm.vue

@@ -15,8 +15,8 @@
       </el-form-item>
     </el-form>
     <template #footer>
-      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>

+ 5 - 5
src/views/infra/demo/demo03/erp/components/Demo03CourseList.vue

@@ -11,17 +11,17 @@
       新增
     </el-button>
     <el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true">
-      <el-table-column align="center" label="编号" prop="id" />
+      <el-table-column align="center" :label="t('mp.number')" prop="id" />
       <el-table-column align="center" label="名字" prop="name" />
       <el-table-column align="center" label="分数" prop="score" />
       <el-table-column
         :formatter="dateFormatter"
         align="center"
-        label="创建时间"
+        :label="t('public.createTime')"
         prop="createTime"
         width="180px"
       />
-      <el-table-column align="center" label="操作">
+      <el-table-column align="center" :label="t('public.operate')">
         <template #default="scope">
           <el-button
             v-hasPermi="['infra:demo03-student:update']"
@@ -29,7 +29,7 @@
             type="primary"
             @click="openForm('update', scope.row.id)"
           >
-            编辑
+          {{t('action.edit')}}
           </el-button>
           <el-button
             v-hasPermi="['infra:demo03-student:delete']"
@@ -37,7 +37,7 @@
             type="danger"
             @click="handleDelete(scope.row.id)"
           >
-            删除
+          {{ t('public.delete') }}
           </el-button>
         </template>
       </el-table-column>

+ 2 - 2
src/views/infra/demo/demo03/erp/components/Demo03GradeForm.vue

@@ -15,8 +15,8 @@
       </el-form-item>
     </el-form>
     <template #footer>
-      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>

+ 5 - 5
src/views/infra/demo/demo03/erp/components/Demo03GradeList.vue

@@ -11,17 +11,17 @@
       新增
     </el-button>
     <el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true">
-      <el-table-column align="center" label="编号" prop="id" />
+      <el-table-column align="center" :label="t('mp.number')" prop="id" />
       <el-table-column align="center" label="名字" prop="name" />
       <el-table-column align="center" label="班主任" prop="teacher" />
       <el-table-column
         :formatter="dateFormatter"
         align="center"
-        label="创建时间"
+        :label="t('public.createTime')"
         prop="createTime"
         width="180px"
       />
-      <el-table-column align="center" label="操作">
+      <el-table-column align="center" :label="t('public.operate')">
         <template #default="scope">
           <el-button
             v-hasPermi="['infra:demo03-student:update']"
@@ -29,7 +29,7 @@
             type="primary"
             @click="openForm('update', scope.row.id)"
           >
-            编辑
+          {{t('action.edit')}}
           </el-button>
           <el-button
             v-hasPermi="['infra:demo03-student:delete']"
@@ -37,7 +37,7 @@
             type="danger"
             @click="handleDelete(scope.row.id)"
           >
-            删除
+          {{ t('public.delete') }}
           </el-button>
         </template>
       </el-table-column>

+ 12 - 12
src/views/infra/demo/demo03/erp/index.vue

@@ -27,13 +27,13 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="创建时间" prop="createTime">
+      <el-form-item :label="t('public.createTime')" prop="createTime">
         <el-date-picker
           v-model="queryParams.createTime"
           :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
           class="!w-240px"
-          end-placeholder="结束日期"
-          start-placeholder="开始日期"
+          :end-placeholder="t('public.endDate')"
+          :start-placeholder="t('public.startDate')"
           type="daterange"
           value-format="YYYY-MM-DD HH:mm:ss"
         />
@@ -41,11 +41,11 @@
       <el-form-item>
         <el-button @click="handleQuery">
           <Icon class="mr-5px" icon="ep:search" />
-          搜索
+           {{ t('common.search') }}
         </el-button>
         <el-button @click="resetQuery">
           <Icon class="mr-5px" icon="ep:refresh" />
-          重置
+           {{ t('common.reset') }}
         </el-button>
         <el-button
           v-hasPermi="['infra:demo03-student:create']"
@@ -54,7 +54,7 @@
           @click="openForm('create')"
         >
           <Icon class="mr-5px" icon="ep:plus" />
-          新增
+          {{ t('common.common') }}
         </el-button>
         <el-button
           v-hasPermi="['infra:demo03-student:export']"
@@ -64,7 +64,7 @@
           @click="handleExport"
         >
           <Icon class="mr-5px" icon="ep:download" />
-          导出
+          {{ t('action.export') }}
         </el-button>
       </el-form-item>
     </el-form>
@@ -80,7 +80,7 @@
       highlight-current-row
       @current-change="handleCurrentChange"
     >
-      <el-table-column align="center" label="编号" prop="id" />
+      <el-table-column align="center" :label="t('mp.number')" prop="id" />
       <el-table-column align="center" label="名字" prop="name" />
       <el-table-column align="center" label="性别" prop="sex">
         <template #default="scope">
@@ -98,11 +98,11 @@
       <el-table-column
         :formatter="dateFormatter"
         align="center"
-        label="创建时间"
+        :label="t('public.createTime')"
         prop="createTime"
         width="180px"
       />
-      <el-table-column align="center" label="操作">
+      <el-table-column align="center" :label="t('public.operate')">
         <template #default="scope">
           <el-button
             v-hasPermi="['infra:demo03-student:update']"
@@ -110,7 +110,7 @@
             type="primary"
             @click="openForm('update', scope.row.id)"
           >
-            编辑
+          {{t('action.edit')}}
           </el-button>
           <el-button
             v-hasPermi="['infra:demo03-student:delete']"
@@ -118,7 +118,7 @@
             type="danger"
             @click="handleDelete(scope.row.id)"
           >
-            删除
+          {{ t('public.delete') }}
           </el-button>
         </template>
       </el-table-column>

+ 2 - 2
src/views/infra/demo/demo03/inner/Demo03StudentForm.vue

@@ -43,8 +43,8 @@
       </el-tab-pane>
     </el-tabs>
     <template #footer>
-      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>

+ 2 - 1
src/views/infra/demo/demo03/inner/components/Demo03CourseForm.vue

@@ -23,7 +23,7 @@
           </el-form-item>
         </template>
       </el-table-column>
-      <el-table-column align="center" fixed="right" label="操作" width="60">
+      <el-table-column align="center" fixed="right" :label="t('public.operate')" width="60">
         <template #default="{ $index }">
           <el-button @click="handleDelete($index)" link>—</el-button>
         </template>
@@ -36,6 +36,7 @@
 </template>
 <script setup lang="ts">
 import * as Demo03StudentApi from '@/api/infra/demo/demo03/inner'
+const { t } = useI18n()
 
 const props = defineProps<{
   studentId: undefined // 学生编号(主表的关联字段)

+ 2 - 2
src/views/infra/demo/demo03/inner/components/Demo03CourseList.vue

@@ -2,11 +2,11 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
-      <el-table-column label="编号" align="center" prop="id" />
+      <el-table-column :label="t('mp.number')" align="center" prop="id" />
       <el-table-column label="名字" align="center" prop="name" />
       <el-table-column label="分数" align="center" prop="score" />
       <el-table-column
-        label="创建时间"
+        :label="t('public.createTime')"
         align="center"
         prop="createTime"
         :formatter="dateFormatter"

+ 1 - 0
src/views/infra/demo/demo03/inner/components/Demo03GradeForm.vue

@@ -16,6 +16,7 @@
 </template>
 <script setup lang="ts">
 import * as Demo03StudentApi from '@/api/infra/demo/demo03/inner'
+const { t } = useI18n()
 
 const props = defineProps<{
   studentId: undefined // 学生编号(主表的关联字段)

+ 2 - 2
src/views/infra/demo/demo03/inner/components/Demo03GradeList.vue

@@ -2,11 +2,11 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
-      <el-table-column label="编号" align="center" prop="id" />
+      <el-table-column :label="t('mp.number')" align="center" prop="id" />
       <el-table-column label="名字" align="center" prop="name" />
       <el-table-column label="班主任" align="center" prop="teacher" />
       <el-table-column
-        label="创建时间"
+        :label="t('public.createTime')"
         align="center"
         prop="createTime"
         :formatter="dateFormatter"

+ 12 - 12
src/views/infra/demo/demo03/inner/index.vue

@@ -27,27 +27,27 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="创建时间" prop="createTime">
+      <el-form-item :label="t('public.createTime')" prop="createTime">
         <el-date-picker
           v-model="queryParams.createTime"
           value-format="YYYY-MM-DD HH:mm:ss"
           type="daterange"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
+          :start-placeholder="t('public.startDate')"
+          :end-placeholder="t('public.endDate')"
           :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
           class="!w-240px"
         />
       </el-form-item>
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{$t('common.search')}}</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{$t('common.reset')}}</el-button>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
         <el-button
           type="primary"
           plain
           @click="openForm('create')"
           v-hasPermi="['infra:demo03-student:create']"
         >
-          <Icon icon="ep:plus" class="mr-5px" /> 新增
+          <Icon icon="ep:plus" class="mr-5px" /> {{t('action.add')}}
         </el-button>
         <el-button
           type="success"
@@ -56,7 +56,7 @@
           :loading="exportLoading"
           v-hasPermi="['infra:demo03-student:export']"
         >
-          <Icon icon="ep:download" class="mr-5px" /> 导出
+          <Icon icon="ep:download" class="mr-5px" /> {{t('action.export')}}
         </el-button>
       </el-form-item>
     </el-form>
@@ -78,7 +78,7 @@
           </el-tabs>
         </template>
       </el-table-column>
-      <el-table-column label="编号" align="center" prop="id" />
+      <el-table-column :label="t('mp.number')" align="center" prop="id" />
       <el-table-column label="名字" align="center" prop="name" />
       <el-table-column label="性别" align="center" prop="sex">
         <template #default="scope">
@@ -94,13 +94,13 @@
       />
       <el-table-column label="简介" align="center" prop="description" />
       <el-table-column
-        label="创建时间"
+        :label="t('public.createTime')"
         align="center"
         prop="createTime"
         :formatter="dateFormatter"
         width="180px"
       />
-      <el-table-column label="操作" align="center">
+      <el-table-column :label="t('public.operate')" align="center">
         <template #default="scope">
           <el-button
             link
@@ -108,7 +108,7 @@
             @click="openForm('update', scope.row.id)"
             v-hasPermi="['infra:demo03-student:update']"
           >
-            编辑
+          {{t('action.edit')}}
           </el-button>
           <el-button
             link
@@ -116,7 +116,7 @@
             @click="handleDelete(scope.row.id)"
             v-hasPermi="['infra:demo03-student:delete']"
           >
-            删除
+          {{ t('public.delete') }}
           </el-button>
         </template>
       </el-table-column>

+ 2 - 2
src/views/infra/demo/demo03/normal/Demo03StudentForm.vue

@@ -43,8 +43,8 @@
       </el-tab-pane>
     </el-tabs>
     <template #footer>
-      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>

+ 2 - 1
src/views/infra/demo/demo03/normal/components/Demo03CourseForm.vue

@@ -23,7 +23,7 @@
           </el-form-item>
         </template>
       </el-table-column>
-      <el-table-column align="center" fixed="right" label="操作" width="60">
+      <el-table-column align="center" fixed="right" :label="t('public.operate')" width="60">
         <template #default="{ $index }">
           <el-button @click="handleDelete($index)" link>—</el-button>
         </template>
@@ -36,6 +36,7 @@
 </template>
 <script setup lang="ts">
 import * as Demo03StudentApi from '@/api/infra/demo/demo03/normal'
+const { t } = useI18n()
 
 const props = defineProps<{
   studentId: undefined // 学生编号(主表的关联字段)

+ 1 - 0
src/views/infra/demo/demo03/normal/components/Demo03GradeForm.vue

@@ -16,6 +16,7 @@
 </template>
 <script setup lang="ts">
 import * as Demo03StudentApi from '@/api/infra/demo/demo03/normal'
+const { t } = useI18n()
 
 const props = defineProps<{
   studentId: undefined // 学生编号(主表的关联字段)

+ 12 - 12
src/views/infra/demo/demo03/normal/index.vue

@@ -27,27 +27,27 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="创建时间" prop="createTime">
+      <el-form-item :label="t('public.createTime')" prop="createTime">
         <el-date-picker
           v-model="queryParams.createTime"
           value-format="YYYY-MM-DD HH:mm:ss"
           type="daterange"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
+          :start-placeholder="t('public.startDate')"
+          :end-placeholder="t('public.endDate')"
           :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
           class="!w-240px"
         />
       </el-form-item>
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{$t('common.search')}}</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{$t('common.reset')}}</el-button>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
         <el-button
           type="primary"
           plain
           @click="openForm('create')"
           v-hasPermi="['infra:demo03-student:create']"
         >
-          <Icon icon="ep:plus" class="mr-5px" /> 新增
+          <Icon icon="ep:plus" class="mr-5px" /> {{t('action.add')}}
         </el-button>
         <el-button
           type="success"
@@ -56,7 +56,7 @@
           :loading="exportLoading"
           v-hasPermi="['infra:demo03-student:export']"
         >
-          <Icon icon="ep:download" class="mr-5px" /> 导出
+          <Icon icon="ep:download" class="mr-5px" /> {{t('action.export')}}
         </el-button>
       </el-form-item>
     </el-form>
@@ -65,7 +65,7 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
-      <el-table-column label="编号" align="center" prop="id" />
+      <el-table-column :label="t('mp.number')" align="center" prop="id" />
       <el-table-column label="名字" align="center" prop="name" />
       <el-table-column label="性别" align="center" prop="sex">
         <template #default="scope">
@@ -81,13 +81,13 @@
       />
       <el-table-column label="简介" align="center" prop="description" />
       <el-table-column
-        label="创建时间"
+        :label="t('public.createTime')"
         align="center"
         prop="createTime"
         :formatter="dateFormatter"
         width="180px"
       />
-      <el-table-column label="操作" align="center">
+      <el-table-column :label="t('public.operate')" align="center">
         <template #default="scope">
           <el-button
             link
@@ -95,7 +95,7 @@
             @click="openForm('update', scope.row.id)"
             v-hasPermi="['infra:demo03-student:update']"
           >
-            编辑
+          {{t('action.edit')}}
           </el-button>
           <el-button
             link
@@ -103,7 +103,7 @@
             @click="handleDelete(scope.row.id)"
             v-hasPermi="['infra:demo03-student:delete']"
           >
-            删除
+          {{ t('public.delete') }}
           </el-button>
         </template>
       </el-table-column>

+ 0 - 1
src/views/infra/druid/index.vue

@@ -5,7 +5,6 @@
 </template>
 <script lang="ts" setup>
 import * as ConfigApi from '@/api/infra/config'
-
 defineOptions({ name: 'InfraDruid' })
 
 const loading = ref(true) // 是否加载中

+ 8 - 8
src/views/infra/file/FileForm.vue

@@ -1,5 +1,5 @@
 <template>
-  <Dialog v-model="dialogVisible" title="上传文件">
+  <Dialog v-model="dialogVisible" :title="t('infra.uploadFile')">
     <el-upload
       ref="uploadRef"
       v-model:file-list="fileList"
@@ -17,16 +17,16 @@
       drag
     >
       <i class="el-icon-upload"></i>
-      <div class="el-upload__text"> 将文件拖到此处,或 <em>点击上传</em></div>
+      <div class="el-upload__text"> {{t('infra.dragTheFileHereOr')}} <em>{{t('infra.clickUpload')}}</em></div>
       <template #tip>
         <div class="el-upload__tip" style="color: red">
-          提示:仅允许导入 jpg、png、gif 格式文件!
+          {{t('infra.tipOnlyJpgPngGifFormatsAreAllowedToBeImported')}} 
         </div>
       </template>
     </el-upload>
     <template #footer>
-      <el-button :disabled="formLoading" type="primary" @click="submitFileForm">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button :disabled="formLoading" type="primary" @click="submitFileForm">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>
@@ -61,7 +61,7 @@ const handleFileChange = (file) => {
 /** 提交表单 */
 const submitFileForm = () => {
   if (fileList.value.length == 0) {
-    message.error('请上传文件')
+    message.error(t('infra.pleaseUploadTheFile'))
     return
   }
   unref(uploadRef)?.submit()
@@ -81,7 +81,7 @@ const submitFormSuccess = () => {
 
 /** 上传错误提示 */
 const submitFormError = (): void => {
-  message.error('上传失败,请您重新上传!')
+  message.error(t('infra.uploadFailedPleaseReUpload'))
   formLoading.value = false
 }
 
@@ -94,6 +94,6 @@ const resetForm = () => {
 
 /** 文件数超出提示 */
 const handleExceed = (): void => {
-  message.error('最多只能上传一个文件!')
+  message.error(t('infra.youCanOnlyUploadAMaximumOfOneFile'))
 }
 </script>

+ 20 - 20
src/views/infra/file/index.vue

@@ -8,37 +8,37 @@
       :inline="true"
       label-width="68px"
     >
-      <el-form-item label="文件路径" prop="path">
+      <el-form-item :label="t('infra.filePath')" prop="path">
         <el-input
           v-model="queryParams.path"
-          placeholder="请输入文件路径"
+          :placeholder="t('infra.pleaseEnterTheFilePath')"
           clearable
           @keyup.enter="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="文件类型" prop="type" width="80">
+      <el-form-item :label="t('infra.fileType')" prop="type" width="80">
         <el-input
           v-model="queryParams.type"
-          placeholder="请输入文件类型"
+          :placeholder="t('infra.pleaseEnterTheFileType')"
           clearable
           @keyup.enter="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="创建时间" prop="createTime">
+      <el-form-item :label="t('public.createTime')" prop="createTime">
         <el-date-picker
           v-model="queryParams.createTime"
           value-format="YYYY-MM-DD HH:mm:ss"
           type="daterange"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
+          :start-placeholder="t('public.startDate')"
+          :end-placeholder="t('public.endDate')"
           :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
         />
       </el-form-item>
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{$t('common.search')}}</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{$t('common.reset')}}</el-button>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
         <el-button type="primary" plain @click="openForm">
-          <Icon icon="ep:upload" class="mr-5px" /> 上传文件
+          <Icon icon="ep:upload" class="mr-5px" /> {{t('infra.uploadFile')}}
         </el-button>
       </el-form-item>
     </el-form>
@@ -47,18 +47,18 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list">
-      <el-table-column label="文件名" align="center" prop="name" :show-overflow-tooltip="true" />
-      <el-table-column label="文件路径" align="center" prop="path" :show-overflow-tooltip="true" />
+      <el-table-column :label="t('infra.fileName')" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column :label="t('infra.filePath')" align="center" prop="path" :show-overflow-tooltip="true" />
       <el-table-column label="URL" align="center" prop="url" :show-overflow-tooltip="true" />
       <el-table-column
-        label="文件大小"
+        :label="t('infra.fileSize')"
         align="center"
         prop="size"
         width="120"
         :formatter="fileSizeFormatter"
       />
-      <el-table-column label="文件类型" align="center" prop="type" width="180px" />
-      <el-table-column label="文件内容" align="center" prop="url" width="110px">
+      <el-table-column :label="t('infra.fileType')" align="center" prop="type" width="180px" />
+      <el-table-column :label="t('infra.fileContent')" align="center" prop="url" width="110px">
         <template #default="{ row }">
           <el-image
             v-if="row.type.includes('image')"
@@ -75,21 +75,21 @@
             :href="row.url"
             :underline="false"
             target="_blank"
-            >预览</el-link
+            >{{t('infra.preview')}}</el-link
           >
           <el-link v-else type="primary" download :href="row.url" :underline="false" target="_blank"
-            >下载</el-link
+            >{{t('infra.download')}}</el-link
           >
         </template>
       </el-table-column>
       <el-table-column
-        label="上传时间"
+        :label="t('infra.uploadTime')"
         align="center"
         prop="createTime"
         width="180"
         :formatter="dateFormatter"
       />
-      <el-table-column label="操作" align="center">
+      <el-table-column :label="t('public.operate')" align="center">
         <template #default="scope">
           <el-button
             link
@@ -97,7 +97,7 @@
             @click="handleDelete(scope.row.id)"
             v-hasPermi="['infra:file:delete']"
           >
-            删除
+          {{ t('public.delete') }}
           </el-button>
         </template>
       </el-table-column>

+ 44 - 44
src/views/infra/fileConfig/FileConfigForm.vue

@@ -7,17 +7,17 @@
       :rules="formRules"
       label-width="120px"
     >
-      <el-form-item label="配置名" prop="name">
-        <el-input v-model="formData.name" placeholder="请输入配置名" />
+      <el-form-item :label="t('infra.configurationName')" prop="name">
+        <el-input v-model="formData.name" :placeholder="t('infra.pleaseEnterAConfigurationName')" />
       </el-form-item>
-      <el-form-item label="备注" prop="remark">
-        <el-input v-model="formData.remark" placeholder="请输入备注" />
+      <el-form-item :label="t('infra.remarks')" prop="remark">
+        <el-input v-model="formData.remark" :placeholder="t('infra.pleaseEnterNotes')" />
       </el-form-item>
-      <el-form-item label="存储器" prop="storage">
+      <el-form-item :label="t('infra.memory')" prop="storage">
         <el-select
           v-model="formData.storage"
           :disabled="formData.id !== undefined"
-          placeholder="请选择存储器"
+          :placeholder="t('infra.pleaseSelectStorage')"
         >
           <el-option
             v-for="dict in getDictOptions(DICT_TYPE.INFRA_FILE_STORAGE)"
@@ -31,70 +31,70 @@
       <!-- Local / FTP / SFTP -->
       <el-form-item
         v-if="formData.storage >= 10 && formData.storage <= 12"
-        label="基础路径"
+        :label="t('infra.basePath')"
         prop="config.basePath"
       >
-        <el-input v-model="formData.config.basePath" placeholder="请输入基础路径" />
+        <el-input v-model="formData.config.basePath" :placeholder="t('infra.pleaseEnterTheBasePath')" />
       </el-form-item>
       <el-form-item
         v-if="formData.storage >= 11 && formData.storage <= 12"
-        label="主机地址"
+        :label="t('infra.hostAddress')"
         prop="config.host"
       >
-        <el-input v-model="formData.config.host" placeholder="请输入主机地址" />
+        <el-input v-model="formData.config.host" :placeholder="t('infra.pleaseEnterTheHostAddress')" />
       </el-form-item>
       <el-form-item
         v-if="formData.storage >= 11 && formData.storage <= 12"
-        label="主机端口"
+        :label="t('infra.hostPort')"
         prop="config.port"
       >
-        <el-input-number v-model="formData.config.port" :min="0" placeholder="请输入主机端口" />
+        <el-input-number v-model="formData.config.port" :min="0" :placeholder="t('infra.pleaseEnterTheHostPort')" />
       </el-form-item>
       <el-form-item
         v-if="formData.storage >= 11 && formData.storage <= 12"
-        label="用户名"
+        :label="t('infra.userName')"
         prop="config.username"
       >
-        <el-input v-model="formData.config.username" placeholder="请输入密码" />
+        <el-input v-model="formData.config.username" :placeholder="t('infra.pleaseEnterAPassword')" />
       </el-form-item>
       <el-form-item
         v-if="formData.storage >= 11 && formData.storage <= 12"
-        label="密码"
+        :label="t('infra.password')"
         prop="config.password"
       >
-        <el-input v-model="formData.config.password" placeholder="请输入密码" />
+        <el-input v-model="formData.config.password" :placeholder="t('infra.pleaseEnterAPassword')" />
       </el-form-item>
-      <el-form-item v-if="formData.storage === 11" label="连接模式" prop="config.mode">
+      <el-form-item v-if="formData.storage === 11" :label="t('infra.connectionMode')" prop="config.mode">
         <el-radio-group v-model="formData.config.mode">
-          <el-radio key="Active" label="Active">主动模式</el-radio>
-          <el-radio key="Passive" label="Passive">被动模式</el-radio>
+          <el-radio key="Active" label="Active">{{t('infra.activeMode')}}</el-radio>
+          <el-radio key="Passive" label="Passive">{{t('infra.passiveMode')}}</el-radio>
         </el-radio-group>
       </el-form-item>
       <!-- S3 -->
-      <el-form-item v-if="formData.storage === 20" label="节点地址" prop="config.endpoint">
-        <el-input v-model="formData.config.endpoint" placeholder="请输入节点地址" />
+      <el-form-item v-if="formData.storage === 20" :label="t('infra.nodeAddress')" prop="config.endpoint">
+        <el-input v-model="formData.config.endpoint" :placeholder="t('infra.pleaseEnterTheNodeAddress')" />
       </el-form-item>
-      <el-form-item v-if="formData.storage === 20" label="存储 bucket" prop="config.bucket">
-        <el-input v-model="formData.config.bucket" placeholder="请输入 bucket" />
+      <el-form-item v-if="formData.storage === 20" :label="t('infra.storageBucket')" prop="config.bucket">
+        <el-input v-model="formData.config.bucket" :placeholder="t('infra.pleaseEnterBucket')" />
       </el-form-item>
       <el-form-item v-if="formData.storage === 20" label="accessKey" prop="config.accessKey">
-        <el-input v-model="formData.config.accessKey" placeholder="请输入 accessKey" />
+        <el-input v-model="formData.config.accessKey" :placeholder="t('infra.pleaseEnterAccessKey')" />
       </el-form-item>
       <el-form-item v-if="formData.storage === 20" label="accessSecret" prop="config.accessSecret">
-        <el-input v-model="formData.config.accessSecret" placeholder="请输入 accessSecret" />
+        <el-input v-model="formData.config.accessSecret" :placeholder="t('infra.pleaseEnterAccessSecret')" />
       </el-form-item>
       <!-- 通用 -->
-      <el-form-item v-if="formData.storage === 20" label="自定义域名">
+      <el-form-item v-if="formData.storage === 20" :label="t('infra.customizedDomainName')">
         <!-- 无需参数校验,所以去掉 prop -->
-        <el-input v-model="formData.config.domain" placeholder="请输入自定义域名" />
+        <el-input v-model="formData.config.domain" :placeholder="t('infra.pleaseEnterACustomDomainName')" />
       </el-form-item>
-      <el-form-item v-else-if="formData.storage" label="自定义域名" prop="config.domain">
-        <el-input v-model="formData.config.domain" placeholder="请输入自定义域名" />
+      <el-form-item v-else-if="formData.storage" :label="t('infra.customizedDomainName')" prop="config.domain">
+        <el-input v-model="formData.config.domain" :placeholder="t('infra.pleaseEnterACustomDomainName')" />
       </el-form-item>
     </el-form>
     <template #footer>
-      <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button :disabled="formLoading" type="primary" @click="submitForm">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>
@@ -120,20 +120,20 @@ const formData = ref({
   config: {} as FileConfigApi.FileClientConfig
 })
 const formRules = reactive<FormRules>({
-  name: [{ required: true, message: '配置名不能为空', trigger: 'blur' }],
-  storage: [{ required: true, message: '存储器不能为空', trigger: 'change' }],
+  name: [{ required: true, message:t('infra.configurationNameCannotBeEmpty'), trigger: 'blur' }],
+  storage: [{ required: true, message:t('infra.memoryCannotBeEmpty'), trigger: 'change' }],
   config: {
-    basePath: [{ required: true, message: '基础路径不能为空', trigger: 'blur' }],
-    host: [{ required: true, message: '主机地址不能为空', trigger: 'blur' }],
-    port: [{ required: true, message: '主机端口不能为空', trigger: 'blur' }],
-    username: [{ required: true, message: '用户名不能为空', trigger: 'blur' }],
-    password: [{ required: true, message: '密码不能为空', trigger: 'blur' }],
-    mode: [{ required: true, message: '连接模式不能为空', trigger: 'change' }],
-    endpoint: [{ required: true, message: '节点地址不能为空', trigger: 'blur' }],
-    bucket: [{ required: true, message: '存储 bucket 不能为空', trigger: 'blur' }],
-    accessKey: [{ required: true, message: 'accessKey 不能为空', trigger: 'blur' }],
-    accessSecret: [{ required: true, message: 'accessSecret 不能为空', trigger: 'blur' }],
-    domain: [{ required: true, message: '自定义域名不能为空', trigger: 'blur' }]
+    basePath: [{ required: true, message:t('infra.basePathCannotBeEmpty'), trigger: 'blur' }],
+    host: [{ required: true, message:t('infra.hostAddressCannotBeEmpty'), trigger: 'blur' }],
+    port: [{ required: true, message:t('infra.hostPortCannotBeEmpty'), trigger: 'blur' }],
+    username: [{ required: true, message:t('infra.userNameCannotBeEmpty'), trigger: 'blur' }],
+    password: [{ required: true, message:t('infra.passwordCannotBeEmpty'), trigger: 'blur' }],
+    mode: [{ required: true, message:t('infra.connectionModeCannotBeEmpty'), trigger: 'change' }],
+    endpoint: [{ required: true, message:t('infra.nodeAddressCannotBeEmpty'), trigger: 'blur' }],
+    bucket: [{ required: true, message:t('infra.storageBucketCannotBeEmpty') , trigger: 'blur' }],
+    accessKey: [{ required: true, message:t('infra.accessKeyCannotBeEmpty') , trigger: 'blur' }],
+    accessSecret: [{ required: true, message:t('infra.accessSecretCannotBeNull') , trigger: 'blur' }],
+    domain: [{ required: true, message:t('infra.customizedDomainNameCannotBeEmpty') , trigger: 'blur' }]
   } as FormRules
 })
 const formRef = ref() // 表单 Ref

+ 23 - 23
src/views/infra/fileConfig/index.vue

@@ -8,19 +8,19 @@
       :inline="true"
       label-width="68px"
     >
-      <el-form-item label="配置名" prop="name">
+      <el-form-item :label="t('infra.configurationName')" prop="name">
         <el-input
           v-model="queryParams.name"
-          placeholder="请输入配置名"
+          :placeholder="t('infra.pleaseEnterTheConfigurationName')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="存储器" prop="storage">
+      <el-form-item :label="t('infra.memory')" prop="storage">
         <el-select
           v-model="queryParams.storage"
-          placeholder="请选择存储器"
+          :placeholder="t('infra.pleaseSelectMemory')"
           clearable
           class="!w-240px"
         >
@@ -32,27 +32,27 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="创建时间" prop="createTime">
+      <el-form-item :label="t('public.createTime')" prop="createTime">
         <el-date-picker
           v-model="queryParams.createTime"
           value-format="YYYY-MM-DD HH:mm:ss"
           type="daterange"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
+          :start-placeholder="t('public.startDate')"
+          :end-placeholder="t('public.endDate')"
           :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
           class="!w-240px"
         />
       </el-form-item>
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{$t('common.search')}}</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{$t('common.reset')}}</el-button>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
         <el-button
           type="primary"
           plain
           @click="openForm('create')"
           v-hasPermi="['infra:file-config:create']"
         >
-          <Icon icon="ep:plus" class="mr-5px" /> 新增
+          <Icon icon="ep:plus" class="mr-5px" /> {{t('action.add')}}
         </el-button>
       </el-form-item>
     </el-form>
@@ -61,27 +61,27 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list">
-      <el-table-column label="编号" align="center" prop="id" />
-      <el-table-column label="配置名" align="center" prop="name" />
-      <el-table-column label="存储器" align="center" prop="storage">
+      <el-table-column :label="t('infra.no')" align="center" prop="id" />
+      <el-table-column :label="t('infra.configurationName')" align="center" prop="name" />
+      <el-table-column :label="t('infra.memory')" align="center" prop="storage">
         <template #default="scope">
           <dict-tag :type="DICT_TYPE.INFRA_FILE_STORAGE" :value="scope.row.storage" />
         </template>
       </el-table-column>
-      <el-table-column label="备注" align="center" prop="remark" />
-      <el-table-column label="主配置" align="center" prop="primary">
+      <el-table-column :label="t('infra.remarks')" align="center" prop="remark" />
+      <el-table-column :label="t('infra.masterConfiguration')" align="center" prop="primary">
         <template #default="scope">
           <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.master" />
         </template>
       </el-table-column>
       <el-table-column
-        label="创建时间"
+        :label="t('public.createTime')"
         align="center"
         prop="createTime"
         width="180"
         :formatter="dateFormatter"
       />
-      <el-table-column label="操作" align="center" width="240px">
+      <el-table-column :label="t('public.operate')" align="center" width="240px">
         <template #default="scope">
           <el-button
             link
@@ -89,7 +89,7 @@
             @click="openForm('update', scope.row.id)"
             v-hasPermi="['infra:file-config:update']"
           >
-            编辑
+          {{t('action.edit')}}
           </el-button>
           <el-button
             link
@@ -98,16 +98,16 @@
             @click="handleMaster(scope.row.id)"
             v-hasPermi="['infra:file-config:update']"
           >
-            主配置
+            {{t('infra.masterConfiguration')}}
           </el-button>
-          <el-button link type="primary" @click="handleTest(scope.row.id)"> 测试 </el-button>
+          <el-button link type="primary" @click="handleTest(scope.row.id)"> {{t('infra.test')}} </el-button>
           <el-button
             link
             type="danger"
             @click="handleDelete(scope.row.id)"
             v-hasPermi="['infra:file-config:delete']"
           >
-            删除
+          {{ t('public.delete') }}
           </el-button>
         </template>
       </el-table-column>
@@ -193,7 +193,7 @@ const handleDelete = async (id: number) => {
 /** 主配置按钮操作 */
 const handleMaster = async (id) => {
   try {
-    await message.confirm('是否确认修改配置编号为"' + id + '"的数据项为主配置?')
+    await message.confirm(t('infra.isItConfirmedToModifyTheConfigurationNumberOfTheDataItemIsTheMainConfiguration') + id + t('infra.theDataItemsInTheMainConfigurationOfThe'))
     await FileConfigApi.updateFileConfigMaster(id)
     message.success(t('common.updateSuccess'))
     await getList()
@@ -204,7 +204,7 @@ const handleMaster = async (id) => {
 const handleTest = async (id) => {
   try {
     const response = await FileConfigApi.testFileConfig(id)
-    message.alert('测试通过,上传文件成功!访问地址:' + response)
+    message.alert(t('infra.theTestPassedAndTheFileWasUploadedSuccessfullyAccessAddress') + response)
   } catch {}
 }
 

+ 14 - 13
src/views/infra/job/JobDetail.vue

@@ -1,34 +1,34 @@
 <template>
-  <Dialog v-model="dialogVisible" title="任务详细" width="700px">
+  <Dialog v-model="dialogVisible" :title="t('infra.taskDetails')" width="700px">
     <el-descriptions :column="1" border>
-      <el-descriptions-item label="任务编号" min-width="60">
+      <el-descriptions-item :label="t('infra.taskNumber')" min-width="60">
         {{ detailData.id }}
       </el-descriptions-item>
-      <el-descriptions-item label="任务名称">
+      <el-descriptions-item :label="t('infra.taskName')">
         {{ detailData.name }}
       </el-descriptions-item>
-      <el-descriptions-item label="任务名称">
+      <el-descriptions-item :label="t('infra.taskName')">
         <dict-tag :type="DICT_TYPE.INFRA_JOB_STATUS" :value="detailData.status" />
       </el-descriptions-item>
-      <el-descriptions-item label="处理器的名字">
+      <el-descriptions-item :label="t('infra.processorName')">
         {{ detailData.handlerName }}
       </el-descriptions-item>
-      <el-descriptions-item label="处理器的参数">
+      <el-descriptions-item :label="t('infra.parametersOfTheProcessor')">
         {{ detailData.handlerParam }}
       </el-descriptions-item>
-      <el-descriptions-item label="Cron 表达式">
+      <el-descriptions-item :label="t('infra.cron')">
         {{ detailData.cronExpression }}
       </el-descriptions-item>
-      <el-descriptions-item label="重试次数">
+      <el-descriptions-item :label="t('infra.numberOfRetries')">
         {{ detailData.retryCount }}
       </el-descriptions-item>
-      <el-descriptions-item label="重试间隔">
-        {{ detailData.retryInterval + ' 毫秒' }}
+      <el-descriptions-item :label="t('infra.retryInterval')">
+        {{ detailData.retryInterval + t('infra.milliseconds') }}
       </el-descriptions-item>
-      <el-descriptions-item label="监控超时时间">
-        {{ detailData.monitorTimeout > 0 ? detailData.monitorTimeout + ' 毫秒' : '未开启' }}
+      <el-descriptions-item :label="t('infra.monitorTimeout')">
+        {{ detailData.monitorTimeout > 0 ? detailData.monitorTimeout + t('infra.milliseconds') : t('infra.notOpened') }}
       </el-descriptions-item>
-      <el-descriptions-item label="后续执行时间">
+      <el-descriptions-item :label="t('infra.subsequentExecutionTime')">
         <el-timeline>
           <el-timeline-item
             v-for="(nextTime, index) in nextTimes"
@@ -46,6 +46,7 @@
 import { DICT_TYPE } from '@/utils/dict'
 import { formatDate } from '@/utils/formatTime'
 import * as JobApi from '@/api/infra/job'
+const { t } = useI18n()
 
 defineOptions({ name: 'InfraJobDetail' })
 

+ 20 - 20
src/views/infra/job/JobForm.vue

@@ -7,41 +7,41 @@
       label-width="120px"
       v-loading="formLoading"
     >
-      <el-form-item label="任务名称" prop="name">
-        <el-input v-model="formData.name" placeholder="请输入任务名称" />
+      <el-form-item :label="t('infra.taskName')" prop="name">
+        <el-input v-model="formData.name" :placeholder="t('infra.pleaseEnterATaskName')" />
       </el-form-item>
-      <el-form-item label="处理器的名字" prop="handlerName">
+      <el-form-item :label="t('infra.processorName')" prop="handlerName">
         <el-input
           :readonly="formData.id !== undefined"
           v-model="formData.handlerName"
-          placeholder="请输入处理器的名字"
+          :placeholder="t('infra.pleaseEnterTheNameOfTheProcessor')"
         />
       </el-form-item>
-      <el-form-item label="处理器的参数" prop="handlerParam">
-        <el-input v-model="formData.handlerParam" placeholder="请输入处理器的参数" />
+      <el-form-item :label="t('infra.parametersOfTheProcessor')" prop="handlerParam">
+        <el-input v-model="formData.handlerParam" :placeholder="t('infra.pleaseEnterTheParametersOfTheProcessor')" />
       </el-form-item>
-      <el-form-item label="CRON 表达式" prop="cronExpression">
+      <el-form-item :label="t('infra.cronExpression')" prop="cronExpression">
         <crontab v-model="formData.cronExpression" />
       </el-form-item>
-      <el-form-item label="重试次数" prop="retryCount">
+      <el-form-item :label="t('infra.numberOfRetries')" prop="retryCount">
         <el-input
           v-model="formData.retryCount"
-          placeholder="请输入重试次数。设置为 0 时,不进行重试"
+          :placeholder="t('infra.pleaseEnterTheNumberOfRetriesWhenSetTo0NoRetriesArePerformed')"
         />
       </el-form-item>
-      <el-form-item label="重试间隔" prop="retryInterval">
+      <el-form-item :label="t('infra.retryInterval')" prop="retryInterval">
         <el-input
           v-model="formData.retryInterval"
-          placeholder="请输入重试间隔,单位:毫秒。设置为 0 时,无需间隔"
+          :placeholder="t('infra.pleaseEnterTheRetryIntervalInMillisecondsWhenSetTo0NoIntervalIsRequired')"
         />
       </el-form-item>
-      <el-form-item label="监控超时时间" prop="monitorTimeout">
-        <el-input v-model="formData.monitorTimeout" placeholder="请输入监控超时时间,单位:毫秒" />
+      <el-form-item :label="t('infra.monitorTimeout')" prop="monitorTimeout">
+        <el-input v-model="formData.monitorTimeout" :placeholder="t('infra.pleaseEnterTheMonitoringTimeoutInMilliseconds')" />
       </el-form-item>
     </el-form>
     <template #footer>
-      <el-button type="primary" @click="submitForm" :loading="formLoading">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button type="primary" @click="submitForm" :loading="formLoading">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>
@@ -68,11 +68,11 @@ const formData = ref({
   monitorTimeout: undefined
 })
 const formRules = reactive({
-  name: [{ required: true, message: '任务名称不能为空', trigger: 'blur' }],
-  handlerName: [{ required: true, message: '处理器的名字不能为空', trigger: 'blur' }],
-  cronExpression: [{ required: true, message: 'CRON 表达式不能为空', trigger: 'blur' }],
-  retryCount: [{ required: true, message: '重试次数不能为空', trigger: 'blur' }],
-  retryInterval: [{ required: true, message: '重试间隔不能为空', trigger: 'blur' }]
+  name: [{ required: true, message: t('infra.taskNameCannotBeNull'), trigger: 'blur' }],
+  handlerName: [{ required: true, message: t('infra.processorNameCannotBeNull'), trigger: 'blur' }],
+  cronExpression: [{ required: true, message: t('infra.cronExpressionCannotBeNull'), trigger: 'blur' }],
+  retryCount: [{ required: true, message: t('infra.retryCountCannotBeNull'), trigger: 'blur' }],
+  retryInterval: [{ required: true, message: t('infra.retryIntervalCannotBeNull'), trigger: 'blur' }]
 })
 const formRef = ref() // 表单 Ref
 

+ 26 - 25
src/views/infra/job/index.vue

@@ -8,19 +8,19 @@
       :inline="true"
       label-width="100px"
     >
-      <el-form-item label="任务名称" prop="name">
+      <el-form-item :label="t('infra.taskName')" prop="name">
         <el-input
           v-model="queryParams.name"
-          placeholder="请输入任务名称"
+          :placeholder="t('infra.pleaseEnterTheTaskName')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="任务状态" prop="status">
+      <el-form-item :label="t('infra.taskStatus')" prop="status">
         <el-select
           v-model="queryParams.status"
-          placeholder="请选择任务状态"
+          :placeholder="t('infra.pleaseSelectTheTaskStatus')"
           clearable
           class="!w-240px"
         >
@@ -32,25 +32,25 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="处理器的名字" prop="handlerName">
+      <el-form-item :label="t('infra.processorName')" prop="handlerName">
         <el-input
           v-model="queryParams.handlerName"
-          placeholder="请输入处理器的名字"
+          :placeholder="t('infra.pleaseEnterTheNameOfTheProcessor')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{$t('common.search')}}</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{$t('common.reset')}}</el-button>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
         <el-button
           type="primary"
           plain
           @click="openForm('create')"
           v-hasPermi="['infra:job:create']"
         >
-          <Icon icon="ep:plus" class="mr-5px" /> 新增
+          <Icon icon="ep:plus" class="mr-5px" /> {{t('action.add')}}
         </el-button>
         <el-button
           type="success"
@@ -59,10 +59,10 @@
           :loading="exportLoading"
           v-hasPermi="['infra:job:export']"
         >
-          <Icon icon="ep:download" class="mr-5px" /> 导出
+          <Icon icon="ep:download" class="mr-5px" /> {{t('action.export')}}
         </el-button>
         <el-button type="info" plain @click="handleJobLog()" v-hasPermi="['infra:job:query']">
-          <Icon icon="ep:zoom-in" class="mr-5px" /> 执行日志
+          <Icon icon="ep:zoom-in" class="mr-5px" /> {{t('infra.executionLog')}}
         </el-button>
       </el-form-item>
     </el-form>
@@ -71,17 +71,17 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list">
-      <el-table-column label="任务编号" align="center" prop="id" />
-      <el-table-column label="任务名称" align="center" prop="name" />
-      <el-table-column label="任务状态" align="center" prop="status">
+      <el-table-column :label="t('infra.taskNumber')" align="center" prop="id" />
+      <el-table-column :label="t('infra.taskNumber')" align="center" prop="name" />
+      <el-table-column :label="t('infra.taskStatus')" align="center" prop="status">
         <template #default="scope">
           <dict-tag :type="DICT_TYPE.INFRA_JOB_STATUS" :value="scope.row.status" />
         </template>
       </el-table-column>
-      <el-table-column label="处理器的名字" align="center" prop="handlerName" />
-      <el-table-column label="处理器的参数" align="center" prop="handlerParam" />
-      <el-table-column label="CRON 表达式" align="center" prop="cronExpression" />
-      <el-table-column label="操作" align="center" width="200">
+      <el-table-column :label="t('infra.processorName')" align="center" prop="handlerName" />
+      <el-table-column :label="t('infra.parametersOfTheProcessor')" align="center" prop="handlerParam" />
+      <el-table-column :label="t('infra.cron')" align="center" prop="cronExpression" />
+      <el-table-column :label="t('public.operate')" align="center" width="200">
         <template #default="scope">
           <el-button
             type="primary"
@@ -89,15 +89,16 @@
             @click="openForm('update', scope.row.id)"
             v-hasPermi="['infra:job:update']"
           >
-            修改
+            {{t('public.update')}}
           </el-button>
+          {{t('infra.executionLog')}}
           <el-button
             type="primary"
             link
             @click="handleChangeStatus(scope.row)"
             v-hasPermi="['infra:job:update']"
           >
-            {{ scope.row.status === InfraJobStatusEnum.STOP ? '开启' : '暂停' }}
+            {{ scope.row.status === InfraJobStatusEnum.STOP ? t('infra.open') : t('infra.pause') }}
           </el-button>
           <el-button
             type="danger"
@@ -105,23 +106,23 @@
             @click="handleDelete(scope.row.id)"
             v-hasPermi="['infra:job:delete']"
           >
-            删除
+          {{ t('public.delete') }}
           </el-button>
           <el-dropdown
             @command="(command) => handleCommand(command, scope.row)"
             v-hasPermi="['infra:job:trigger', 'infra:job:query']"
           >
-            <el-button type="primary" link><Icon icon="ep:d-arrow-right" /> 更多</el-button>
+            <el-button type="primary" link><Icon icon="ep:d-arrow-right" /> {{t('public.more')}}</el-button>
             <template #dropdown>
               <el-dropdown-menu>
                 <el-dropdown-item command="handleRun" v-if="checkPermi(['infra:job:trigger'])">
-                  执行一次
+                  {{t('infra.executeOnce')}}
                 </el-dropdown-item>
                 <el-dropdown-item command="openDetail" v-if="checkPermi(['infra:job:query'])">
-                  任务详细
+                  {{t('infra.taskDetails')}}
                 </el-dropdown-item>
                 <el-dropdown-item command="handleJobLog" v-if="checkPermi(['infra:job:query'])">
-                  调度日志
+                  {{t('infra.schedulingLog')}}
                 </el-dropdown-item>
               </el-dropdown-menu>
             </template>

+ 12 - 11
src/views/infra/job/logger/JobLogDetail.vue

@@ -1,31 +1,31 @@
 <template>
-  <Dialog v-model="dialogVisible" title="任务详细" width="700px">
+  <Dialog v-model="dialogVisible" :title="t('infra.taskDetails')" width="700px">
     <el-descriptions :column="1" border>
-      <el-descriptions-item label="日志编号" min-width="60">
+      <el-descriptions-item :label="t('infra.logNumber')" min-width="60">
         {{ detailData.id }}
       </el-descriptions-item>
-      <el-descriptions-item label="任务编号">
+      <el-descriptions-item :label="t('infra.taskNumber')">
         {{ detailData.jobId }}
       </el-descriptions-item>
-      <el-descriptions-item label="处理器的名字">
+      <el-descriptions-item :label="t('infra.processorName')">
         {{ detailData.handlerName }}
       </el-descriptions-item>
-      <el-descriptions-item label="处理器的参数">
+      <el-descriptions-item :label="t('infra.parametersOfTheProcessor')">
         {{ detailData.handlerParam }}
       </el-descriptions-item>
-      <el-descriptions-item label="第几次执行">
+      <el-descriptions-item :label="t('infra.numberOfExecutions')">
         {{ detailData.executeIndex }}
       </el-descriptions-item>
-      <el-descriptions-item label="执行时间">
+      <el-descriptions-item :label="t('infra.executionTime')">
         {{ formatDate(detailData.beginTime) + ' ~ ' + formatDate(detailData.endTime) }}
       </el-descriptions-item>
-      <el-descriptions-item label="执行时长">
-        {{ detailData.duration + ' 毫秒' }}
+      <el-descriptions-item :label="t('infra.executionDuration')">
+        {{ detailData.duration + t('infra.milliseconds') }}
       </el-descriptions-item>
-      <el-descriptions-item label="任务状态">
+      <el-descriptions-item :label="t('infra.taskStatus')">
         <dict-tag :type="DICT_TYPE.INFRA_JOB_LOG_STATUS" :value="detailData.status" />
       </el-descriptions-item>
-      <el-descriptions-item label="执行结果">
+      <el-descriptions-item :label="t('infra.executionResult')">
         {{ detailData.duration + ' result' }}
       </el-descriptions-item>
     </el-descriptions>
@@ -35,6 +35,7 @@
 import { DICT_TYPE } from '@/utils/dict'
 import { formatDate } from '@/utils/formatTime'
 import * as JobLogApi from '@/api/infra/jobLog'
+const { t } = useI18n()
 
 defineOptions({ name: 'JobLogDetail' })
 

+ 23 - 22
src/views/infra/job/logger/index.vue

@@ -8,40 +8,40 @@
       :inline="true"
       label-width="120px"
     >
-      <el-form-item label="处理器的名字" prop="handlerName">
+      <el-form-item :label="t('infra.processorName')" prop="handlerName">
         <el-input
           v-model="queryParams.handlerName"
-          placeholder="请输入处理器的名字"
+          :placeholder="t('infra.pleaseEnterTheNameOfTheProcessor')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="开始执行时间" prop="beginTime">
+      <el-form-item :label="t('infra.startExecutionTime')" prop="beginTime">
         <el-date-picker
           v-model="queryParams.beginTime"
           type="date"
           value-format="YYYY-MM-DD HH:mm:ss"
-          placeholder="选择开始执行时间"
+          :placeholder="t('infra.selectTheStartExecutionTime')"
           clearable
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="结束执行时间" prop="endTime">
+      <el-form-item :label="t('infra.endExecutionTime')" prop="endTime">
         <el-date-picker
           v-model="queryParams.endTime"
           type="date"
           value-format="YYYY-MM-DD HH:mm:ss"
-          placeholder="选择结束执行时间"
+          :placeholder="t('infra.selectTheEndExecutionTime')"
           clearable
           :default-time="new Date('1 23:59:59')"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="任务状态" prop="status">
+      <el-form-item :label="t('infra.taskStatus')" prop="status">
         <el-select
           v-model="queryParams.status"
-          placeholder="请选择任务状态"
+          :placeholder="t('infra.pleaseSelectTheTaskStatus')"
           clearable
           class="!w-240px"
         >
@@ -54,8 +54,8 @@
         </el-select>
       </el-form-item>
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{$t('common.search')}}</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{$t('common.reset')}}</el-button>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
         <el-button
           type="success"
           plain
@@ -63,7 +63,7 @@
           :loading="exportLoading"
           v-hasPermi="['infra:job:export']"
         >
-          <Icon icon="ep:download" class="mr-5px" /> 导出
+          <Icon icon="ep:download" class="mr-5px" /> {{t('action.export')}}
         </el-button>
       </el-form-item>
     </el-form>
@@ -72,27 +72,27 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list">
-      <el-table-column label="日志编号" align="center" prop="id" />
-      <el-table-column label="任务编号" align="center" prop="jobId" />
-      <el-table-column label="处理器的名字" align="center" prop="handlerName" />
-      <el-table-column label="处理器的参数" align="center" prop="handlerParam" />
-      <el-table-column label="第几次执行" align="center" prop="executeIndex" />
-      <el-table-column label="执行时间" align="center" width="170s">
+      <el-table-column :label="t('infra.logNumber')" align="center" prop="id" />
+      <el-table-column :label="t('infra.taskNumber')" align="center" prop="jobId" />
+      <el-table-column :label="t('infra.processorName')" align="center" prop="handlerName" />
+      <el-table-column :label="t('infra.parametersOfTheProcessor')" align="center" prop="handlerParam" />
+      <el-table-column :label="t('infra.firstExecution')" align="center" prop="executeIndex" />
+      <el-table-column :label="t('infra.executionTime')" align="center" width="170s">
         <template #default="scope">
           <span>{{ formatDate(scope.row.beginTime) + ' ~ ' + formatDate(scope.row.endTime) }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="执行时长" align="center" prop="duration">
+      <el-table-column :label="t('infra.executionDuration')" align="center" prop="duration">
         <template #default="scope">
           <span>{{ scope.row.duration + ' 毫秒' }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="任务状态" align="center" prop="status">
+      <el-table-column :label="t('infra.taskStatus')" align="center" prop="status">
         <template #default="scope">
           <dict-tag :type="DICT_TYPE.INFRA_JOB_LOG_STATUS" :value="scope.row.status" />
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center">
+      <el-table-column :label="t('public.operate')" align="center">
         <template #default="scope">
           <el-button
             type="primary"
@@ -100,7 +100,7 @@
             @click="openDetail(scope.row.id)"
             v-hasPermi="['infra:job:query']"
           >
-            详细
+            {{ t('infra.detailed') }}
           </el-button>
         </template>
       </el-table-column>
@@ -123,6 +123,7 @@ import { formatDate } from '@/utils/formatTime'
 import download from '@/utils/download'
 import JobLogDetail from './JobLogDetail.vue'
 import * as JobLogApi from '@/api/infra/jobLog'
+const { t } = useI18n()
 
 defineOptions({ name: 'InfraJobLog' })
 
@@ -182,7 +183,7 @@ const handleExport = async () => {
     // 发起导出
     exportLoading.value = true
     const data = await JobLogApi.exportJobLog(queryParams)
-    download.excel(data, '定时任务执行日志.xls')
+    download.excel(data, t('infra.timedTaskExecutionLogXls'))
   } catch {
   } finally {
     exportLoading.value = false

+ 21 - 20
src/views/infra/redis/index.vue

@@ -4,41 +4,41 @@
       <!-- 基本信息 -->
       <el-col :span="24" class="card-box" shadow="hover">
         <el-card>
-          <el-descriptions title="基本信息" :column="6" border>
-            <el-descriptions-item label="Redis版本 :">
+          <el-descriptions :title="t('infra.basicInformation')" :column="6" border>
+            <el-descriptions-item :label="t('infra.redisVersion')">
               {{ cache?.info?.redis_version }}
             </el-descriptions-item>
-            <el-descriptions-item label="运行模式 :">
-              {{ cache?.info?.redis_mode == 'standalone' ? '单机' : '集群' }}
+            <el-descriptions-item :label="t('infra.runtimeMode')">
+              {{ cache?.info?.redis_mode == 'standalone' ? t('infra.standalone') : t('infra.cluster') }}
             </el-descriptions-item>
-            <el-descriptions-item label="端口 :">
+            <el-descriptions-item :label="t('infra.ports')">
               {{ cache?.info?.tcp_port }}
             </el-descriptions-item>
-            <el-descriptions-item label="客户端数 :">
+            <el-descriptions-item :label="t('infra.numberOfClients')">
               {{ cache?.info?.connected_clients }}
             </el-descriptions-item>
-            <el-descriptions-item label="运行时间(天) :">
+            <el-descriptions-item :label="t('infra.runtimeDays')">
               {{ cache?.info?.uptime_in_days }}
             </el-descriptions-item>
-            <el-descriptions-item label="使用内存 :">
+            <el-descriptions-item :label="t('infra.memoryUsed')">
               {{ cache?.info?.used_memory_human }}
             </el-descriptions-item>
-            <el-descriptions-item label="使用CPU :">
+            <el-descriptions-item :label="t('infra.cpuUsed')">
               {{ cache?.info ? parseFloat(cache?.info?.used_cpu_user_children).toFixed(2) : '' }}
             </el-descriptions-item>
-            <el-descriptions-item label="内存配置 :">
+            <el-descriptions-item :label="t('infra.memoryConfiguration')">
               {{ cache?.info?.maxmemory_human }}
             </el-descriptions-item>
-            <el-descriptions-item label="AOF是否开启 :">
-              {{ cache?.info?.aof_enabled == '0' ? '否' : '是' }}
+            <el-descriptions-item :label="t('infra.whetherAOFIsEnabledOrNot')">
+              {{ cache?.info?.aof_enabled == '0' ? t('public.no') : t('public.yes') }}
             </el-descriptions-item>
-            <el-descriptions-item label="RDB是否成功 :">
+            <el-descriptions-item :label="t('infra.whetherRDBSuccessfulOrNot')">
               {{ cache?.info?.rdb_last_bgsave_status }}
             </el-descriptions-item>
-            <el-descriptions-item label="Key数量 :">
+            <el-descriptions-item :label="t('infra.numberOfKeys')">
               {{ cache?.dbSize }}
             </el-descriptions-item>
-            <el-descriptions-item label="网络入口/出口 :">
+            <el-descriptions-item :label="t('infra.networkIngressEgress')">
               {{ cache?.info?.instantaneous_input_kbps }}kps/
               {{ cache?.info?.instantaneous_output_kbps }}kps
             </el-descriptions-item>
@@ -64,6 +64,7 @@
 import * as RedisApi from '@/api/infra/redis'
 import { RedisMonitorInfoVO } from '@/api/infra/redis/types'
 const cache = ref<RedisMonitorInfoVO>()
+  const { t } = useI18n()
 
 // 基本信息
 const readRedisInfo = async () => {
@@ -75,7 +76,7 @@ const readRedisInfo = async () => {
 const usedmemoryEchartChika = reactive<any>({
   title: {
     // 仪表盘标题。
-    text: '内存使用情况',
+    text: t('infra.memoryUsage'),
     left: 'center',
     show: true, // 是否显示标题,默认 true。
     offsetCenter: [0, '20%'], //相对于仪表盘中心的偏移位置,数组第一项是水平方向的偏移,第二项是垂直方向的偏移。可以是绝对的数值,也可以是相对于仪表盘半径的百分比。
@@ -91,7 +92,7 @@ const usedmemoryEchartChika = reactive<any>({
   },
   series: [
     {
-      name: '峰值',
+      name:t('infra.peak'),
       type: 'gauge',
       min: 0,
       max: 50,
@@ -161,7 +162,7 @@ const usedmemoryEchartChika = reactive<any>({
 // 指令使用情况
 const commandStatsRefChika = reactive({
   title: {
-    text: '命令统计',
+    text:t('infra.commandStatistics'),
     left: 'center'
   },
   tooltip: {
@@ -181,7 +182,7 @@ const commandStatsRefChika = reactive({
   },
   series: [
     {
-      name: '命令',
+      name:t('infra.commands') ,
       type: 'pie',
       radius: [20, 120],
       center: ['40%', '60%'],
@@ -247,7 +248,7 @@ const usedMemoryInstance = async () => {
 
     usedmemoryEchartChika.series[0].data[0] = {
       value: cache.value!.info.used_memory_human,
-      name: '内存消耗'
+      name: t('infra.memoryConsumption')
     }
     console.log(cache.value!.info)
     usedmemoryEchartChika.tooltip = {

+ 0 - 1
src/views/infra/skywalking/index.vue

@@ -5,7 +5,6 @@
 </template>
 <script lang="ts" setup>
 import * as ConfigApi from '@/api/infra/config'
-
 defineOptions({ name: 'InfraSkyWalking' })
 
 const loading = ref(true) // 是否加载中

+ 0 - 1
src/views/infra/swagger/index.vue

@@ -5,7 +5,6 @@
 </template>
 <script lang="ts" setup>
 import * as ConfigApi from '@/api/infra/config'
-
 defineOptions({ name: 'InfraSwagger' })
 
 const loading = ref(true) // 是否加载中

+ 18 - 17
src/views/infra/webSocket/index.vue

@@ -4,23 +4,23 @@
     <el-card :gutter="12" class="w-1/2" shadow="always">
       <template #header>
         <div class="card-header">
-          <span>连接</span>
+          <span>{{ t('infra.connection') }}</span>
         </div>
       </template>
       <div class="flex items-center">
-        <span class="mr-4 text-lg font-medium"> 连接状态: </span>
+        <span class="mr-4 text-lg font-medium"> {{ t('infra.connectionStatus') }}: </span>
         <el-tag :color="getTagColor">{{ status }}</el-tag>
       </div>
       <hr class="my-4" />
       <div class="flex">
         <el-input v-model="server" disabled>
-          <template #prepend>服务地址</template>
+          <template #prepend>{{ t('infra.serviceAddress') }}</template>
         </el-input>
         <el-button :type="getIsOpen ? 'danger' : 'primary'" @click="toggleConnectStatus">
-          {{ getIsOpen ? '关闭连接' : '开启连接' }}
+          {{ getIsOpen ? t('infra.closeConnection') : t('infra.openConnection') }}
         </el-button>
       </div>
-      <p class="mt-4 text-lg font-medium">消息输入框</p>
+      <p class="mt-4 text-lg font-medium">{{ t('infra.messageInputBox') }}</p>
       <hr class="my-4" />
       <el-input
         v-model="sendText"
@@ -28,10 +28,10 @@
         :disabled="!getIsOpen"
         clearable
         type="textarea"
-        placeholder="请输入你要发送的消息"
+        :placeholder="t('infra.pleaseEnterMessageSend')"
       />
-      <el-select v-model="sendUserId" class="mt-4" placeholder="请选择发送人">
-        <el-option key="" label="所有人" value="" />
+      <el-select v-model="sendUserId" class="mt-4" :placeholder="t('infra.pleaseSelectSender')">
+        <el-option key="" :label="t('infra.allPeople')" value="" />
         <el-option
           v-for="user in userList"
           :key="user.id"
@@ -40,21 +40,21 @@
         />
       </el-select>
       <el-button :disabled="!getIsOpen" block class="ml-2 mt-4" type="primary" @click="handlerSend">
-        发送
+        {{ t('infra.sent') }}
       </el-button>
     </el-card>
     <!-- 右侧:消息记录 -->
     <el-card :gutter="12" class="w-1/2" shadow="always">
       <template #header>
         <div class="card-header">
-          <span>消息记录</span>
+          <span>{{ t('infra.messageRecord') }}</span>
         </div>
       </template>
       <div class="max-h-80 overflow-auto">
         <ul>
           <li v-for="msg in messageReverseList" :key="msg.time" class="mt-2">
             <div class="flex items-center">
-              <span class="text-primary mr-2 font-medium">收到消息:</span>
+              <span class="text-primary mr-2 font-medium">{{ t('infra.messageReceived') }}:</span>
               <span>{{ formatDate(msg.time) }}</span>
             </div>
             <div>
@@ -71,6 +71,7 @@ import { formatDate } from '@/utils/formatTime'
 import { useWebSocket } from '@vueuse/core'
 import { getAccessToken } from '@/utils/auth'
 import * as UserApi from '@/api/system/user'
+const { t } = useI18n()
 
 defineOptions({ name: 'InfraWebSocket' })
 
@@ -110,7 +111,7 @@ watchEffect(() => {
     const type = jsonMessage.type
     const content = JSON.parse(jsonMessage.content)
     if (!type) {
-      message.error('未知的消息类型:' + data.value)
+      message.error(t('infra.unknownMessageType') + data.value)
       return
     }
     // 2.2 消息类型:demo-message-receive
@@ -118,12 +119,12 @@ watchEffect(() => {
       const single = content.single
       if (single) {
         messageList.value.push({
-          text: `【单发】用户编号(${content.fromUserId}):${content.text}`,
+          text: `${t('infra.groupNoticUserCode')}(${content.fromUserId}):${content.text}`,
           time: new Date().getTime()
         })
       } else {
         messageList.value.push({
-          text: `【群发】用户编号(${content.fromUserId}):${content.text}`,
+          text: `${t('infra.groupSendingUserNumber')}(${content.fromUserId}):${content.text}`,
           time: new Date().getTime()
         })
       }
@@ -132,14 +133,14 @@ watchEffect(() => {
     // 2.3 消息类型:notice-push
     if (type === 'notice-push') {
       messageList.value.push({
-        text: `【系统通知】:${content.title}`,
+        text: `${t('infra.systemNotification')}${content.title}`,
         time: new Date().getTime()
       })
       return
     }
-    message.error('未处理消息:' + data.value)
+    message.error(t('infra.messageNotProcessed') + data.value)
   } catch (error) {
-    message.error('处理消息发生异常:' + data.value)
+    message.error(t('infra.anExceptionOccurredInProcessingTheMessage') + data.value)
     console.error(error)
   }
 })

+ 9 - 7
src/views/mall/cashier/hangList.vue

@@ -4,34 +4,36 @@
         <template #header>
           <el-row>
             <el-col :span="12" style="font-size:14px;font-weight:bold"> 
-              <div> 取单号:{{item.hangNo}}</div>
+              <div> {{t('mall.orderNumber')}}:{{item.hangNo}}</div>
              
             </el-col>
-            <el-col :span="12" style="text-align:right"><div>订单总价:<span style="color:red;font-size:18px">¥{{item.totalPrice}}</span></div></el-col>
+            <el-col :span="12" style="text-align:right"><div>{{t('mall.totalOrderPrice')}}:<span style="color:red;font-size:18px">¥{{item.totalPrice}}</span></div></el-col>
           </el-row>
         </template>
         <el-row v-for="(cart,i) in item.storeCartRespVOS" :key="i">
-            <el-col :span="8">{{cart.storeName}} <span style="font-size:10px;color:red">规格:{{cart.sku}}</span></el-col>
+            <el-col :span="8">{{cart.storeName}} <span style="font-size:10px;color:red">{{t('mall.specification')}}:{{cart.sku}}</span></el-col>
             <el-col :span="8">¥{{cart.price}}</el-col>
             <el-col :span="8">× {{cart.cartNum}}</el-col>
         </el-row>
         <template #footer>
           <div style="text-align:right">
-              <el-button type="danger" round @click="del(item.hangNo)">删除</el-button>
-              <el-button type="warning" round @click="takeOrder(item.hangNo)">取单</el-button>
+              <el-button type="danger" round @click="del(item.hangNo)">{{t('action.delete')}}</el-button>
+              <el-button type="warning" round @click="takeOrder(item.hangNo)">{{t('mall.orderPickup')}}</el-button>
           </div>
         </template>
       </el-card>
-      <div v-if="orderList.length == 0"><el-empty description="暂无商品挂单" /></div>
+      <div v-if="orderList.length == 0"><el-empty :description="t('mall.noProductsListed')" /></div>
       <template #footer>
         <div>
-            <el-button @click="cancel()">取 消</el-button>
+            <el-button @click="cancel()">{{t('common.cancel')}}</el-button>
         </div>
       </template>
   </el-dialog>
 </template>
 <script  setup lang="ts" name="settlement">
 import * as CashierApi from '@/api/mall/cashier'
+const { t } = useI18n()
+
 const dialogVisible = ref(false)
 const orderList = ref([])
 const shopId = ref(0)

+ 24 - 22
src/views/mall/cashier/help.vue

@@ -10,7 +10,7 @@
         label-width="68px"
       >
       <el-form-item label="就餐人数" prop="orderId">
-        <el-input-number v-model="deskNumber" placeholder="请输入人数" />
+        <el-input-number v-model="deskNumber" :placeholder="t('mall.pleaseEnterTheNumberOfPeople')" />
         </el-form-item>  
       </el-form>
 
@@ -25,7 +25,7 @@
           <div class="cart-container" >
               <div class="title">
                 <div class="logo">
-                  收银员:
+                  {{t('mall.cashier')}}:
                 </div>
                 <div class="member-info">
                   <span class="name">{{userStore.getUser.nickname}}</span>
@@ -51,21 +51,21 @@
                       </div>
                     </div>
                     <div class="empty" v-else>
-                      <el-empty description="暂无结算商品" :image-size="40" />
+                      <el-empty :description="t('mall.noItemsAvailableAtThisTime')" :image-size="40" />
                     </div>
                   </div>
                 </div>
               </div>
               <div class="footer">
                 <div class="number">
-                  <div class="total-num">总件数:<b class="num">{{getCartGoodsNumber}}</b></div>
-                  <div class="total-price">总金额:<b class="num">¥{{getCartGoodsPrice}}</b></div>
+                  <div class="total-num">{{t('mall.totalNumberOfItems')}}:<b class="num">{{getCartGoodsNumber}}</b></div>
+                  <div class="total-price">{{t('mall.totalAmount')}}:<b class="num">¥{{getCartGoodsPrice}}</b></div>
                 </div>
                 <div class="options">
                   <div style="width:300px;margin-top:10px">
-                  <el-button type="primary" round @click="hangOff()">取单</el-button>
-                  <el-button type="warning" round @click="hangUp()">挂单</el-button>
-                  <el-button type="danger" round @click="doSettlement()">去下单</el-button>
+                  <el-button type="primary" round @click="hangOff()">{{t('mall.orderPickup')}}</el-button>
+                  <el-button type="warning" round @click="hangUp()">{{t('mall.pendingOrders')}}</el-button>
+                  <el-button type="danger" round @click="doSettlement()">{{t('mall.goToOrder')}}</el-button>
                   </div>
                 </div>
               </div>
@@ -78,14 +78,14 @@
                 <div class="title">
                   <el-form class="search-form" ref="searchForm" :inline="true">
                     <el-form-item class="form-item" label="" prop="keyword">
-                      <el-input  prefix-icon="el-icon-full-screen"  v-model="queryParams2.storeName" class="input-item" placeholder="请输入商品关键字:商品名称" clearable maxlength="100" />
+                      <el-input  prefix-icon="el-icon-full-screen"  v-model="queryParams2.storeName" class="input-item" :placeholder="t('mall.pleaseEnterTheProductKeywordProductName')" clearable maxlength="100" />
                     </el-form-item>
                     <el-form-item>
-                      <el-button class="search-goods" type="danger" @click="doQueryGoods()"><Icon icon="ep:search" class="mr-5px" />查询商品</el-button>
+                      <el-button class="search-goods" type="danger" @click="doQueryGoods()"><Icon icon="ep:search" class="mr-5px" />{{t('mall.checkProducts')}}</el-button>
                     </el-form-item>
                   </el-form>
                   <el-tabs class="tab-box" v-model="activeName" type="card"  @tab-click="switchTab">
-                    <el-tab-pane label="全部" :name="0" />
+                    <el-tab-pane :label="t('public.all')" :name="0" />
                     <el-tab-pane :label="item.name" :name="item.id" :key="idx" v-for="(item,idx) in cateList" />
                   </el-tabs>
                 </div>
@@ -99,7 +99,7 @@
                       </div>
                   </div>
 
-                  <el-dialog title="选择商品规格"  v-model="dialogVisible" class="common-dialog" append-to-body>
+                  <el-dialog :title="t('mall.selectProductSpecification')"  v-model="dialogVisible" class="common-dialog" append-to-body>
                     <div class="goods-info">
                       <div class="name">{{productInfo.storeName}}</div>
                       <div class="price">¥{{productInfo.price}}</div>
@@ -115,12 +115,12 @@
                     </div>
                     <template #footer>
                       <div  class="dialog-footer">
-                        <el-button type="primary" class="main-button" @click="addToCart()">加入结算</el-button>
-                        <el-button @click="closeGoodsDialog()">取 消</el-button>
+                        <el-button type="primary" class="main-button" @click="addToCart()">{{t('mall.settleMattersAdding')}}</el-button>
+                        <el-button @click="closeGoodsDialog()">{{t('common.cancel')}}</el-button>
                       </div>
                     </template>
                   </el-dialog>
-                  <el-empty v-if="productList.length == 0" description="暂无商品..." />
+                  <el-empty v-if="productList.length == 0" :description="t('mall.noProducts')" />
                 </div>
                 <div>
                     <Pagination
@@ -152,6 +152,8 @@ import settlement from './settlement.vue'
 // import scanPay from './scanPay.vue'
 import hangList from './hangList.vue'
 import { useUserStore } from '@/store/modules/user'
+const { t } = useI18n()
+
 const drawer = ref(false)
 const dialogTitle = ref('') // 弹窗的标题
 const userStore = useUserStore()
@@ -191,7 +193,7 @@ const orderInfo = ref({})
 /** 打开弹窗 */
 const open = async (desk,order) => {
   drawer.value = true
-  dialogTitle.value = "桌台:" + desk.number
+  dialogTitle.value = t('mall.tableTop') + desk.number
 
   deskInfo.value = desk
   if(order.id){
@@ -320,13 +322,13 @@ const closeGoodsDialog = () => {
 
 const addToCart = async() => {
     if(Object.keys(thisProductSku.value).length == 0) {
-      message.error('请选择规格!')
+      message.error(t('mall.pleaseSelectTheSpecification'))
       return
     }
     console.log('user:',thisProductSku.value)
     //let uid = memberInfo.value.id ? memberInfo.value.id : 0
     if(shopId.value == 0){
-      message.error('请选择门店!')
+      message.error(t('mall.pleaseSelectTheStore'))
       return
     }
     let data = {uid:0,shopId:shopId.value,productId:thisProductSku.value.productId,
@@ -348,7 +350,7 @@ const getCartList = async(id) => {
 const changeBuyNum = async(cart) => {
   console.log('cart:',cart)
   if(cart.cartNum < 1){
-      message.error('数量不能小于1哦')
+      message.error(t('mall.quantityCannotBeLessThan1'))
       return
   }
   await CashierApi.updateCartNum(cart)
@@ -363,7 +365,7 @@ const hangUp = async() => {
   let ids = cartList.value.map(item => item.id);
   console.log('ids:',ids)
   if(ids.length == 0){
-    message.error('暂无商品挂单')
+    message.error(t('mall.noProductsListed'))
     return
   }
   //console.log('ids:',ids.toString())
@@ -381,11 +383,11 @@ const settlementRef = ref()
 // const scanPayRef = ref()
 const doSettlement = () => {
   if(cartList.value.length == 0){
-      message.error('请先加入商品!')
+      message.error(t('mall.pleaseAddTheProductFirst'))
       return
   }
   if(deskNumber.value == 0){
-    message.error('就餐人数必须大于0!')
+    message.error(t('mall.theNumberOfDinersMustBeGreaterThan0'))
     return
   }
   submit()

+ 24 - 23
src/views/mall/cashier/index.vue

@@ -8,7 +8,7 @@
       :inline="true"
       label-width="68px"
     >
-    <el-form-item :label="$t('work.selectStore')" prop="orderId">
+    <el-form-item :label="t('work.selectStore')" prop="orderId">
       <el-select
           v-model="queryParams.shopId"
           class="!w-240px"
@@ -22,8 +22,8 @@
         </el-select>
       </el-form-item>  
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{$t('common.search')}}</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{$t('common.reset')}}</el-button>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
       </el-form-item>
     </el-form>
 
@@ -38,7 +38,7 @@
         <div class="cart-container" >
             <div class="title">
               <div class="logo">
-                收银员:
+                {{ t('mall.cashier') }}:
               </div>
               <div class="member-info">
                 <span class="name">{{userStore.getUser.nickname}}</span>
@@ -64,21 +64,21 @@
                     </div>
                   </div>
                   <div class="empty" v-else>
-                    <el-empty description="暂无结算商品" :image-size="40" />
+                    <el-empty :description="t('mall.noItemsAvailableAtThisTime')" :image-size="40" />
                   </div>
                 </div>
               </div>
             </div>
             <div class="footer">
               <div class="number">
-                <div class="total-num">总件数:<b class="num">{{getCartGoodsNumber}}</b></div>
-                <div class="total-price">总金额:<b class="num">¥{{getCartGoodsPrice}}</b></div>
+                <div class="total-num">{{t('mall.totalNumberOfItems')}}:<b class="num">{{getCartGoodsNumber}}</b></div>
+                <div class="total-price">{{t('mall.totalAmount')}}:<b class="num">¥{{getCartGoodsPrice}}</b></div>
               </div>
               <div class="options">
                 <div style="width:300px;margin-top:10px">
-                <el-button type="primary" round @click="hangOff()">取单</el-button>
-                <el-button type="warning" round @click="hangUp()">挂单</el-button>
-                <el-button type="danger" round @click="doSettlement()">提交结算</el-button>
+                <el-button type="primary" round @click="hangOff()">>{{t('mall.orderPickup')}}</el-button>
+                <el-button type="warning" round @click="hangUp()">>{{t('mall.pendingOrders')}}</el-button>
+                <el-button type="danger" round @click="doSettlement()">>{{t('mall.settleMattersSubmit')}}</el-button>
                 </div>
               </div>
             </div>
@@ -91,14 +91,14 @@
               <div class="title">
                 <el-form class="search-form" ref="searchForm" :inline="true">
                   <el-form-item class="form-item" label="" prop="keyword">
-                    <el-input  prefix-icon="el-icon-full-screen"  v-model="queryParams2.storeName" class="input-item" placeholder="请输入商品关键字:商品名称" clearable maxlength="100" />
+                    <el-input  prefix-icon="el-icon-full-screen"  v-model="queryParams2.storeName" class="input-item" :placeholder="t('mall.pleaseEnterTheProductKeywordProductName')" clearable maxlength="100" />
                   </el-form-item>
                   <el-form-item>
-                    <el-button class="search-goods" type="danger" @click="doQueryGoods()"><Icon icon="ep:search" class="mr-5px" />查询商品</el-button>
+                    <el-button class="search-goods" type="danger" @click="doQueryGoods()"><Icon icon="ep:search" class="mr-5px" />{{ t('mall.checkProducts')}}</el-button>
                   </el-form-item>
                 </el-form>
                 <el-tabs class="tab-box" v-model="activeName" type="card"  @tab-click="switchTab">
-                  <el-tab-pane label="全部" :name="0" />
+                  <el-tab-pane :label="t('public.all')" :name="0" />
                   <el-tab-pane :label="item.name" :name="item.id" :key="idx" v-for="(item,idx) in cateList" />
                 </el-tabs>
               </div>
@@ -112,7 +112,7 @@
                     </div>
                 </div>
 
-                <el-dialog title="选择商品规格"  v-model="dialogVisible" class="common-dialog" append-to-body>
+                <el-dialog :title="t('mall.selectProductSpecification')"  v-model="dialogVisible" class="common-dialog" append-to-body>
                   <div class="goods-info">
                     <div class="name">{{productInfo.storeName}}</div>
                     <div class="price">¥{{productInfo.price}}</div>
@@ -128,12 +128,12 @@
                   </div>
                   <template #footer>
                     <div  class="dialog-footer">
-                      <el-button type="primary" class="main-button" @click="addToCart()">加入结算</el-button>
-                      <el-button @click="closeGoodsDialog()">取 消</el-button>
+                      <el-button type="primary" class="main-button" @click="addToCart()">{{t('mall.settleMattersAdding')}}</el-button>
+                      <el-button @click="closeGoodsDialog()">{{t('common.cancel')}}</el-button>
                     </div>
                   </template>
                 </el-dialog>
-                <el-empty v-if="productList.length == 0" description="暂无商品..." />
+                <el-empty v-if="productList.length == 0" :description="t('mall.noProducts')" />
               </div>
               <div>
                   <Pagination
@@ -169,6 +169,7 @@ import settlement from './settlement.vue'
 // import scanPay from './scanPay.vue'
 import hangList from './hangList.vue'
 import { useUserStore } from '@/store/modules/user'
+const { t } = useI18n()
 
 const userStore = useUserStore()
 const message = useMessage() // 消息弹窗
@@ -226,7 +227,7 @@ const getShopList = async () => {
       shopId.value = shopList.value[0].id
     }
     if(shopId.value == 0){
-      message.error('请添加门店或者选择门店')
+      message.error(t('mall.pleaseAddAStoreOrSelectAStore'))
       return
     }
     queryParams.shopId = shopId.value 
@@ -329,13 +330,13 @@ const closeGoodsDialog = () => {
 
 const addToCart = async() => {
     if(Object.keys(thisProductSku.value).length == 0) {
-      message.error('请选择规格!')
+      message.error(t('mall.pleaseSelectTheSpecification'))
       return
     }
     console.log('user:',thisProductSku.value)
     //let uid = memberInfo.value.id ? memberInfo.value.id : 0
     if(shopId.value == 0){
-      message.error('请选择门店!')
+      message.error(t('mall.pleaseSelectTheStore'))
       return
     }
     let data = {uid:0,shopId:shopId.value,productId:thisProductSku.value.productId,
@@ -357,7 +358,7 @@ const getCartList = async(id) => {
 const changeBuyNum = async(cart) => {
   console.log('cart:',cart)
   if(cart.cartNum < 1){
-      message.error('数量不能小于1哦')
+      message.error(t('mall.quantityCannotBeLessThan1'))
       return
   }
   await CashierApi.updateCartNum(cart)
@@ -372,7 +373,7 @@ const hangUp = async() => {
   let ids = cartList.value.map(item => item.id);
   console.log('ids:',ids)
   if(ids.length == 0){
-    message.error('暂无商品挂单')
+    message.error(t('mall.noProductsListed'))
     return
   }
   //console.log('ids:',ids.toString())
@@ -390,7 +391,7 @@ const settlementRef = ref()
 // const scanPayRef = ref()
 const doSettlement = () => {
   if(cartList.value.length == 0){
-      message.error('请先加入商品!')
+      message.error(t('mall.pleaseAddTheProductFirst'))
       return
   }
  settlementRef.value.open()

+ 4 - 3
src/views/mall/cashier/payResult.vue

@@ -5,21 +5,22 @@
             <div class="main">
               <div class="success">
                 <img class="icon" src="@/assets/svgs/pay-success.svg"/>
-                <div class="txt">支付成功</div>
+                <div class="txt">{{t('mall.successfulPayment')}}</div>
               </div>
             </div>
           </el-col>
         </el-row>
         <template #footer>
           <div >
-              <el-button type="warning" round  @click="printOrder()">打印小票</el-button>
-              <el-button type="primary" round @click="submit()">确 认</el-button>
+              <el-button type="warning" round  @click="printOrder()">{{t('mall.printTicket')}}</el-button>
+              <el-button type="primary" round @click="submit()">{{t('common.confirm')}}</el-button>
           </div>
         </template>
   </el-dialog>
 </template>
 <script setup lang="ts" name="payResult">
 import * as CashierApi from '@/api/mall/cashier'
+const { t } = useI18n()
 const dialogVisible = ref(false)
 
 const props = defineProps<{

+ 4 - 2
src/views/mall/cashier/scanPay.vue

@@ -7,19 +7,21 @@
               <div class="amount-info">
                 <span class="amount">¥1.00</span>
               </div>
-              <div class="tips">请使用扫码盒子或者扫描枪,扫描会员付款码!</div>
+              <div class="tips">{{t('mall.pleaseUseTheScannerBoxOrScannerGunToScanTheMemberPaymentCode')}}</div>
             </div>
           </el-col>
         </el-row>
         <template #footer>
           <div>
-            <el-button type="primary" class="main-button" @click="submit()">扫码完成并打印小票</el-button>
+            <el-button type="primary" class="main-button" @click="submit()">{{t('mall.scanTheCodeAndPrintTheTicket')}}</el-button>
           </div>
         </template>
   </el-dialog>
 </template>
 <script setup lang="ts" name="scanPay">
 import * as CashierApi from '@/api/mall/cashier'
+const { t } = useI18n()
+
 const dialogVisible = ref(false)
 const orderId = ref('')
 

+ 23 - 21
src/views/mall/cashier/settlement.vue

@@ -3,66 +3,66 @@
       <el-form ref="form" label-width="0px">
         <div class="settlement">
           <div class="left">
-              <div class="title">请选择支付方式</div>
+              <div class="title">{{t('mall.pleaseChooseThePaymentMethod')}}</div>
               <div class="content">
                  <div :class="'pay-item' + (payType == 'cash' ? ' active' : '')" @click="selectPayType('cash')">
                     <img class="icon" src="@/assets/svgs/cash.svg"/>
-                    <div class="name">现金支付</div>
+                    <div class="name">{{t('mall.cash')}}</div>
                  </div>
                  <div :class="'pay-item' + (payType == 'yue' ? ' active' : '')" @click="selectPayType('yue')">
                     <img class="icon" src="@/assets/svgs/money2.svg" />
-                    <div class="name">余额支付</div>
+                    <div class="name">{{t('mall.balancePayment')}}</div>
                  </div>
                 <div :class="'pay-item' + (payType == 'weixin' ? ' active' : '')" @click="selectPayType('weixin')">
                   <img class="icon" src="@/assets/svgs/weixin.svg" />
-                  <div class="name">微信支付</div>
+                  <div class="name">{{t('mall.weChatPayment')}}</div>
                 </div>
                 <div :class="'pay-item' + (payType == 'alipay' ? ' active' : '')" @click="selectPayType('alipay')">
                   <img class="icon" src="@/assets/svgs/slipay.svg" />
-                  <div class="name">支付宝支付</div>
+                  <div class="name">{{t('mall.alipayPayment')}}</div>
                 </div>
               </div>
           </div>
           <div class="main">
-              <div class="title">结算信息</div>
+              <div class="title">{{t('mall.settlementInformation')}}</div>
               <div class="content">
                   <div class="remark-info">
-                    <div>备注信息:</div>
+                    <div>{{t('mall.remarkInformation')}}:</div>
                     <el-form-item class="form-item" prop="remark">
-                      <el-input type="textarea" v-model="remark"  placeholder="请输入备注信息" clearable/>
+                      <el-input type="textarea" v-model="remark"  :placeholder="t('mall.pleaseEnterNoteInformation')" clearable/>
                     </el-form-item>
                   </div>
                   <div class="discount-info">
                     <el-row>
                       <el-col :span="12">
-                        <div>折扣:(折)</div>
+                        <div>{{t('mall.discountDiscount')}}</div>
                         <el-form-item class="form-item" prop="discount">
-                          <el-input type="number" v-model="discountAmount" style="width: 200px" placeholder="请输入折扣" clearable/>
+                          <el-input type="number" v-model="discountAmount" style="width: 200px" :placeholder="t('mall.pleaseEnterDiscount')" clearable/>
                         </el-form-item>
                       </el-col>
                       <el-col :span="12">
-                        <div>立减:(元)</div>
+                        <div>{{t('mall.reduction')}}</div>
                         <el-form-item class="form-item" prop="reduce">
-                          <el-input type="number" v-model="reduceAmount" style="width: 200px" placeholder="请输入立减金额" clearable/>
+                          <el-input type="number" v-model="reduceAmount" style="width: 200px" :placeholder="t('mall.pleaseEnterTheDiscountAmount')" clearable/>
                         </el-form-item>
                       </el-col>
                     </el-row>
                   </div>
                   <div class="amount-info">
-                     <span class="discount-amount">优惠金额:¥<span class="value">{{preferentAmount}}</span></span>
-                     <span class="pay-amount">应付金额:¥<span class="value">{{payPrice}}</span></span>
+                     <span class="discount-amount">{{t('mall.discountAmount')}}:¥<span class="value">{{preferentAmount}}</span></span>
+                     <span class="pay-amount">{{t('mall.amountDue')}}:¥<span class="value">{{payPrice}}</span></span>
                   </div>
               </div>
           </div>
           <div class="right">
-              <div class="title">会员信息</div>
+              <div class="title">{{t('mall.memberInformation')}}</div>
               <div class="content">
                 <div class="member-info" v-if="memberInfo.nickname">
                     <img class="avatar"  :src="memberInfo.avatar"/>
-                    <div class="item"><div class="head">名称:</div><div class="value">{{memberInfo.nickname}}</div></div>
-                    <div class="item"><div class="head">手机号:</div><div class="value">{{memberInfo.mobile ? memberInfo.mobile : '未绑定'}}</div></div>
-                    <div class="item"><div class="head">可用余额:</div><div class="value">{{memberInfo.nowMoney}}(元)</div></div>
-                    <div class="item"><div class="head">可用积分:</div><div class="value">{{memberInfo.integral}}</div></div>
+                    <div class="item"><div class="head">{{t('mall.name')}}:</div><div class="value">{{memberInfo.nickname}}</div></div>
+                    <div class="item"><div class="head">{{t('mall.cellPhoneNumber')}}:</div><div class="value">{{memberInfo.mobile ? memberInfo.mobile : t('mall.unbound')}}</div></div>
+                    <div class="item"><div class="head">{{t('mall.availableBalance')}}:</div><div class="value">{{memberInfo.nowMoney}}{{t('mall._$')}}</div></div>
+                    <div class="item"><div class="head">{{t('mall.availablePoints')}}:</div><div class="value">{{memberInfo.integral}}</div></div>
                 </div>
                 <div class="guest" v-else>
                      <el-empty description="当前为游客" :image-size="30" />
@@ -74,8 +74,8 @@
       </el-form>
       <template #footer>
         <div>
-            <el-button type="primary" @click="submit()">确定收款</el-button>
-            <el-button @click="cancel()">取 消</el-button>
+            <el-button type="primary" @click="submit()">{{t('mall.confirmReceipt')}}</el-button>
+            <el-button @click="cancel()">{{t('common.cancel')}}</el-button>
         </div>
       </template>
   </el-dialog>
@@ -88,6 +88,8 @@ import UserSelect from "@/views/mall/member/user/UserSelect.vue";
 import payResult from './payResult.vue'
 import scanPay from './scanPay.vue'
 import * as CashierApi from '@/api/mall/cashier'
+const { t } = useI18n()
+
 const message = useMessage() // 消息弹窗
 const dialogVisible = ref(false)
 const payType = ref('cash')

+ 42 - 42
src/views/mall/coupon/Form.vue

@@ -7,10 +7,10 @@
       label-width="120px"
       v-loading="formLoading"
     >
-      <el-form-item label="展示店铺" prop="shopId">
+      <el-form-item :label="t('mall.showStores')" prop="shopId">
         <el-select
           v-model="formData.shopId"
-          placeholder="选择店铺"
+          :placeholder="t('mall.selectStore')"
         >
           <el-option
             v-for="item in shopList"
@@ -20,66 +20,66 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="可用类型" prop="type">
+      <el-form-item :label="t('mall.availableType')" prop="type">
         <el-radio-group v-model="formData.type">
-          <el-radio :label="0">通用</el-radio>
-          <el-radio :label="1">自取</el-radio>
-          <el-radio :label="2">外卖</el-radio>
+          <el-radio :label="0">{{t('mall.generalPurpose')}}</el-radio>
+          <el-radio :label="1">{{t('mall.used')}}</el-radio>
+          <el-radio :label="2">{{t('mall.unused')}}</el-radio>
         </el-radio-group>
       </el-form-item>
-      <el-form-item label="兑换码" prop="exchangeCode">
-        <el-input v-model="formData.exchangeCode" placeholder="请输入兑换码" />
+      <el-form-item :label="t('mall.redeemCode')" prop="exchangeCode">
+        <el-input v-model="formData.exchangeCode" :placeholder="t('mall.pleaseEnterTheRedemptionCode')" />
       </el-form-item>
-      <el-form-item label="图片" prop="image">
+      <el-form-item :label="t('mall.picture')" prop="image">
           <Materials v-model="formData.image" num="1" type="image" />
       </el-form-item>
-      <el-form-item label="优惠券名称" prop="title">
-        <el-input v-model="formData.title" placeholder="请输入优惠券名称" />
+      <el-form-item :label="t('mall.couponName')" prop="title">
+        <el-input v-model="formData.title" :placeholder="t('mall.pleaseEnterTheNameOfTheCoupon')" />
       </el-form-item>
-      <el-form-item label="消费多少可用" prop="least">
-        <el-input v-model="formData.least" placeholder="请输入消费多少可用" />
+      <el-form-item :label="t('mall.howMuchToSpend')" prop="least">
+        <el-input v-model="formData.least" :placeholder="t('mall.pleaseEnterTheAmountOfMoneySpent')" />
       </el-form-item>
-      <el-form-item label="优惠券金额" prop="value">
-        <el-input v-model="formData.value" placeholder="请输入优惠券金额" />
+      <el-form-item :label="t('mall.couponAmount')" prop="value">
+        <el-input v-model="formData.value" :placeholder="t('mall.pleaseEnterTheAmountOfTheCoupon')" />
       </el-form-item>
-      <el-form-item label="开始时间" prop="startTime">
+      <el-form-item :label="t('mall.startTime')" prop="startTime">
         <el-date-picker
           v-model="formData.startTime"
           type="date"
           value-format="x"
-          placeholder="选择开始时间"
+          :placeholder="t('mall.selectStartTime')"
         />
       </el-form-item>
-      <el-form-item label="结束时间" prop="endTime">
+      <el-form-item :label="t('mall.closingTime')" prop="endTime">
         <el-date-picker
           v-model="formData.endTime"
           type="date"
           value-format="x"
-          placeholder="选择结束时间"
+          :placeholder="t('mall.selectTheEndTime')"
         />
       </el-form-item>
-      <el-form-item label="发行数量" prop="distribute">
-        <el-input v-model="formData.distribute" placeholder="请输入发行数量" />
+      <el-form-item :label="t('mall.numberOfIssues')" prop="distribute">
+        <el-input v-model="formData.distribute" :placeholder="t('mall.pleaseEnterTheNumberOfIssues')" />
       </el-form-item>
-      <el-form-item label="所需积分" prop="score">
-        <el-input v-model="formData.score" placeholder="请输入所需积分" />
+      <el-form-item :label="t('mall.pointsRequired')" prop="score">
+        <el-input v-model="formData.score" :placeholder="t('mall.pleaseEnterTheNumberOfPointsRequired')" />
       </el-form-item>
-      <el-form-item label="限领数量" prop="limit">
-        <el-input v-model="formData.limit" placeholder="请输入限领数量" />
+      <el-form-item :label="t('mall.limit')" prop="limit">
+        <el-input v-model="formData.limit" :placeholder="t('mall.pleaseEnterTheQuantityLimit')" />
       </el-form-item>
-      <el-form-item label="使用说明" prop="instructions">
-        <el-input type="textarea" rows="5"  v-model="formData.instructions" placeholder="请输入使用说明" />
+      <el-form-item :label="t('mall.instructionsForUse')" prop="instructions">
+        <el-input type="textarea" rows="5"  v-model="formData.instructions" :placeholder="t('mall.pleaseEnterTheInstructionsForUse')" />
       </el-form-item>
-      <el-form-item label="是否上架" prop="isSwitch">
+      <el-form-item :label="t('mall.whetherItIsOnTheShelfOrNot')" prop="isSwitch">
         <el-radio-group v-model="formData.isSwitch">
-          <el-radio :label="1"></el-radio>
-          <el-radio :label="0"></el-radio>
+          <el-radio :label="1">{{t('common.yes')}}</el-radio>
+          <el-radio :label="0">{{t('common.no')}}</el-radio>
         </el-radio-group>
       </el-form-item>
     </el-form>
     <template #footer>
-      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>
@@ -116,16 +116,16 @@ const formData = ref({
 })
 const shopList = ref([])
 const formRules = reactive({
-  shopId: [{ required: true, message: '店铺id,0表示通用不能为空', trigger: 'blur' }],
-  title: [{ required: true, message: '优惠券名称不能为空', trigger: 'blur' }],
-  least: [{ required: true, message: '消费多少可用不能为空', trigger: 'blur' }],
-  value: [{ required: true, message: '优惠券金额不能为空', trigger: 'blur' }],
-  startTime: [{ required: true, message: '开始时间不能为空', trigger: 'blur' }],
-  endTime: [{ required: true, message: '结束时间不能为空', trigger: 'blur' }],
-  type: [{ required: true, message: '可用类型不能为空', trigger: 'blur' }],
-  distribute: [{ required: true, message: '发行数量不能为空', trigger: 'blur' }],
-  limit: [{ required: true, message: '限领数量不能为空', trigger: 'blur' }],
-  instructions: [{ required: true, message: '使用说明不能为空', trigger: 'blur' }]
+  shopId: [{ required: true, message: t('mall.storeId0MeansGenericCantBeEmpty'), trigger: 'blur' }],
+  title: [{ required: true, message: t('mall.couponNameCannotBeEmpty'), trigger: 'blur' }],
+  least: [{ required: true, message: t('mall.consumptionOfHowMuchIsAvailableCanNotBeEmpty'), trigger: 'blur' }],
+  value: [{ required: true, message: t('mall.couponAmountCannotBeEmpty'), trigger: 'blur' }],
+  startTime: [{ required: true, message: t('mall.startTimeCannotBeEmpty'), trigger: 'blur' }],
+  endTime: [{ required: true, message: t('mall.endTimeCannotBeEmpty'), trigger: 'blur' }],
+  type: [{ required: true, message: t('mall.availableTypeCannotBeEmpty'), trigger: 'blur' }],
+  distribute: [{ required: true, message: t('mall.theNumberOfCouponsIssuedCannotBeEmpty'), trigger: 'blur' }],
+  limit: [{ required: true, message: t('mall.limitOnNumberOfCouponsCannotBeEmpty'), trigger: 'blur' }],
+  instructions: [{ required: true, message: t('mall.descriptionOfUseCannotBeEmpty'), trigger: 'blur' }]
 })
 const formRef = ref() // 表单 Ref
 

+ 31 - 31
src/views/mall/coupon/index.vue

@@ -8,29 +8,29 @@
       :inline="true"
       label-width="100px"
     >
-      <el-form-item label="店铺名称" prop="shopName">
+      <el-form-item :label="t('mall.storeName')" prop="shopName">
         <el-input
           v-model="queryParams.shopName"
-          placeholder="请输入店铺名称"
+          :placeholder="t('mall.pleaseEnterAStoreName')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="优惠券名称" prop="title">
+      <el-form-item :label="t('mall.couponName')" prop="title">
         <el-input
           v-model="queryParams.title"
-          placeholder="请输入优惠券名称"
+          :placeholder="t('mall.pleaseEnterTheCouponName')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{$t('common.search')}}</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{$t('common.reset')}}</el-button>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
         <el-button type="primary" @click="openForm('create')" v-hasPermi="['coupon::create']">
-          <Icon icon="ep:plus" class="mr-5px" /> 新增
+          <Icon icon="ep:plus" class="mr-5px" /> {{t('action.add')}}
         </el-button>
         <!-- <el-button
           type="success"
@@ -39,7 +39,7 @@
           :loading="exportLoading"
           v-hasPermi="['coupon::export']"
         >
-          <Icon icon="ep:download" class="mr-5px" /> 导出
+          <Icon icon="ep:download" class="mr-5px" /> {{t('action.export')}}
         </el-button> -->
       </el-form-item>
     </el-form>
@@ -49,50 +49,50 @@
   <ContentWrap>
     <el-table v-loading="loading" :data="list">
       <el-table-column label="id" align="center" prop="id" />
-      <el-table-column label="可用店铺" align="center" prop="shopName"  width="150" />
-      <el-table-column label="优惠券名称" align="center" prop="title"  width="150" />
-      <el-table-column label="是否上架" align="center" prop="isSwitch">
+      <el-table-column :label="t('mall.availableStores')" align="center" prop="shopName"  width="150" />
+      <el-table-column :label="t('mall.couponName')" align="center" prop="title"  width="150" />
+      <el-table-column :label="t('mall.whetherTheCouponIsOnTheShelfOrNot')" align="center" prop="isSwitch">
         <template #default="scope">
-          <span v-if="scope.row.isSwitch == 1">上架</span>
-          <span v-else>下架</span>
+          <span v-if="scope.row.isSwitch == 1">{{ t('public.up') }}</span>
+          <span v-else>{{ t('public.down') }}</span>
          </template>
       </el-table-column>
-      <el-table-column label="消费多少可用" align="center" prop="least"  width="150" />
-      <el-table-column label="优惠券金额" align="center" prop="value"  width="150"/>
-      <el-table-column label="可用类型" align="center" prop="type">
+      <el-table-column :label="t('mall.howMuchDoYouWantToSpend')" align="center" prop="least"  width="150" />
+      <el-table-column :label="t('mall.couponAmount')" align="center" prop="value"  width="150"/>
+      <el-table-column :label="t('mall.availableType')" align="center" prop="type">
         <template #default="scope">
-          <span v-if="scope.row.type == 1">自取</span>
-          <span v-if="scope.row.type == 0">外卖</span>
-          <span v-else>通用</span>
+          <span v-if="scope.row.type == 1">{{t('mall.pickup')}}</span>
+          <span v-if="scope.row.type == 0">{{t('mall.takeOut')}}</span>
+          <span v-else>{{ t('mall.generalPurpose') }}</span>
          </template>
       </el-table-column>
-      <el-table-column label="兑换码" align="center" prop="exchangeCode" />
-      <el-table-column label="已领" align="center" prop="receive" />
-      <el-table-column label="发行数量" align="center" prop="distribute" />
-      <el-table-column label="限领数量" align="center" prop="limit" />
+      <el-table-column :label="t('mall.redemptionCode')" align="center" prop="exchangeCode" />
+      <el-table-column :label="t('mall.received')" align="center" prop="receive" />
+      <el-table-column :label="t('mall.numberOfIssues')" align="center" prop="distribute" />
+      <el-table-column :label="t('mall.limit')" align="center" prop="limit" />
       <el-table-column
-        label="开始时间"
+        :label="t('public.startTime')"
         align="center"
         prop="startTime"
         :formatter="dateFormatter"
         width="170"
       />
       <el-table-column
-        label="结束时间"
+        :label="t('public.endTime')"
         align="center"
         prop="endTime"
         :formatter="dateFormatter"
         width="170"
       />
       <el-table-column
-        label="创建时间"
+        :label="t('public.createTime')"
         align="center"
         prop="createTime"
         :formatter="dateFormatter"
         width="170"
       />
 
-      <el-table-column label="操作" align="center" fixed="right" width="150">
+      <el-table-column :label="t('public.operate')" align="center" fixed="right" width="150">
         <template #default="scope">
           <el-button
             link
@@ -100,7 +100,7 @@
             @click="openForm('update', scope.row.id)"
             v-hasPermi="['coupon::update']"
           >
-            编辑
+          {{t('action.edit')}}
           </el-button>
           <el-button
             link
@@ -108,7 +108,7 @@
             @click="handleDelete(scope.row.id)"
             v-hasPermi="['coupon::delete']"
           >
-            删除
+          {{ t('public.delete') }}
           </el-button>
           <el-button
             link
@@ -116,7 +116,7 @@
             @click="openForm('couponRecord', scope.row.id)"
             v-hasPermi="['coupon::delete']"
           >
-            领取记录
+            {{ t('mall.collectionRecord')}}
           </el-button>
         </template>
       </el-table-column>
@@ -229,7 +229,7 @@ const handleExport = async () => {
     // 发起导出
     exportLoading.value = true
     const data = await Api.exportCoupon(queryParams)
-    download.excel(data, '优惠券.xls')
+    download.excel(data, t('mall.couponXls'))
   } catch {
   } finally {
     exportLoading.value = false

+ 15 - 15
src/views/mall/coupon/user/OrderRecord.vue

@@ -2,32 +2,32 @@
   <el-drawer v-model="drawer" :title="dialogTitle" size="50%">
     <el-table :data="tableData" style="width: 100%">
       <el-table-column label="id" align="center" prop="id" />
-      <el-table-column label="店铺名称" align="center" prop="shopName" width="150" />
-      <el-table-column label="优惠券名称" align="center" prop="title" width="150" />
-      <el-table-column label="消费多少可用" align="center" prop="least" width="150" />
-      <el-table-column label="优惠券金额" align="center" prop="value" width="150" />
-      <el-table-column label="可用类型" align="center" prop="type">
+      <el-table-column :label="t('mall.storeName')" align="center" prop="shopName" width="150" />
+      <el-table-column :label="t('mall.couponName')" align="center" prop="title" width="150" />
+      <el-table-column :label="t('mall.spendHowMuchAvailable')" align="center" prop="least" width="150" />
+      <el-table-column :label="t('mall.couponAmount')" align="center" prop="value" width="150" />
+      <el-table-column :label="t('mall.availableType')" align="center" prop="type">
         <template #default="scope">
-          <span v-if="scope.row.type == 1">自取</span>
-          <span v-if="scope.row.type == 0">外卖</span>
-          <span v-else>通用</span>
+          <span v-if="scope.row.type == 1">{{t('mall.pickup')}}</span>
+          <span v-if="scope.row.type == 0">{{t('mall.takeOut')}}</span>
+          <span v-else>{{t('mall.generalPurpose')}}</span>
          </template>
       </el-table-column>
-      <el-table-column label="用户昵称" align="center" prop="userId" />
-      <el-table-column label="是否使用" align="center" prop="status">
+      <el-table-column :label="t('mall.userNickname')" align="center" prop="userId" />
+      <el-table-column :label="t('mall.usedNot')" align="center" prop="status">
         <template #default="scope">
-          <span v-if="scope.row.type == 1">已使用</span>
-          <span v-if="scope.row.type == 0">未使用</span>
+          <span v-if="scope.row.type == 1">{{t('mall.used')}}</span>
+          <span v-if="scope.row.type == 0">{{t('mall.unused')}}</span>
          </template>
       </el-table-column>
       <el-table-column
-        label="领取时间"
+        :label="t('mall.pickupTime')"
         align="center"
         prop="createTime"
         :formatter="dateFormatter"
         width="170"
       />
-      <el-table-column label="操作" align="center">
+      <el-table-column :label="t('public.operate')" align="center">
         <template #default="scope">
           <el-button
             link
@@ -35,7 +35,7 @@
             @click="handleDelete(scope.row.id)"
             v-hasPermi="['coupon:user:delete']"
           >
-            删除
+          {{ t('public.delete') }}
           </el-button>
         </template>
       </el-table-column>

+ 53 - 53
src/views/mall/desk/shopDesk/Order.vue

@@ -2,27 +2,27 @@
  <el-drawer v-model="drawer" :title="dialogTitle" size="60%">
   <ContentWrap>
     <el-tabs v-model="activeName"  @tab-click="handleClick">
-      <el-tab-pane label="全部订单" name=""/>
+      <el-tab-pane :label="t('mall.allOrders')" name=""/>
     </el-tabs>
-    <el-form-item label="订单状态:" >
+    <el-form-item :label="`${t('mall.orderStatus')}:`" >
       <el-radio-group v-model="orderStatus" size="large"  fill="#DC143C" @change="queryOrderStatus">
-        <el-radio-button label="">全部</el-radio-button>
-        <el-radio-button label="0">未支付</el-radio-button>
-        <el-radio-button label="1">制作中</el-radio-button>
-        <el-radio-button label="2">待收货</el-radio-button>
-        <el-radio-button label="3">已收货/已取餐</el-radio-button>
+        <el-radio-button label="">{{t('mall.all')}}</el-radio-button>
+        <el-radio-button label="0">{{t('mall.unpaid')}}</el-radio-button>
+        <el-radio-button label="1">{{t('mall.inProgress')}}</el-radio-button>
+        <el-radio-button label="2">{{t('mall.toBeReceived')}}</el-radio-button>
+        <el-radio-button label="3">{{t('mall.receivedPickedUp')}}</el-radio-button>
         <!-- <el-radio-button label="4">交易完成</el-radio-button> -->
-        <el-radio-button label="5">退款单</el-radio-button>
-        <el-radio-button label="6">已删除</el-radio-button>
+        <el-radio-button label="5">{{t('mall.refundOrder')}}</el-radio-button>
+        <el-radio-button label="6">{{t('mall.deleted')}}</el-radio-button>
       </el-radio-group>
     </el-form-item>
-     <el-form-item label="支付方式:" >
+     <el-form-item :label="`${t('mall.paymentMethod')}:`" >
       <el-radio-group v-model="payStatus" size="large"  fill="#FF1493" @change="queryPayStatus">
-        <el-radio-button label="">全部</el-radio-button>
-        <el-radio-button label="weixin">微信支付</el-radio-button>
-        <el-radio-button label="alipay">支付宝支付</el-radio-button>
-        <el-radio-button label="yue">余额支付</el-radio-button>
-        <el-radio-button label="cash">现金支付</el-radio-button>
+        <el-radio-button label="">{{t('mall.all')}}</el-radio-button>
+        <el-radio-button label="weixin">{{t('mall.weChatPayment')}}</el-radio-button>
+        <el-radio-button label="alipay">{{t('mall.alipay')}}</el-radio-button>
+        <el-radio-button label="yue">{{t('mall.balancePayment')}}</el-radio-button>
+        <el-radio-button label="cash">{{t('mall.cashPayment')}}</el-radio-button>
       </el-radio-group>
     </el-form-item>
   </ContentWrap>
@@ -35,36 +35,36 @@
       :inline="true"
       label-width="68px"
     >
-      <el-form-item label="订单号" prop="orderId">
+      <el-form-item :label="t('mall.orderNumber')" prop="orderId">
         <el-input
           v-model="queryParams.orderId"
-          placeholder="请输入订单号"
+          :placeholder="t('mall.pleaseEnterTheOrderNumber')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="用户姓名" prop="realName">
+      <el-form-item :label="t('mall.userName')" prop="realName">
         <el-input
           v-model="queryParams.realName"
-          placeholder="请输入用户姓名"
+          :placeholder="t('mall.pleaseEnterYourName')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="用户电话" prop="userPhone">
+      <el-form-item :label="t('mall.phoneNumber')" prop="userPhone">
         <el-input
           v-model="queryParams.userPhone"
-          placeholder="请输入用户电话"
+          :placeholder="t('mall.pleaseEnterYourPhoneNumber')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{$t('common.search')}}</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{$t('common.reset')}}</el-button>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
       </el-form-item>
     </el-form>
     
@@ -74,29 +74,29 @@
   <ContentWrap>
     <el-table v-loading="loading" :data="list" style="width: 100%">
       <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="门店" align="center" prop="shopName" width="100" />
-      <el-table-column label="桌号" align="center" prop="deskNumber" />
-      <el-table-column label="订单号" align="center" prop="orderId" width="240">
+      <el-table-column :label="t('mall.store')" align="center" prop="shopName" width="100" />
+      <el-table-column :label="t('mall.tableNumber')" align="center" prop="deskNumber" />
+      <el-table-column :label="t('mall.orderNumber')" align="center" prop="orderId" width="240">
         <template #default="scope">
           <span>
-            <el-tag class="ml-2" type="danger" v-if="scope.row.orderType=='desk'">堂食</el-tag>
-            <el-tag class="ml-2" type="danger" v-if="scope.row.orderType=='takeout'">外卖</el-tag>
-            <el-tag class="ml-2" type="danger" v-if="scope.row.orderType=='takein'">自取</el-tag>
+            <el-tag class="ml-2" type="danger" v-if="scope.row.orderType=='desk'">{{t('mall.dineIn')}}</el-tag>
+            <el-tag class="ml-2" type="danger" v-if="scope.row.orderType=='takeout'">{{t('mall.takeOut')}}</el-tag>
+            <el-tag class="ml-2" type="danger" v-if="scope.row.orderType=='takein'">{{t('mall.pickup')}}</el-tag>
            {{ scope.row.orderId }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="用户id|昵称" align="center"  width="120" >
+      <el-table-column :label="t('mall.userIdNickname')" align="center"  width="120" >
         <template #default="scope">
-          <span>{{ scope.row.uid }}|{{ scope.row.userRespVO ? scope.row.userRespVO.nickname : '无' }}</span>
+          <span>{{ scope.row.uid }}|{{ scope.row.userRespVO ? scope.row.userRespVO.nickname : t('public.none') }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="用户姓名|电话" align="center" prop="realName" width="150">
+      <el-table-column :label="t('mall.userNamePhoneNumber')" align="center" prop="realName" width="150">
         <template #default="scope">
           <span v-if="scope.row.orderType == 'takeout'">{{ scope.row.realName }}|{{ scope.row.userPhone }}</span>
-          <span v-else></span>
+          <span v-else>{{ t('public.none') }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="商品信息" align="center" prop="userAddress" width="350">
+      <el-table-column :label="t('mall.productInformation')" align="center" prop="userAddress" width="350">
         <template #default="scope">
           <div class="tabBox" v-for="(val, i ) in scope.row.storeOrderCartInfoDOList" :key="i">
               <div class="tabBox_img">
@@ -107,44 +107,44 @@
           </div>
         </template>
       </el-table-column>
-      <el-table-column label="实际支付" align="center">
+      <el-table-column :label="t('mall.actualPayment')" align="center">
         <template #default="scope">
          <span v-if="scope.row.paid == 1">{{ scope.row.payPrice }}</span>
-         <span v-else>未支付</span>
+         <span v-else>{{t('mall.unpaid')}}</span>
         </template>
       </el-table-column>
-      <el-table-column label="支付方式" align="center">
+      <el-table-column :label="t('mall.paymentMethod')" align="center">
         <template #default="scope">
           <span v-if="scope.row.paid == 1">
-           <span v-if="scope.row.payType=='yue'">余额支付</span>
-           <span v-if="scope.row.payType=='weixin'">微信支付</span>
-           <span v-if="scope.row.payType=='alipay'">支付宝支付</span>
+           <span v-if="scope.row.payType=='yue'">{{t('mall.balancePayment')}}</span>
+           <span v-if="scope.row.payType=='weixin'">{{t('mall.weChatPayment')}}</span>
+           <span v-if="scope.row.payType=='alipay'">{{t('mall.alipayPayment')}}</span>
           </span>
           <span v-else></span>
         </template>
       </el-table-column>
-      <el-table-column label="购买类型" align="center">
+      <el-table-column :label="t('purchaseType.purchaseType')" align="center">
         <template #default="scope">
-           <span v-if="scope.row.orderType=='takeout'">外卖</span>
-           <span v-if="scope.row.orderType=='takein'">自取</span>
+           <span v-if="scope.row.orderType=='takeout'">{{t('mall.takeOut')}}</span>
+           <span v-if="scope.row.orderType=='takein'">{{t('mall.pickup')}}</span>
         </template>
       </el-table-column>
       <el-table-column
-        label="支付时间"
+        :label="t('mall.paymentTime')"
         align="center"
         prop="payTime"
         :formatter="dateFormatter"
         width="120"
       />
-      <el-table-column label="订单状态" align="center" prop="statusStr" />
+      <el-table-column :label="t('mall.orderStatus')" align="center" prop="statusStr" />
       <el-table-column
-        label="添加时间"
+        :label="t('public.addTime')"
         align="center"
         prop="createTime"
         :formatter="dateFormatter"
         width="120"
       />
-      <el-table-column label="操作" align="center" fixed="right" width="150">
+      <el-table-column :label="t('public.operate')" align="center" fixed="right" width="150">
         <template #default="scope">
           <div class="flex justify-center items-center">
           <el-button
@@ -154,7 +154,7 @@
             @click="openForm('updateOrder', scope.row.id)"
             v-hasPermi="['order:store-order:update']"
           >
-            编辑
+          {{t('action.edit')}}
           </el-button>
           <el-button
             v-if = "scope.row.statusStr == '未发货'"
@@ -163,14 +163,14 @@
             @click="openForm('orderSend', scope.row.id)"
             v-hasPermi="['order:store-order:update']"
           >
-            出单
+          {{t('mall.order')}}
           </el-button>
           <el-dropdown>
-            <el-button type="primary" link><Icon icon="ep:d-arrow-right" /> 更多</el-button>
+            <el-button type="primary" link><Icon icon="ep:d-arrow-right" /> {{t('public.more')}}</el-button>
             <template #dropdown>
               <el-dropdown-menu>
-                <el-dropdown-item v-if = "scope.row.statusStr == '未支付'" @click="handlePay(scope.row.id)">确认付款</el-dropdown-item>
-                <el-dropdown-item @click="openForm('orderDetail', scope.row.id)">订单详情</el-dropdown-item>
+                <el-dropdown-item v-if = "scope.row.statusStr == '未支付'" @click="handlePay(scope.row.id)">{{t('mall.paymentConfirmed')}}</el-dropdown-item>
+                <el-dropdown-item @click="openForm('orderDetail', scope.row.id)">{{t('mall.orderDetails')}}</el-dropdown-item>
               </el-dropdown-menu>
             </template>
           </el-dropdown>
@@ -305,7 +305,7 @@ const openForm = (type: string, id?: number) => {
 const handlePay = async (id: number) => {
   try {
     // 删除的二次确认
-    await message.confirm('修改为支付状态')
+    await message.confirm(t('mall.modifyToPaymentStatus'))
     // 发起删除
     await StoreOrderApi.payStoreOrder(id)
     message.success(t('common.updateSuccess'))

+ 20 - 20
src/views/mall/desk/shopDesk/ShopDeskForm.vue

@@ -7,10 +7,10 @@
       label-width="100px"
       v-loading="formLoading"
     >
-      <el-form-item label="选择店铺" prop="shopId">
+      <el-form-item :label="t('mall.selectStore')" prop="shopId">
         <el-select
           v-model="formData.shopId"
-          placeholder="选择店铺"
+          :placeholder="t('mall.selectStore')"
           @change="selectShop"
         >
           <el-option
@@ -21,10 +21,10 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="选择桌面分类" prop="cateId">
+      <el-form-item :label="t('mall.selectTableCategory')" prop="cateId">
         <el-select
           v-model="formData.cateId"
-          placeholder="选择桌面分类"
+          :placeholder="t('mall.selectTableCategory')"
         >
           <el-option
             v-for="item in cateList"
@@ -34,28 +34,28 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="桌位名称" prop="title">
-        <el-input v-model="formData.title" placeholder="请输入桌位名称" />
+      <el-form-item :label="t('mall.tableName')" prop="title">
+        <el-input v-model="formData.title" :placeholder="t('mall.pleaseEnterTableName')" />
       </el-form-item>
-      <el-form-item label="桌面图片" prop="picUrl">
+      <el-form-item :label="t('mall.tabletopPicture')" prop="picUrl">
         <Materials v-model="formData.image" num="1" type="image" />
       </el-form-item>
-      <el-form-item label="桌号" prop="number">
-        <el-input v-model="formData.number" placeholder="请输入桌号" />
+      <el-form-item :label="t('mall.tableNumber')" prop="number">
+        <el-input v-model="formData.number" :placeholder="t('mall.pleaseEnterTableNumber')" />
       </el-form-item>
-      <el-form-item label="备注" prop="note">
-        <el-input v-model="formData.note" placeholder="请输入备注" />
+      <el-form-item :label="t('public.remark')" prop="note">
+        <el-input v-model="formData.note" :placeholder="t('public.pleaseEnterNotes')" />
       </el-form-item>
-      <el-form-item label="状态" prop="status">
+      <el-form-item :label="t('public.status')" prop="status">
         <el-radio-group v-model="formData.status">
-          <el-radio :label="1">启用</el-radio>
-          <el-radio :label="0">禁用</el-radio>
+          <el-radio :label="1">{{ t('public.enable') }}</el-radio>
+          <el-radio :label="0">{{ t('public.disable') }}</el-radio>
         </el-radio-group>
       </el-form-item>
     </el-form>
     <template #footer>
-      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>
@@ -91,10 +91,10 @@ const formData = ref({
   status: undefined
 })
 const formRules = reactive({
-  shopId: [{ required: true, message: '门店不能为空', trigger: 'blur' }],
-  title: [{ required: true, message: '桌号不能为空', trigger: 'blur' }],
-  number: [{ required: true, message: '桌位名称不能为空', trigger: 'blur' }],
-  status: [{ required: true, message: '状态:1=启用,2=禁用不能为空', trigger: 'blur' }]
+  shopId: [{ required: true, message: t('mall.storeCannotBeEmpty'), trigger: 'blur' }],
+  title: [{ required: true, message: t('mall.tableNumberCannotBeEmpty'), trigger: 'blur' }],
+  number: [{ required: true, message: t('mall.tableNameCannotBeEmpty'), trigger: 'blur' }],
+  status: [{ required: true, message: t('mall.status1Enabled2DisabledCannotBeEmpty'), trigger: 'blur' }]
 })
 const formRef = ref() // 表单 Ref
 const shopList = ref([])

+ 17 - 17
src/views/mall/desk/shopDesk/ShopDeskForm2.vue

@@ -7,10 +7,10 @@
       label-width="100px"
       v-loading="formLoading"
     >
-      <el-form-item label="选择店铺" prop="shopId">
+      <el-form-item :label="t('mall.selectStore')" prop="shopId">
         <el-select
           v-model="formData.shopId"
-          placeholder="选择店铺"
+          :placeholder="t('mall.selectStore')"
         >
           <el-option
             v-for="item in shopList"
@@ -20,27 +20,27 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="桌号前缀" prop="numberPre">
-        <el-input v-model="formData.numberPre" placeholder="比如:Y" />
+      <el-form-item :label="t('mall.tableNumberPrefix')" prop="numberPre">
+        <el-input v-model="formData.numberPre" :placeholder="t('mall.likeY')" />
       </el-form-item>
-      <el-form-item label="桌号范围" prop="startNumber">
+      <el-form-item :label="t('mall.tableNumberRange')" prop="startNumber">
         <el-input style="width:100px" v-model="formData.startNumber" placeholder="1" />
         <span style="padding:0 15px;background:#E5EAF3">-</span>
         <el-input style="width:100px" v-model="formData.endNumber" placeholder="99" />
       </el-form-item>
-      <el-form-item label="备注" prop="note">
-        <el-input v-model="formData.note" placeholder="请输入备注" />
+      <el-form-item :label="t('public.remark')" prop="note">
+        <el-input v-model="formData.note" :placeholder="t('public.pleaseEnterNotes')" />
       </el-form-item>
-      <el-form-item label="状态" prop="status">
+      <el-form-item :label="t('public.status')" prop="status">
         <el-radio-group v-model="formData.status">
-          <el-radio :label="1">启用</el-radio>
-          <el-radio :label="0">禁用</el-radio>
+          <el-radio :label="1">{{ t('public.enable') }}</el-radio>
+          <el-radio :label="0">{{ t('public.disable') }}</el-radio>
         </el-radio-group>
       </el-form-item>
     </el-form>
     <template #footer>
-      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>
@@ -65,11 +65,11 @@ const formData = ref({
   status: undefined
 })
 const formRules = reactive({
-  shopId: [{ required: true, message: '门店不能为空', trigger: 'blur' }],
-  numberPre: [{ required: true, message: '桌号前缀不能为空', trigger: 'blur' }],
-  startNumber: [{ required: true, message: '桌号开始不能为空', trigger: 'blur' }],
-  endNumber: [{ required: true, message: '桌号结束不能为空', trigger: 'blur' }],
-  status: [{ required: true, message: '状态:1=启用,2=禁用不能为空', trigger: 'blur' }]
+  shopId: [{ required: true, message: t('mall.storeCannotBeEmpty'), trigger: 'blur' }],
+  numberPre: [{ required: true, message: t('mall.tableNumberPrefixCannotBeEmpty'), trigger: 'blur' }],
+  startNumber: [{ required: true, message: t('mall.tableNumberStartCannotBeEmpty'), trigger: 'blur' }],
+  endNumber: [{ required: true, message: t('mall.tableNumberEndCannotBeEmpty'), trigger: 'blur' }],
+  status: [{ required: true, message: t('mall.status1EqualsEnable2EqualsDisableCannotBeEmpty'), trigger: 'blur' }]
 })
 const formRef = ref() // 表单 Ref
 const shopList = ref([])

+ 12 - 12
src/views/mall/desk/shopDesk/ShopDeskForm3.vue

@@ -7,7 +7,7 @@
       label-width="120px"
       v-loading="formLoading"
     >
-      <el-form-item label="小程序版本" prop="env">
+      <el-form-item :label="t('mall.miniProgramVersion')" prop="env">
         <el-select
           v-model="formData.env"
           @change="changeEnv"
@@ -20,17 +20,17 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="小程序二维码" >
+      <el-form-item :label="t('mall.miniProgramQrCode')" >
         <el-image v-if="qrcode.miniQrcode != ''" style="width: 200px; height: 200px" :src="qrcode.miniQrcode" :fit="fit" />
-        <el-text v-else type="danger">小程序未配置</el-text>
+        <el-text v-else type="danger">{{t('mall.miniProgramNotConfigured')}}</el-text>
       </el-form-item>
-      <el-form-item label="H5二维码" >
+      <el-form-item :label="t('mall.h5QrCode')" >
         <el-image style="width: 200px; height: 200px" :src="qrcode.normalQrcode" :fit="fit" />
       </el-form-item>
     </el-form>
     <template #footer>
       <el-button @click="submitForm" type="primary" :disabled="formLoading">下 载</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>
@@ -64,25 +64,25 @@ const formData = ref({
   env: 'trial'
 })
 const formRules = reactive({
-  shopId: [{ required: true, message: '门店不能为空', trigger: 'blur' }],
-  number: [{ required: true, message: '桌号不能为空', trigger: 'blur' }],
-  status: [{ required: true, message: '状态:1=启用,2=禁用不能为空', trigger: 'blur' }]
+  shopId: [{ required: true, message: t('mall.storeCannotBeEmpty'), trigger: 'blur' }],
+  number: [{ required: true, message: t('mall.tableNumberCannotBeEmpty'), trigger: 'blur' }],
+  status: [{ required: true, message: t('mall.statusOneEqualsEnableTwoEqualsDisableCannotBeEmpty'), trigger: 'blur' }]
 })
 const formRef = ref() // 表单 Ref
 const envList = ref([
   {
     id: 1,
-    name: '正式版',
+    name: t('mall.releaseVersion'),
     value: 'release'
   },
   {
     id: 2,
-    name: '体验版',
+    name: t('mall.experienceVersion'),
     value: 'trial'
   },
   {
     id: 3,
-    name: '开发版',
+    name: t('mall.developmentVersion'),
     value: 'develop'
   }
 ])
@@ -118,7 +118,7 @@ const changeEnv = async(value) => {
 const submitForm = async () => {
 
   // 导出的二次确认
-  await message.confirm('小程序二维码只能下载正式的哦')
+  await message.confirm(t('mall.miniProgramQrCodeCanOnlyBeDownloadedForReleaseVersion'))
   // 提交请求
   formLoading.value = true
   try {

+ 14 - 13
src/views/mall/desk/shopDesk/UserImportForm.vue

@@ -1,5 +1,5 @@
 <template>
-  <Dialog v-model="dialogVisible" title="导入" width="400">
+  <Dialog v-model="dialogVisible" :title="t('action.import')" width="400">
     <el-upload
       ref="uploadRef"
       v-model:file-list="fileList"
@@ -15,24 +15,24 @@
       drag
     >
       <Icon icon="ep:upload" />
-      <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+      <div class="el-upload__text">{{t('mall.dragFileHereOr')}}<em>{{t('mall.clickToUpload')}}</em></div>
       <template #tip>
         <div class="el-upload__tip text-center">
-          <span>仅允许导入 xls、xlsx 格式文件。</span>
+          <span>{{t('mall.onlyAllowImportXlsXlsxFiles')}}</span>
           <el-link
             :underline="false"
             style="font-size: 12px; vertical-align: baseline"
             type="primary"
             @click="importTemplate"
           >
-            下载模板
+          {{t('mall.downloadTemplate')}}
           </el-link>
         </div>
       </template>
     </el-upload>
     <template #footer>
-      <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button :disabled="formLoading" type="primary" @click="submitForm">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>
@@ -40,6 +40,7 @@
 import * as ShopDeskApi from '@/api/mall/desk/shopDesk'
 import { getAccessToken, getTenantId } from '@/utils/auth'
 import download from '@/utils/download'
+const { t } = useI18n()
 
 const message = useMessage() // 消息弹窗
 
@@ -62,7 +63,7 @@ defineExpose({ open }) // 提供 open 方法,用于打开弹窗
 /** 提交表单 */
 const submitForm = async () => {
   if (fileList.value.length == 0) {
-    message.error('请上传文件')
+    message.error(t('mall.pleaseUploadFile'))
     return
   }
   // 提交请求
@@ -84,15 +85,15 @@ const submitFormSuccess = (response: any) => {
   }
   // 拼接提示语
   const data = response.data
-  let text = '上传成功数量:' + data.createDeskNames.length + ';'
+  let text = t('mall.uploadSuccessCount') + data.createDeskNames.length + ';'
   for (let desk of data.createDeskNames) {
     text += '< ' + desk + ' >'
   }
-  text += '更新成功数量:' + data.updateDeskNames.length + ';'
+  text += t('mall.updateSuccessCount') + data.updateDeskNames.length + ';'
   for (const desk of data.updateDeskNames) {
     text += '< ' + desk + ' >'
   }
-  text += '更新失败数量:' + Object.keys(data.failureDeskNames).length + ';'
+  text += t('mall.updateFailureCount') + Object.keys(data.failureDeskNames).length + ';'
   for (const desk in data.failureDeskNames) {
     console.log('desk:',desk)
     text += '< ' + desk + ': ' + data.failureDeskNames[desk] + ' >'
@@ -105,7 +106,7 @@ const submitFormSuccess = (response: any) => {
 
 /** 上传错误提示 */
 const submitFormError = (): void => {
-  message.error('上传失败,请您重新上传!')
+  message.error(t('mall.uploadFailedPleaseReupload'))
   formLoading.value = false
 }
 
@@ -120,12 +121,12 @@ const resetForm = () => {
 
 /** 文件数超出提示 */
 const handleExceed = (): void => {
-  message.error('最多只能上传一个文件!')
+  message.error(t('mall.maxOneFileCanBeUploaded'))
 }
 
 /** 下载模板操作 */
 const importTemplate = async () => {
   const data = await ShopDeskApi.exportShopDeskTemplate()
-  download.excel(data, '批量导入桌号模板.xls')
+  download.excel(data, t('mall.batchImportTableNumberTemplateXls'))
 }
 </script>

+ 32 - 32
src/views/mall/desk/shopDesk/index.vue

@@ -8,34 +8,34 @@
       :inline="true"
       label-width="68px"
     >
-      <el-form-item label="店铺名称" prop="shopName">
+      <el-form-item :label="t('mall.storeName')" prop="shopName">
         <el-input
           v-model="queryParams.shopName"
-          placeholder="请输入店铺名称"
+          :placeholder="t('mall.pleaseEnterStoreName')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="桌号" prop="number">
+      <el-form-item :label="t('mall.tableNumber')" prop="number">
         <el-input
           v-model="queryParams.number"
-          placeholder="请输入编号"
+          :placeholder="t('mall.pleaseEnterTheNumber')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>  
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{$t('common.search')}}</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{$t('common.reset')}}</el-button>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
         <el-button
           type="primary"
           plain
           @click="openForm('create')"
           v-hasPermi="['desk:shop-desk:create']"
         >
-          <Icon icon="ep:plus" class="mr-5px" /> 新增
+          <Icon icon="ep:plus" class="mr-5px" /> {{t('action.add')}}
         </el-button>
         <el-button
           type="primary"
@@ -43,7 +43,7 @@
           @click="openForm('batchCreate')"
           v-hasPermi="['desk:shop-desk:create']"
         >
-          <Icon icon="ep:plus" class="mr-5px" /> 批量新增
+          <Icon icon="ep:plus" class="mr-5px" /> {{t('mall.batchAdd')}}
         </el-button>
         <el-button
           type="success"
@@ -52,7 +52,7 @@
           :loading="exportLoading"
           v-hasPermi="['desk:shop-desk:export']"
         >
-          <Icon icon="ep:download" class="mr-5px" /> 导出
+          <Icon icon="ep:download" class="mr-5px" /> {{t('action.export')}}
         </el-button>
         <el-button
           type="warning"
@@ -61,7 +61,7 @@
           :loading="downLoading"
           v-hasPermi="['desk:shop-desk:export']"
         >
-          <Icon icon="ep:download" class="mr-5px" /> 批量下载点餐码
+          <Icon icon="ep:download" class="mr-5px" /> {{t('mall.batchDownloadOrderCode')}}
         </el-button>
         <el-button
           type="danger"
@@ -70,7 +70,7 @@
           :loading="exportLoading"
           v-hasPermi="['desk:shop-desk:export']"
         >
-          <Icon icon="ep:upload" class="mr-5px" /> 导入
+          <Icon icon="ep:upload" class="mr-5px" /> {{t('mall.import')}}
         </el-button>
         <el-button
           type="success"
@@ -79,7 +79,7 @@
           :loading="exportLoading"
           v-hasPermi="['desk:shop-desk:export']"
         >
-          <Icon icon="ep:download" class="mr-5px" /> 下载导入模板
+          <Icon icon="ep:download" class="mr-5px" /> {{t('mall.downloadAndImportTemplate')}}
         </el-button>
       </el-form-item>
     </el-form>
@@ -89,38 +89,38 @@
   <ContentWrap>
     <el-table v-loading="loading" :data="list">
       <el-table-column label="id" align="center" prop="id" />
-      <el-table-column label="店铺名称" align="center" prop="shopName" />
-      <el-table-column label="桌号分类" align="center" prop="cateName" />
-      <el-table-column label="桌号" align="center" prop="number" />
-      <el-table-column label="桌号名称" align="center" prop="title" />
-      <el-table-column label="下单数" align="center" prop="orderCount" />
-      <el-table-column label="消费金额" align="center" prop="costAmount" />
+      <el-table-column :label="t('mall.storeName')" align="center" prop="shopName" />
+      <el-table-column :label="t('mall.classification')" align="center" prop="cateName" />
+      <el-table-column :label="t('mall.tableNumber')" align="center" prop="number" />
+      <el-table-column :label="t('mall.tableName')" align="center" prop="title" />
+      <el-table-column :label="t('mall.numberOfOrders')" align="center" prop="orderCount" />
+      <el-table-column :label="t('mall.consumptionAmount')" align="center" prop="costAmount" />
       <el-table-column
-        label="上次下单时间"
+        :label="t('mall.lastOrderTime')"
         align="center"
         prop="lastOrderTime"
         width="170"
       >
       <template #default="scope" >
           <span v-if="scope.row.lastOrderTime">{{formatDate(scope.row.lastOrderTime)}}</span>
-          <span v-else></span>
+          <span v-else>{{ t('public.none') }}</span>
         </template>
       </el-table-column>
 
-      <el-table-column label="状态" align="center" prop="status" >
+      <el-table-column :label="t('public.status')" align="center" prop="status" >
         <template #default="scope">
-          <span v-if="scope.row.status == 1">启用</span>
-          <span v-else>禁用</span>
+          <span v-if="scope.row.status == 1">{{ t('public.enable') }}</span>
+          <span v-else>{{ t('public.disable') }}</span>
         </template>
       </el-table-column>
       <el-table-column
-        label="添加时间"
+        :label="t('public.addTime')"
         align="center"
         prop="createTime"
         :formatter="dateFormatter"
         width="170"
       />
-      <el-table-column label="操作" align="center" width="250" fixed="right">
+      <el-table-column :label="t('public.operate')" align="center" width="250" fixed="right">
         <template #default="scope">
           <el-button
             link
@@ -128,7 +128,7 @@
             @click="openForm('qrcode', scope.row.id)"
             v-hasPermi="['desk:shop-desk:update']"
           >
-            二维码
+            {{ t('mall.qrCode') }}
           </el-button>
           <el-button
             link
@@ -136,7 +136,7 @@
             @click="openForm('order', scope.row.id)"
             v-hasPermi="['desk:shop-desk:update']"
           >
-            相关订单
+            {{ t('mall.relatedOrders') }}
           </el-button>
           <el-button
             link
@@ -144,7 +144,7 @@
             @click="openForm('update', scope.row.id)"
             v-hasPermi="['desk:shop-desk:update']"
           >
-            编辑
+          {{t('action.edit')}}
           </el-button>
           <el-button
             link
@@ -152,7 +152,7 @@
             @click="handleDelete(scope.row.id)"
             v-hasPermi="['desk:shop-desk:delete']"
           >
-            删除
+          {{ t('public.delete') }}
           </el-button>
         </template>
       </el-table-column>
@@ -280,7 +280,7 @@ const handleExport = async () => {
     // 发起导出
     exportLoading.value = true
     const data = await ShopDeskApi.exportShopDesk(queryParams)
-    download.excel(data, '门店 - 桌号.xls')
+    download.excel(data, t('mall.storesTableNumberXls'))
   } catch {
   } finally {
     exportLoading.value = false
@@ -294,7 +294,7 @@ const handleExportTemplate = async () => {
     // 发起导出
     exportLoading.value = true
     const data = await ShopDeskApi.exportShopDeskTemplate()
-    download.excel(data, '批量导入桌号模板.xls')
+    download.excel(data, t('mall.batchImportTableNumberTemplateXls'))
   } catch {
   } finally {
     exportLoading.value = false
@@ -304,7 +304,7 @@ const handleExportTemplate = async () => {
 /** 下载 */
 const batchDownload = async () => {
   try {
-    await message.confirm('小程序二维码只能下载正式的哦')
+    await message.confirm(t('mall.smallProgramQrCodeCanOnlyDownloadTheOfficialOh'))
     // 发起导出
     downLoading.value = true
     const res = await ShopDeskApi.downloadQrcode(0)

+ 15 - 15
src/views/mall/desk/shopdeskcategory/ShopDeskCategoryForm.vue

@@ -7,10 +7,10 @@
       label-width="100px"
       v-loading="formLoading"
     >
-    <el-form-item label="选择店铺" prop="shopId">
+    <el-form-item :label="t('mall.selectStore')" prop="shopId">
         <el-select
           v-model="formData.shopId"
-          placeholder="选择店铺"
+          :placeholder="t('mall.selectStore')"
         >
           <el-option
             v-for="item in shopList"
@@ -22,16 +22,16 @@
       </el-form-item>
 
      
-      <el-form-item label="分类名称" prop="name">
-        <el-input v-model="formData.name" placeholder="请输入分类名称" />
+      <el-form-item :label="t('mall.categoryName')" prop="name">
+        <el-input v-model="formData.name" :placeholder="t('mall.pleaseEnterCategoryName')" />
       </el-form-item>
-      <el-form-item label="人数" prop="people">
-        <el-input-number v-model="formData.people" placeholder="请输入人数" />
+      <el-form-item :label="t('mall.personCount')" prop="people">
+        <el-input-number v-model="formData.people" :placeholder="t('mall.pleaseEnterPersonCount')" />
       </el-form-item>
-      <el-form-item label="分类排序" prop="sort">
+      <el-form-item :label="t('mall.categorySort')" prop="sort">
         <el-input-number v-model="formData.sort" controls-position="right" :min="0" />
       </el-form-item>
-      <el-form-item label="开启状态" prop="status">
+      <el-form-item :label="t('mall.openStatus')" prop="status">
         <el-radio-group v-model="formData.status">
           <el-radio
             v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
@@ -44,8 +44,8 @@
       </el-form-item>
     </el-form>
     <template #footer>
-      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>
@@ -78,11 +78,11 @@ const formData = ref({
   status: CommonStatusEnum.ENABLE,
 })
 const formRules = reactive({
-  shopId: [{ required: true, message: '请选择店铺', trigger: 'blur' }],
-  name: [{ required: true, message: '分类名称不能为空', trigger: 'blur' }],
-  people: [{ required: true, message: '人数不能为空', trigger: 'blur' }],
-  sort: [{ required: true, message: '分类排序不能为空', trigger: 'blur' }],
-  status: [{ required: true, message: '开启状态不能为空', trigger: 'blur' }]
+  shopId: [{ required: true, message: t('mall.pleaseSelectStore'), trigger: 'blur' }],
+  name: [{ required: true, message: t('mall.categoryNameCannotBeEmpty'), trigger: 'blur' }],
+  people: [{ required: true, message: t('mall.personCountCannotBeEmpty'), trigger: 'blur' }],
+  sort: [{ required: true, message: t('mall.categorySortCannotBeEmpty'), trigger: 'blur' }],
+  status: [{ required: true, message: t('mall.openStatusCannotBeEmpty'), trigger: 'blur' }]
 })
 const formRef = ref() // 表单 Ref
 const shopList = ref([])

+ 19 - 19
src/views/mall/desk/shopdeskcategory/index.vue

@@ -8,34 +8,34 @@
       :inline="true"
       label-width="68px"
     >
-      <el-form-item label="店铺名称" prop="shopName">
+      <el-form-item :label="t('mall.storeName')" prop="shopName">
         <el-input
           v-model="queryParams.shopName"
-          placeholder="请输入店铺名称"
+          :placeholder="t('mall.pleaseEnterStoreName')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="分类名称" prop="name">
+      <el-form-item :label="t('mall.categoryName')" prop="name">
         <el-input
           v-model="queryParams.name"
-          placeholder="请输入分类名称"
+          :placeholder="t('mall.pleaseEnterCategoryName')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{$t('common.search')}}</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{$t('common.reset')}}</el-button>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
         <el-button
           type="primary"
           plain
           @click="openForm('create')"
           v-hasPermi="['desk:shop-desk-category:create']"
         >
-          <Icon icon="ep:plus" class="mr-5px" /> 新增
+          <Icon icon="ep:plus" class="mr-5px" /> {{t('action.add')}}
         </el-button>
         <el-button
           type="success"
@@ -44,7 +44,7 @@
           :loading="exportLoading"
           v-hasPermi="['desk:shop-desk-category:export']"
         >
-          <Icon icon="ep:download" class="mr-5px" /> 导出
+          <Icon icon="ep:download" class="mr-5px" /> {{t('action.export')}}
         </el-button>
       </el-form-item>
     </el-form>
@@ -53,24 +53,24 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
-      <el-table-column label="分类编号" align="center" prop="id" />
-      <el-table-column label="店铺名称" align="center" prop="shopName" />
-      <el-table-column label="分类名称" align="center" prop="name" />
-      <el-table-column label="人数" align="center" prop="people" />
-      <el-table-column label="分类排序" align="center" prop="sort" />
-      <el-table-column label="开启状态" align="center" prop="status">
+      <el-table-column :label="t('mall.categoryNumber')" align="center" prop="id" />
+      <el-table-column :label="t('mall.storeName')" align="center" prop="shopName" />
+      <el-table-column :label="t('mall.categoryName')" align="center" prop="name" />
+      <el-table-column :label="t('mall.personCount')" align="center" prop="people" />
+      <el-table-column :label="t('mall.categorySort')" align="center" prop="sort" />
+      <el-table-column :label="t('mall.openStatus')" align="center" prop="status">
         <template #default="scope">
           <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
         </template>
       </el-table-column>
       <el-table-column
-        label="创建时间"
+        :label="t('public.createTime')"
         align="center"
         prop="createTime"
         :formatter="dateFormatter"
         width="180px"
       />
-      <el-table-column label="操作" align="center">
+      <el-table-column :label="t('public.operate')" align="center">
         <template #default="scope">
           <el-button
             link
@@ -78,7 +78,7 @@
             @click="openForm('update', scope.row.id)"
             v-hasPermi="['desk:shop-desk-category:update']"
           >
-            编辑
+          {{t('action.edit')}}
           </el-button>
           <el-button
             link
@@ -86,7 +86,7 @@
             @click="handleDelete(scope.row.id)"
             v-hasPermi="['desk:shop-desk-category:delete']"
           >
-            删除
+          {{ t('public.delete') }}
           </el-button>
         </template>
       </el-table-column>
@@ -188,7 +188,7 @@ const handleExport = async () => {
     // 发起导出
     exportLoading.value = true
     const data = await ShopDeskCategoryApi.exportShopDeskCategory(queryParams)
-    download.excel(data, '门店桌号分类.xls')
+    download.excel(data, t('mall.storeTableNumberCategoryXls'))
   } catch {
   } finally {
     exportLoading.value = false

+ 46 - 46
src/views/mall/member/user/UserDetail.vue

@@ -2,73 +2,73 @@
  <el-drawer v-model="drawer" :title="dialogTitle" size="50%">
     <div>
       <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
-        <el-tab-pane label="用户信息" name="first">
-           <el-descriptions title="基本信息" :column="2">
-            <el-descriptions-item label="用户头像"><el-image style="width: 50px; height: 50px" :src="DetailData.avatar" /></el-descriptions-item>
-            <el-descriptions-item label="用户昵称">{{ DetailData.nickname }}</el-descriptions-item>
-            <el-descriptions-item label="余额">{{ DetailData.nowMoney }}</el-descriptions-item>
-            <el-descriptions-item label="生日">{{ DetailData.birthday }}</el-descriptions-item>
-            <el-descriptions-item label="手机号">{{ DetailData.mobile }}</el-descriptions-item>
-            <el-descriptions-item label="身份证号码">{{ DetailData.cardId }}</el-descriptions-item>
+        <el-tab-pane :label="t('mall.userInfo')" name="first">
+           <el-descriptions :title="t('mall.basicInfo')" :column="2">
+            <el-descriptions-item :label="t('mall.userAvatar')"><el-image style="width: 50px; height: 50px" :src="DetailData.avatar" /></el-descriptions-item>
+            <el-descriptions-item :label="t('mall.userNickname')">{{ DetailData.nickname }}</el-descriptions-item>
+            <el-descriptions-item :label="t('mall.balance')">{{ DetailData.nowMoney }}</el-descriptions-item>
+            <el-descriptions-item :label="t('mall.birthday')">{{ DetailData.birthday }}</el-descriptions-item>
+            <el-descriptions-item :label="t('mall.phoneNumber')">{{ DetailData.mobile }}</el-descriptions-item>
+            <el-descriptions-item :label="t('mall.idCardNumber')">{{ DetailData.cardId }}</el-descriptions-item>
           </el-descriptions>
-          <el-descriptions title="用户概况" :column="2">
-            <el-descriptions-item label="绑定的会员卡">{{ DetailData.cardName ? DetailData.cardName : '无' }}</el-descriptions-item>
-            <el-descriptions-item label="积分">{{ DetailData.integral }}</el-descriptions-item>
-            <el-descriptions-item label="佣金金额">{{ DetailData.brokeragePrice }}</el-descriptions-item>
-            <el-descriptions-item label="连续签到天数">{{ DetailData.signNum }}</el-descriptions-item>
-            <el-descriptions-item label="登录ip">{{ DetailData.loginIp }}</el-descriptions-item>
-            <el-descriptions-item label="等级">{{ DetailData.level }}</el-descriptions-item>
-            <el-descriptions-item label="推广id">{{ DetailData.spreadUid }}</el-descriptions-item>
-            <el-descriptions-item label="购买次数">{{ DetailData.payCount }}</el-descriptions-item>
-            <el-descriptions-item label="下级人数">{{ DetailData.spreadCount }}</el-descriptions-item>
-            <el-descriptions-item label="登陆类型">{{ DetailData.loginType }}</el-descriptions-item>
-            <el-descriptions-item label="注册时间">{{ formatDate(DetailData.createTime) }}</el-descriptions-item>
+          <el-descriptions :title="t('mall.userOverview')" :column="2">
+            <el-descriptions-item :label="t('mall.boundMembershipCard')">{{ DetailData.cardName ? DetailData.cardName : t('public.none') }}</el-descriptions-item>
+            <el-descriptions-item :label="t('mall.points')">{{ DetailData.integral }}</el-descriptions-item>
+            <el-descriptions-item :label="t('mall.commissionAmount')">{{ DetailData.brokeragePrice }}</el-descriptions-item>
+            <el-descriptions-item :label="t('mall.consecutiveSignInDays')">{{ DetailData.signNum }}</el-descriptions-item>
+            <el-descriptions-item :label="t('mall.loginIp')">{{ DetailData.loginIp }}</el-descriptions-item>
+            <el-descriptions-item :label="t('mall.level')">{{ DetailData.level }}</el-descriptions-item>
+            <el-descriptions-item :label="t('mall.promotionId')">{{ DetailData.spreadUid }}</el-descriptions-item>
+            <el-descriptions-item :label="t('mall.purchaseCount')">{{ DetailData.payCount }}</el-descriptions-item>
+            <el-descriptions-item :label="t('mall.subordinateCount')">{{ DetailData.spreadCount }}</el-descriptions-item>
+            <el-descriptions-item :label="t('mall.loginType')">{{ DetailData.loginType }}</el-descriptions-item>
+            <el-descriptions-item :label="t('mall.registrationTime')">{{ formatDate(DetailData.createTime) }}</el-descriptions-item>
           </el-descriptions>
         </el-tab-pane>
-        <el-tab-pane label="消费记录" name="second">
+        <el-tab-pane :label="t('mall.consumptionRecord')" name="second">
              <el-table  :data="list">
-              <el-table-column label="支出/获得" align="center" prop="pm">
+              <el-table-column :label="t('mall.expenseOrGain')" align="center" prop="pm">
                   <template #default="scope">
-                    <span v-if="scope.row.pm == 0">支出</span>
-                    <span v-else-if="scope.row.category == 1">获得</span>
-                    <span v-else>未知</span>
+                    <span v-if="scope.row.pm == 0">{{t('mall.expense')}}</span>
+                    <span v-else-if="scope.row.category == 1">{{t('mall.gain')}}</span>
+                    <span v-else>{{t('mall.unknown')}}</span>
                   </template>
               </el-table-column>
-              <el-table-column label="账单标题" align="center" prop="title" />
-              <el-table-column label="明细种类" align="center" prop="category">
+              <el-table-column :label="t('mall.billTitle')" align="center" prop="title" />
+              <el-table-column :label="t('mall.detailCategory')" align="center" prop="category">
                  <template #default="scope">
-                    <span v-if="scope.row.category == 'now_money'">余额</span>
-                    <span v-else-if="scope.row.category == 'integral'">积分</span>
-                    <span v-else>未知</span>
+                    <span v-if="scope.row.category == 'now_money'">{{t('mall.balance')}}</span>
+                    <span v-else-if="scope.row.category == 'integral'">{{t('mall.points')}}</span>
+                    <span v-else>{{t('mall.unknown')}}</span>
                   </template>
               </el-table-column>
-              <el-table-column label="明细类型" align="center" prop="type">
+              <el-table-column :label="t('mall.detailType')" align="center" prop="type">
                 <template #default="scope">
-                    <span v-if="scope.row.type == 'recharge'">充值</span>
-                    <span v-else-if="scope.row.type == 'brokerage'">返佣</span>
-                    <span v-else-if="scope.row.type == 'pay_product'">消费</span>
-                    <span v-else-if="scope.row.type == 'extract'">提现</span>
-                    <span v-else-if="scope.row.type == 'pay_product_refund'">退款</span>
-                    <span v-else-if="scope.row.type == 'system_add'">系统添加</span>
-                    <span v-else-if="scope.row.type == 'system_sub'">系统减少</span>
-                    <span v-else-if="scope.row.type == 'deduction'">减去</span>
-                    <span v-else-if="scope.row.type == 'gain'">奖励</span>
-                    <span v-else-if="scope.row.type == 'sign'">签到</span>
-                    <span v-else-if="scope.row.type == 'vip_card'">会员卡</span>
+                    <span v-if="scope.row.type == 'recharge'">{{t('mall.recharge')}}</span>
+                    <span v-else-if="scope.row.type == 'brokerage'">{{t('mall.rebate')}}</span>
+                    <span v-else-if="scope.row.type == 'pay_product'">{{t('mall.consumption')}}</span>
+                    <span v-else-if="scope.row.type == 'extract'">{{t('mall.withdrawal')}}</span>
+                    <span v-else-if="scope.row.type == 'pay_product_refund'">{{t('mall.refund')}}</span>
+                    <span v-else-if="scope.row.type == 'system_add'">{{t('mall.systemAdd')}}</span>
+                    <span v-else-if="scope.row.type == 'system_sub'">{{t('mall.systemReduce')}}</span>
+                    <span v-else-if="scope.row.type == 'deduction'">{{t('mall.subtract')}}</span>
+                    <span v-else-if="scope.row.type == 'gain'">{{t('mall.reward')}}</span>
+                    <span v-else-if="scope.row.type == 'sign'">{{t('mall.signIn')}}</span>
+                    <span v-else-if="scope.row.type == 'vip_card'">{{t('mall.membershipCard')}}</span>
                     <span v-else>未知</span>
                   </template>
               </el-table-column>
-              <el-table-column label="明细数字(元)" align="center" prop="number">
+              <el-table-column :label="t('mall.detailAmountYuan')" align="center" prop="number">
                     <template #default="scope">
                       <span v-if="scope.row.pm == 1">+</span>
                       <span v-else>-</span>
                       <span>{{ scope.row.number }}</span>
                     </template>
               </el-table-column>
-              <el-table-column label="剩余(元)" align="center" prop="balance" />
-              <el-table-column label="备注" align="center" prop="mark" width="200" />
+              <el-table-column :label="t('mall.remainingYuan')" align="center" prop="balance" />
+              <el-table-column :label="t('public.remark')" align="center" prop="mark" width="200" />
               <el-table-column
-                label="添加时间"
+                :label="t('public.addTime')"
                 align="center"
                 prop="createTime"
                 :formatter="dateFormatter"

+ 25 - 25
src/views/mall/member/user/UserForm.vue

@@ -7,32 +7,32 @@
       label-width="100px"
       v-loading="formLoading"
     >
-      <el-form-item label="用户账户" prop="username">
-        <el-input v-model="formData.username" placeholder="请输入用户账户" />
+      <el-form-item :label="t('mall.userAccount')" prop="username">
+        <el-input v-model="formData.username" :placeholder="t('mall.pleaseEnterUserAccount')" />
       </el-form-item>
-      <el-form-item label="用户昵称" prop="nickname">
-        <el-input v-model="formData.nickname" placeholder="请输入用户昵称" />
+      <el-form-item :label="t('mall.userNickname')" prop="nickname">
+        <el-input v-model="formData.nickname" :placeholder="t('mall.pleaseEnterUserNickname')" />
       </el-form-item>
-      <el-form-item label="手机号码" prop="mobile">
-        <el-input v-model="formData.mobile" placeholder="请输入手机号码" />
+      <el-form-item :label="t('mall.phoneNumber')" prop="mobile">
+        <el-input v-model="formData.mobile" :placeholder="t('mall.pleaseEnterPhoneNumber')" />
       </el-form-item>
-      <el-form-item label="真实姓名" prop="realName">
-        <el-input v-model="formData.realName" placeholder="请输入真实姓名" />
+      <el-form-item :label="t('mall.realName')" prop="realName">
+        <el-input v-model="formData.realName" :placeholder="t('mall.pleaseEnterRealName')" />
       </el-form-item>
-      <el-form-item label="生日" prop="birthday">
-        <el-input v-model="formData.birthday" placeholder="请输入生日" />
+      <el-form-item :label="t('mall.birthday')" prop="birthday">
+        <el-input v-model="formData.birthday" :placeholder="t('mall.pleaseEnterBirthday')" />
       </el-form-item>
-      <el-form-item label="用户备注" prop="mark">
-        <el-input v-model="formData.mark" placeholder="请输入用户备注" />
+      <el-form-item :label="t('mall.userRemark')" prop="mark">
+        <el-input v-model="formData.mark" :placeholder="t('mall.pleaseEnterUserRemark')" />
       </el-form-item>
-      <el-form-item label="用户余额" prop="nowMoney">
-        <el-input v-model="formData.nowMoney" placeholder="请输入用户余额" />
+      <el-form-item :label="t('mall.userBalance')" prop="nowMoney">
+        <el-input v-model="formData.nowMoney" :placeholder="t('mall.pleaseEnterUserBalance')" />
       </el-form-item>
-      <el-form-item label="佣金金额" prop="brokeragePrice">
-        <el-input v-model="formData.brokeragePrice" placeholder="请输入佣金金额" />
+      <el-form-item :label="t('mall.commissionAmount')" prop="brokeragePrice">
+        <el-input v-model="formData.brokeragePrice" :placeholder="t('mall.pleaseEnterCommissionAmount')" />
       </el-form-item>
-      <el-form-item label="用户积分" prop="integral">
-        <el-input v-model="formData.integral" placeholder="请输入用户剩余积分" />
+      <el-form-item :label="t('mall.userPoints')" prop="integral">
+        <el-input v-model="formData.integral" :placeholder="t('mall.pleaseEnterUserRemainingPoints')" />
       </el-form-item>
       <!-- <el-form-item label="等级" prop="level">
         <el-input v-model="formData.level" placeholder="请输入等级" />
@@ -40,13 +40,13 @@
       <!-- <el-form-item label="是否为推广员" prop="isPromoter">
         <el-input v-model="formData.isPromoter" placeholder="请输入是否为推广员" />
       </el-form-item> -->
-      <el-form-item label="详细地址" prop="addres">
-        <el-input v-model="formData.addres" placeholder="请输入详细地址" />
+      <el-form-item :label="t('mall.detailedAddress')" prop="addres">
+        <el-input v-model="formData.addres" :placeholder="t('mall.pleaseEnterDetailedAddress')" />
       </el-form-item>
     </el-form>
     <template #footer>
-      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>
@@ -93,9 +93,9 @@ const formData = ref({
   wxProfile: undefined
 })
 const formRules = reactive({
-  username: [{ required: true, message: '用户账户不能为空', trigger: 'blur' }],
-  nickname: [{ required: true, message: '用户昵称不能为空', trigger: 'blur' }],
-  mobile: [{ required: true, message: '佣手机号码不能为空', trigger: 'blur' }]
+  username: [{ required: true, message: t('mall.userAccountCannotBeEmpty'), trigger: 'blur' }],
+  nickname: [{ required: true, message: t('mall.userNicknameCannotBeEmpty'), trigger: 'blur' }],
+  mobile: [{ required: true, message: t('mall.phoneNumberCannotBeEmpty'), trigger: 'blur' }]
 })
 const formRef = ref() // 表单 Ref
 

+ 20 - 19
src/views/mall/member/user/UserSelect.vue

@@ -2,10 +2,10 @@
   <Dialog :title="dialogTitle" v-model="dialogVisible" width="70%">
     <ContentWrap>
       <el-tabs v-model="activeName"  @tab-click="handleClick">
-        <el-tab-pane label="全部" name=""/>
-        <el-tab-pane label="微信小程序" name="routine"/>
-        <el-tab-pane label="公众号" name="wechat"/>
-        <el-tab-pane label="H5" name="h5"/>
+        <el-tab-pane :label="t('public.all')" name=""/>
+        <el-tab-pane :label="t('mall.wechatMiniProgram')" name="routine"/>
+        <el-tab-pane :label="t('mall.officialAccount')" name="wechat"/>
+        <el-tab-pane :label="t('mall.h5')" name="h5"/>
       </el-tabs>
       <!-- 搜索工作栏 -->
       <el-form
@@ -15,27 +15,27 @@
         :inline="true"
         label-width="68px"
       >
-        <el-form-item label="用户昵称" prop="nickname">
+        <el-form-item :label="t('mall.userNickname')" prop="nickname">
           <el-input
             v-model="queryParams.nickname"
-            placeholder="请输入用户昵称"
+            :placeholder="t('mall.pleaseEnterUserNickname')"
             clearable
             @keyup.enter="handleQuery"
             class="!w-240px"
           />
         </el-form-item>
-        <el-form-item label="手机号码" prop="phone">
+        <el-form-item :label="t('mall.phoneNumber1')" prop="phone">
           <el-input
             v-model="queryParams.phone"
-            placeholder="请输入手机号码"
+            :placeholder="t('mall.pleaseEnterPhoneNumber')"
             clearable
             @keyup.enter="handleQuery"
             class="!w-240px"
           />
         </el-form-item>
         <el-form-item>
-          <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{$t('common.search')}}</el-button>
-          <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{$t('common.reset')}}</el-button>
+          <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
+          <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
         </el-form-item>
       </el-form>
     </ContentWrap>
@@ -44,22 +44,22 @@
     <ContentWrap>
       <el-table v-loading="loading" :data="list">
         <el-table-column label="id" align="center" prop="id" />
-        <el-table-column label="用户昵称" align="center" prop="nickname" />
-        <el-table-column label="用户头像" align="center" prop="avatar">
+        <el-table-column :label="t('mall.userNickname')" align="center" prop="nickname" />
+        <el-table-column :label="t('mall.userAvatar')" align="center" prop="avatar">
           <template #default="scope">
           <el-image style="width: 50px; height: 50px" :src="scope.row.avatar" />
           </template>
         </el-table-column>
-        <el-table-column label="手机号码" align="center" prop="mobile" />
+        <el-table-column :label="t('mall.phoneNumber')" align="center" prop="mobile" />
         <el-table-column
-          label="添加时间"
+          :label="t('public.addTime')"
           align="center"
           prop="createTime"
           :formatter="dateFormatter"
         />
-        <el-table-column label="用户余额" align="center" prop="nowMoney" />
-        <el-table-column label="用户登陆类型" align="center" prop="loginType" />
-        <el-table-column label="操作" align="center">
+        <el-table-column :label="t('mall.userBalance')" align="center" prop="nowMoney" />
+        <el-table-column :label="t('mall.userLoginType')" align="center" prop="loginType" />
+        <el-table-column :label="t('public.operate')" align="center">
           <template #default="scope">
             <div class="flex justify-center items-center">
               <el-button
@@ -67,7 +67,7 @@
                 type="danger"
                 @click="doSelect(scope.row)"
               >
-              选择
+              {{t('mall.select')}}
               </el-button>
             </div>
           </template>
@@ -87,6 +87,7 @@
 
 <script setup lang="ts" name="User">
 import { dateFormatter } from '@/utils/formatTime'
+const { t } = useI18n() // 国际化
 import download from '@/utils/download'
 import * as UserApi from '@/api/member/user'
 const message = useMessage() // 消息弹窗
@@ -143,7 +144,7 @@ const handleClick = (tab: TabsPaneContext, event: Event) => {
 
 const open = async (type: string, id?: number) => {
   dialogVisible.value = true
-  dialogTitle.value = '选择会员'
+  dialogTitle.value = t('mall.selectMember')
   getList()
 }
 

+ 27 - 26
src/views/mall/member/user/index.vue

@@ -1,10 +1,10 @@
 <template>
   <ContentWrap>
      <el-tabs v-model="activeName"  @tab-click="handleClick">
-      <el-tab-pane label="全部" name=""/>
-      <el-tab-pane label="微信小程序" name="routine"/>
-      <el-tab-pane label="公众号" name="wechat"/>
-      <el-tab-pane label="H5" name="h5"/>
+      <el-tab-pane :label="t('public.all')" name=""/>
+      <el-tab-pane :label="t('mall.wechatMiniProgram')" name="routine"/>
+      <el-tab-pane :label="t('mall.officialAccount')" name="wechat"/>
+      <el-tab-pane :label="t('mall.h5')" name="h5"/>
     </el-tabs>
     <!-- 搜索工作栏 -->
     <el-form
@@ -14,40 +14,40 @@
       :inline="true"
       label-width="68px"
     >
-      <el-form-item label="用户昵称" prop="nickname">
+      <el-form-item :label="t('mall.userNickname')" prop="nickname">
         <el-input
           v-model="queryParams.nickname"
-          placeholder="请输入用户昵称"
+          :placeholder="t('mall.pleaseEnterUserNickname')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="手机号码" prop="mobile">
+      <el-form-item :label="t('mall.phoneNumber')" prop="mobile">
         <el-input
           v-model="queryParams.mobile"
-          placeholder="请输入手机号码"
+          :placeholder="t('mall.pleaseEnterPhoneNumber')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="添加时间" prop="createTime">
+      <el-form-item :label="t('public.addTime')" prop="createTime">
         <el-date-picker
           v-model="queryParams.createTime"
           value-format="YYYY-MM-DD HH:mm:ss"
           type="daterange"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
+          :start-placeholder="t('public.startDate')"
+          :end-placeholder="t('public.endDate')"
           :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
           class="!w-240px"
         />
       </el-form-item>
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{$t('common.search')}}</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{$t('common.reset')}}</el-button>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
         <el-button type="primary" @click="openForm('create')" v-hasPermi="['member:user:create']">
-          <Icon icon="ep:plus" class="mr-5px" /> 新增
+          <Icon icon="ep:plus" class="mr-5px" /> {{t('action.add')}}
         </el-button>
         <!-- <el-button
           type="success"
@@ -56,7 +56,7 @@
           :loading="exportLoading"
           v-hasPermi="['member:user:export']"
         >
-          <Icon icon="ep:download" class="mr-5px" /> 导出
+          <Icon icon="ep:download" class="mr-5px" /> {{t('action.export')}}
         </el-button> -->
       </el-form-item>
     </el-form>
@@ -66,22 +66,22 @@
   <ContentWrap>
     <el-table v-loading="loading" :data="list">
       <el-table-column label="id" align="center" prop="id" />
-      <el-table-column label="用户昵称" align="center" prop="nickname" />
-      <el-table-column label="用户头像" align="center" prop="avatar">
+      <el-table-column :label="t('mall.userNickname')" align="center" prop="nickname" />
+      <el-table-column :label="t('mall.userAvatar')" align="center" prop="avatar">
         <template #default="scope">
         <el-image style="width: 50px; height: 50px" :src="scope.row.avatar" />
         </template>
       </el-table-column>
-      <el-table-column label="手机号码" align="center" prop="mobile" />
+      <el-table-column :label="t('mall.phoneNumber')" align="center" prop="mobile" />
       <el-table-column
-        label="添加时间"
+        :label="t('public.addTime')"
         align="center"
         prop="createTime"
         :formatter="dateFormatter"
       />
-      <el-table-column label="用户余额" align="center" prop="nowMoney" />
-      <el-table-column label="用户登陆类型" align="center" prop="loginType" />
-      <el-table-column label="操作" align="center">
+      <el-table-column :label="t('mall.userBalance')" align="center" prop="nowMoney" />
+      <el-table-column :label="t('mall.userLoginType')" align="center" prop="loginType" />
+      <el-table-column :label="t('public.operate')" align="center">
         <template #default="scope">
           <div class="flex justify-center items-center">
             <el-button
@@ -90,14 +90,14 @@
               @click="openForm('userDetail', scope.row.id)"
               v-hasPermi="['member:user:update']"
             >
-              详情
+              {{ t('mall.detail') }}
             </el-button>
             <el-dropdown>
-              <el-button type="primary" link><Icon icon="ep:d-arrow-right" /> 更多</el-button>
+              <el-button type="primary" link><Icon icon="ep:d-arrow-right" /> {{t('public.more')}}</el-button>
               <template #dropdown>
                 <el-dropdown-menu>
-                  <el-dropdown-item @click="openForm('update', scope.row.id)">编辑</el-dropdown-item>
-                  <el-dropdown-item @click="openForm('yue', scope.row.id)">积分余额</el-dropdown-item>
+                  <el-dropdown-item @click="openForm('update', scope.row.id)">{{t('action.edit')}}</el-dropdown-item>
+                  <el-dropdown-item @click="openForm('yue', scope.row.id)">{{ t('mall.pointsBalance') }}</el-dropdown-item>
                 </el-dropdown-menu>
               </template>
             </el-dropdown>
@@ -122,6 +122,7 @@
 
 <script setup lang="ts" name="User">
 import { dateFormatter } from '@/utils/formatTime'
+const { t } = useI18n() // 国际化
 import download from '@/utils/download'
 import * as UserApi from '@/api/member/user'
 import UserForm from './UserForm.vue'

+ 14 - 14
src/views/mall/member/user/yue.vue

@@ -7,29 +7,29 @@
       label-width="100px"
       v-loading="formLoading"
     >
-      <el-form-item label="修改余额">
+      <el-form-item :label="t('mall.modifyBalance')">
           <el-radio-group v-model="formData.ptype">
-            <el-radio :label="1">增加</el-radio>
-            <el-radio :label="2">减少</el-radio>
+            <el-radio :label="1">{{t('mall.increase')}}</el-radio>
+            <el-radio :label="2">{{t('mall.decrease')}}</el-radio>
           </el-radio-group>
       </el-form-item>
-      <el-form-item label="余额">
-        <el-input v-model="formData.money" style="width: 370px;" placeholder="请输入余额" />
+      <el-form-item :label="t('mall.balance')">
+        <el-input v-model="formData.money" style="width: 370px;" :placeholder="t('mall.pleaseEnterBalance')" />
       </el-form-item>
-      <el-form-item label="修改积分">
+      <el-form-item :label="t('mall.modifyPoints')">
         <el-radio-group v-model="formData.itype">
-            <el-radio :label="1">增加</el-radio>
-            <el-radio :label="2">减少</el-radio>
+            <el-radio :label="1">{{t('mall.increase')}}</el-radio>
+            <el-radio :label="2">{{t('mall.decrease')}}</el-radio>
          </el-radio-group>
       </el-form-item>
-      <el-form-item label="积分">
-        <el-input v-model="formData.integral" style="width: 370px;"  placeholder="请输入积分" />
+      <el-form-item :label="t('mall.points')">
+        <el-input v-model="formData.integral" style="width: 370px;"  :placeholder="t('mall.pleaseEnterPoints')" />
       </el-form-item>
     </el-form>
       
     <template #footer>
-      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>
@@ -51,8 +51,8 @@ const formData = ref({
   integral: undefined
 })
 const formRules = reactive({
-  money: [{ required: true, message: '金额不能为空', trigger: 'blur' }],
-  integral: [{ required: true, message: '积分不能为空', trigger: 'blur' }]
+  money: [{ required: true, message: t('mall.amountCannotBeEmpty'), trigger: 'blur' }],
+  integral: [{ required: true, message: t('mall.pointsCannotBeEmpty'), trigger: 'blur' }]
 })
 const formRef = ref() // 表单 Ref
 

+ 18 - 18
src/views/mall/member/userAddress/UserAddressForm.vue

@@ -7,14 +7,14 @@
       label-width="150px"
       v-loading="formLoading"
     >
-      <el-form-item label="收货人姓名" prop="realName">
-        <el-input v-model="formData.realName" placeholder="请输入收货人姓名" />
+      <el-form-item :label="t('mall.consigneeName')" prop="realName">
+        <el-input v-model="formData.realName" :placeholder="t('mall.pleaseEnterConsigneeName')" />
       </el-form-item>
-      <el-form-item label="收货人电话" prop="phone">
-        <el-input v-model="formData.phone" placeholder="请输入收货人电话" />
+      <el-form-item :label="t('mall.consigneePhone')" prop="phone">
+        <el-input v-model="formData.phone" :placeholder="t('mall.pleaseEnterConsigneePhone')" />
       </el-form-item>
-      <el-form-item label="收货人地址" prop="address">
-        <el-input v-model="formData.address" placeholder="请输入收货人所在省" />
+      <el-form-item :label="t('mall.consigneeAddress')" prop="address">
+        <el-input v-model="formData.address" :placeholder="t('mall.pleaseEnterConsigneeProvince')" />
       </el-form-item>
       <!-- <el-form-item label="收货人所在市" prop="city">
         <el-input v-model="formData.city" placeholder="请输入收货人所在市" />
@@ -22,19 +22,19 @@
       <el-form-item label="收货人所在区" prop="district">
         <el-input v-model="formData.district" placeholder="请输入收货人所在区" />
       </el-form-item> -->
-      <el-form-item label="收货人详细地址" prop="detail">
-        <el-input v-model="formData.detail" placeholder="请输入收货人详细地址" />
+      <el-form-item :label="t('mall.consigneeDetailedAddress')" prop="detail">
+        <el-input v-model="formData.detail" :placeholder="t('mall.consigneeDetailedAddressCannotBeEmpty')" />
       </el-form-item>
-      <el-form-item label="是否默认" prop="isDefault">
+      <el-form-item :label="t('mall.isDefault')" prop="isDefault">
          <el-radio-group v-model="formData.isDefault">
-            <el-radio :label="1"></el-radio>
-            <el-radio :label="0"></el-radio>
+            <el-radio :label="1">{{t('common.yes')}}</el-radio>
+            <el-radio :label="0">{{t('common.no')}}</el-radio>
           </el-radio-group>
       </el-form-item>
     </el-form>
     <template #footer>
-      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">{{t('common.confirm')}}</el-button>
+      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
     </template>
   </Dialog>
 </template>
@@ -65,11 +65,11 @@ const formData = ref({
   address: ''
 })
 const formRules = reactive({
-  realName: [{ required: true, message: '收货人姓名不能为空', trigger: 'blur' }],
-  phone: [{ required: true, message: '收货人电话不能为空', trigger: 'blur' }],
-  address: [{ required: true, message: '收货人地址不能为空', trigger: 'blur' }],
-  detail: [{ required: true, message: '收货人详细地址不能为空', trigger: 'blur' }],
-  isDefault: [{ required: true, message: '是否默认不能为空', trigger: 'blur' }]
+  realName: [{ required: true, message: t('mall.consigneeNameCannotBeEmpty'), trigger: 'blur' }],
+  phone: [{ required: true, message: t('mall.consigneePhoneCannotBeEmpty'), trigger: 'blur' }],
+  address: [{ required: true, message: t('mall.consigneeAddressCannotBeEmpty'), trigger: 'blur' }],
+  detail: [{ required: true, message: t('mall.consigneeDetailedAddressCannotBeEmpty'), trigger: 'blur' }],
+  isDefault: [{ required: true, message: t('mall.isDefaultCannotBeEmpty'), trigger: 'blur' }]
 })
 const formRef = ref() // 表单 Ref
 

+ 17 - 17
src/views/mall/member/userAddress/index.vue

@@ -8,27 +8,27 @@
       :inline="true"
       label-width="68px"
     >
-      <el-form-item label="姓名" prop="realName">
+      <el-form-item :label="t('mall.name1')" prop="realName">
         <el-input
           v-model="queryParams.realName"
-          placeholder="请输入收货人姓名"
+          :placeholder="t('mall.consigneeName')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="电话" prop="phone">
+      <el-form-item :label="t('mall.phone')" prop="phone">
         <el-input
           v-model="queryParams.phone"
-          placeholder="请输入收货人电话"
+          :placeholder="t('mall.consigneePhone')"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{$t('common.search')}}</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{$t('common.reset')}}</el-button>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
       </el-form-item>
     </el-form>
   </ContentWrap>
@@ -37,24 +37,24 @@
   <ContentWrap>
     <el-table v-loading="loading" :data="list">
       <el-table-column label="id" align="center" prop="id" />
-      <el-table-column label="收货人姓名" align="center" prop="realName" />
-      <el-table-column label="收货人电话" align="center" prop="phone" />
-      <el-table-column label="收货人地址" align="center" prop="address" />
-      <el-table-column label="收货人详细地址" align="center" prop="detail" />
-      <el-table-column label="是否默认" align="center" prop="isDefault">
+      <el-table-column :label="t('mall.consigneeName')" align="center" prop="realName" />
+      <el-table-column :label="t('mall.consigneePhone')" align="center" prop="phone" />
+      <el-table-column :label="t('mall.consigneeAddress')" align="center" prop="address" />
+      <el-table-column :label="t('mall.consigneeDetailedAddress')" align="center" prop="detail" />
+      <el-table-column :label="t('mall.isDefault')" align="center" prop="isDefault">
         <template #default="scope">
-         <span v-if="scope.row.isDefault == 1"></span>
-         <span v-else></span>
+         <span v-if="scope.row.isDefault == 1">{{t('common.yes')}}</span>
+         <span v-else>{{t('common.no')}}</span>
         </template>
       </el-table-column>
       <el-table-column
-        label="添加时间"
+        :label="t('public.addTime')"
         align="center"
         prop="createTime"
         :formatter="dateFormatter"
         width="180"
       />
-      <el-table-column label="操作" align="center" fixed="right" width="150">
+      <el-table-column :label="t('public.operate')" align="center" fixed="right" width="150">
         <template #default="scope">
           <el-button
             link
@@ -62,7 +62,7 @@
             @click="openForm('update', scope.row.id)"
             v-hasPermi="['member:user-address:update']"
           >
-            编辑
+          {{t('action.edit')}}
           </el-button>
           <el-button
             link
@@ -70,7 +70,7 @@
             @click="handleDelete(scope.row.id)"
             v-hasPermi="['member:user-address:delete']"
           >
-            删除
+          {{ t('public.delete') }}
           </el-button>
         </template>
       </el-table-column>

+ 44 - 44
src/views/mall/order/storeOrder/OrderDetail.vue

@@ -1,17 +1,17 @@
 <template>
  <el-drawer v-model="drawer" :title="dialogTitle" size="30%">
     <div>
-      <el-descriptions title="收货信息1" :column="2" v-if="DetailData.orderType == 'takeout'">
-        <el-descriptions-item label="用户昵称">{{ nickname }}</el-descriptions-item>
-        <el-descriptions-item label="收货人">{{ DetailData.realName }}</el-descriptions-item>
-        <el-descriptions-item label="联系电话">{{ DetailData.userPhone }}</el-descriptions-item>
-        <el-descriptions-item label="收货地址">{{ DetailData.userAddress }}</el-descriptions-item>
+      <el-descriptions :title="t('mall.receivingInfoOne')" :column="2" v-if="DetailData.orderType == 'takeout'">
+        <el-descriptions-item :label="t('mall.userNickname')">{{ nickname }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.consignee')">{{ DetailData.realName }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.contactPhone')">{{ DetailData.userPhone }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.receivingAddress')">{{ DetailData.userAddress }}</el-descriptions-item>
       </el-descriptions>
       <el-descriptions title="" :column="1" v-if="DetailData.orderType != 'due'">
           <el-descriptions-item>
             <template #label>
               <div class="mylabel">
-                菜品明细
+                {{t('mall.dishDetails')}}
               </div>
             </template>
             <div>
@@ -24,8 +24,8 @@
                         <span>{{formatDate(item.addTime) }}</span>
                       </div>
                       <div style="">
-                        <span style="color: #9acafc;font-weight: bold;">{{item.uidType == 'user' ? '用户点餐' : '员工帮点'}}</span>
-                        <span style="color: #5ac725;">({{item.isOrder == 0 ? '未出餐' : '已出餐'}})</span>
+                        <span style="color: #9acafc;font-weight: bold;">{{item.uidType == 'user' ? t('mall.userOrdering') : t('mall.staffOrderingOnBehalf')}}</span>
+                        <span style="color: #5ac725;">({{item.isOrder == 0 ? t('mall.mealNotServed') : t('mall.mealServed')}})</span>
                       </div>
                     </div>
                   </div>
@@ -41,14 +41,14 @@
             </div>
           </el-descriptions-item>
       </el-descriptions>
-      <el-descriptions title="商品明细" :column="1" v-else>
-          <el-descriptions-item label="预约桌面">
+      <el-descriptions :title="t('mall.productDetails')" :column="1" v-else>
+          <el-descriptions-item :label="t('mall.reserveTable')">
               <table width="100%">
                 <tr style="font-weight:bold;height:50px">
-                  <td>图片</td>
-                  <td>名称</td>
-                  <td>价格</td>
-                  <td>数量</td>
+                  <td>{{t('mall.picture')}}</td>
+                  <td>{{t('mall.name')}}</td>
+                  <td>{{t('mall.price')}}</td>
+                  <td>{{t('mall.quantity')}}</td>
                 </tr>
                 <tr>
                     <td><el-image style="width: 40px; height: 40px" :src="DetailData.shopDeskDO.image" :fit="fit" /></td>
@@ -59,39 +59,39 @@
               </table>
           </el-descriptions-item>
       </el-descriptions>
-      <el-descriptions title="订单信息" :column="2">
+      <el-descriptions :title="t('mall.orderInfo')" :column="2">
         <template #title>
-          订单信息
-          <el-tag  type="danger" v-if="DetailData.orderType=='desk'">堂食</el-tag>
-          <el-tag  type="danger" v-if="DetailData.orderType=='takeout'">外卖</el-tag>
-          <el-tag  type="danger" v-if="DetailData.orderType=='takein'">自取</el-tag>
-          <el-tag  type="danger" v-if="DetailData.orderType=='due'">预约</el-tag>
+          {{ t('mall.orderInfo') }}
+          <el-tag  type="danger" v-if="DetailData.orderType=='desk'">{{ t('mall.dineIn') }}</el-tag>
+          <el-tag  type="danger" v-if="DetailData.orderType=='takeout'">{{t('mall.takeOut')}}</el-tag>
+          <el-tag  type="danger" v-if="DetailData.orderType=='takein'">{{t('mall.pickup')}}</el-tag>
+          <el-tag  type="danger" v-if="DetailData.orderType=='due'">{{ t('mall.reservation') }}</el-tag>
         </template>
-        <el-descriptions-item label="门店">{{ DetailData.shopName }}</el-descriptions-item>
-        <el-descriptions-item label="取餐号" v-if="DetailData.orderType != 'due'">{{ DetailData.numberId }}</el-descriptions-item>
-        <el-descriptions-item label="桌位号">{{ DetailData.deskNumber ? DetailData.deskNumber : '无' }}</el-descriptions-item>
-        <el-descriptions-item label="就餐人数" v-if="DetailData.orderType != 'due'">{{ DetailData.deskPeople ? DetailData.deskPeople : '无' }}</el-descriptions-item>
-        <el-descriptions-item label="订单号">{{ DetailData.orderId }}</el-descriptions-item>
-        <el-descriptions-item label="预约时间" v-if="DetailData.orderType == 'due'">{{ formatDate(DetailData.dueTime) }}</el-descriptions-item>
-        <el-descriptions-item label="到店时间" v-if="DetailData.orderType == 'due'">{{ DetailData.reachTime }}</el-descriptions-item>
-        <el-descriptions-item label="预约人" v-if="DetailData.orderType == 'due'">{{ DetailData.realName }}</el-descriptions-item>
-        <el-descriptions-item label="预约预留电话" v-if="DetailData.orderType == 'due'">{{ DetailData.userPhone }}</el-descriptions-item>
-        <el-descriptions-item label="订单状态" v-if="DetailData.orderType != 'due'">{{ DetailData.statusStr }}</el-descriptions-item>
-        <el-descriptions-item label="预约状态" v-if="DetailData.orderType == 'due'">
-          <span v-if="DetailData.dueStatus == 1">预约中</span>
-          <span v-else-if="DetailData.dueStatus == 2">已取消</span>
-          <span v-else>已完成</span>
+        <el-descriptions-item :label="t('mall.store')">{{ DetailData.shopName }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.pickupNumber')" v-if="DetailData.orderType != 'due'">{{ DetailData.numberId }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.tableNumber')">{{ DetailData.deskNumber ? DetailData.deskNumber : t('public.none') }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.diningPersonCount')" v-if="DetailData.orderType != 'due'">{{ DetailData.deskPeople ? DetailData.deskPeople : t('public.none') }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.orderNumber1')">{{ DetailData.orderId }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.reservationTime')" v-if="DetailData.orderType == 'due'">{{ formatDate(DetailData.dueTime) }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.arrivalTime')" v-if="DetailData.orderType == 'due'">{{ DetailData.reachTime }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.reservationPerson')" v-if="DetailData.orderType == 'due'">{{ DetailData.realName }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.reservationPhone')" v-if="DetailData.orderType == 'due'">{{ DetailData.userPhone }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.orderStatus')" v-if="DetailData.orderType != 'due'">{{ DetailData.statusStr }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.reservationStatus')" v-if="DetailData.orderType == 'due'">
+          <span v-if="DetailData.dueStatus == 1">{{t('mall.reserving')}}</span>
+          <span v-else-if="DetailData.dueStatus == 2">{{t('mall.cancelled')}}</span>
+          <span v-else>{{t('mall.completed')}}</span>
         </el-descriptions-item>
-        <el-descriptions-item label="商品总数">{{ DetailData.totalNum }}</el-descriptions-item>
-        <el-descriptions-item label="商品总价">{{ DetailData.totalPrice }}</el-descriptions-item>
-        <el-descriptions-item label="支付邮费">{{ DetailData.payPostage }}</el-descriptions-item>
-        <el-descriptions-item label="优惠券金额">{{ DetailData.couponPrice }}</el-descriptions-item>
-        <el-descriptions-item label="积分抵扣">{{ DetailData.useIntegral }}</el-descriptions-item>
-        <el-descriptions-item label="实际支付">{{ DetailData.payPrice }}</el-descriptions-item>
-        <el-descriptions-item label="赠送积分">{{ DetailData.gainIntegral }}</el-descriptions-item>
-        <el-descriptions-item label="创建时间">{{ formatDate(DetailData.createTime)}}</el-descriptions-item>
-        <el-descriptions-item label="支付时间">{{ formatDate(DetailData.payTime) }}</el-descriptions-item>
-        <el-descriptions-item label="支付方式">{{ DetailData.payType }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.totalProductQuantity')">{{ DetailData.totalNum }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.totalProductPrice')">{{ DetailData.totalPrice }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.shippingFee')">{{ DetailData.payPostage }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.couponAmount')">{{ DetailData.couponPrice }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.pointsDeduction')">{{ DetailData.useIntegral }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.actualPayment')">{{ DetailData.payPrice }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.bonusPoints')">{{ DetailData.gainIntegral }}</el-descriptions-item>
+        <el-descriptions-item :label="t('public.createTime')">{{ formatDate(DetailData.createTime)}}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.paymentTime')">{{ formatDate(DetailData.payTime) }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.paymentMethod')">{{ DetailData.payType }}</el-descriptions-item>
       </el-descriptions>
       <!-- <el-descriptions title="物流信息" :column="2">
         <el-descriptions-item label="快递公司">{{ DetailData.deliveryName }}</el-descriptions-item>

+ 51 - 51
src/views/mall/order/storeOrder/OrderDetail2.vue

@@ -1,17 +1,17 @@
 <template>
  <el-drawer v-model="drawer" :title="dialogTitle" size="35%">
     <div>
-      <el-descriptions title="收货信息1" :column="2" v-if="DetailData.orderType == 'takeout'">
-        <el-descriptions-item label="用户昵称">{{ nickname }}</el-descriptions-item>
-        <el-descriptions-item label="收货人">{{ DetailData.realName }}</el-descriptions-item>
-        <el-descriptions-item label="联系电话">{{ DetailData.userPhone }}</el-descriptions-item>
-        <el-descriptions-item label="收货地址">{{ DetailData.userAddress }}</el-descriptions-item>
+      <el-descriptions :title="t('mall.receivingInfoOne')" :column="2" v-if="DetailData.orderType == 'takeout'">
+        <el-descriptions-item :label="t('mall.userNickname')">{{ nickname }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.consignee')">{{ DetailData.realName }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.contactPhone')">{{ DetailData.userPhone }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.receivingAddress')">{{ DetailData.userAddress }}</el-descriptions-item>
       </el-descriptions>
       <el-descriptions title="" :column="1" v-if="DetailData.orderType != 'due'">
           <el-descriptions-item>
             <template #label>
               <div class="mylabel">
-                菜品明细
+                {{ t('mall.dishDetails') }}
               </div>
             </template>
             <div>
@@ -24,8 +24,8 @@
                         <span>{{formatDate(item.addTime) }}</span>
                       </div>
                       <div style="">
-                        <span style="color: #9acafc;font-weight: bold;">{{item.uidType == 'user' ? '用户点餐' : '员工帮点'}}</span>
-                        <span style="color: #5ac725;">({{item.isOrder == 0 ? '未出餐' : '已出餐'}})</span>
+                        <span style="color: #9acafc;font-weight: bold;">{{item.uidType == 'user' ?  t('mall.userOrdering') :  t('mall.staffOrderingOnBehalf')}}</span>
+                        <span style="color: #5ac725;">({{item.isOrder == 0 ?  t('mall.mealNotServed') :  t('mall.mealServed')}})</span>
                       </div>
                     </div>
                   </div>
@@ -41,14 +41,14 @@
             </div>
           </el-descriptions-item>
       </el-descriptions>
-      <el-descriptions title="商品明细" :column="1" v-else>
-          <el-descriptions-item label="预约桌面">
+      <el-descriptions :title="t('mall.productDetails')" :column="1" v-else>
+          <el-descriptions-item :label="t('mall.reserveTable')">
               <table width="100%">
                 <tr style="font-weight:bold;height:50px">
-                  <td>图片</td>
-                  <td>名称</td>
-                  <td>价格</td>
-                  <td>数量</td>
+                  <td>{{t('mall.picture')}}</td>
+                  <td>{{t('mall.name')}}</td>
+                  <td>{{t('mall.price')}}</td>
+                  <td>{{t('mall.quantity')}}</td>
                 </tr>
                 <tr>
                     <td><el-image style="width: 40px; height: 40px" :src="DetailData.shopDeskDO.image" :fit="fit" /></td>
@@ -59,44 +59,44 @@
               </table>
           </el-descriptions-item>
       </el-descriptions>
-      <el-descriptions title="订单信息" :column="2">
+      <el-descriptions :title="t('mall.orderInfo')" :column="2">
         <template #title>
-          订单信息
-          <el-tag  type="danger" v-if="DetailData.orderType=='desk'">堂食</el-tag>
-          <el-tag  type="danger" v-if="DetailData.orderType=='takeout'">外卖</el-tag>
-          <el-tag  type="danger" v-if="DetailData.orderType=='takein'">自取</el-tag>
-          <el-tag  type="danger" v-if="DetailData.orderType=='due'">预约</el-tag>
+          {{ t('mall.orderInfo') }}
+          <el-tag  type="danger" v-if="DetailData.orderType=='desk'">{{ t('mall.dineIn') }}</el-tag>
+          <el-tag  type="danger" v-if="DetailData.orderType=='takeout'">{{t('mall.takeOut')}}</el-tag>
+          <el-tag  type="danger" v-if="DetailData.orderType=='takein'">{{t('mall.pickup')}}</el-tag>
+          <el-tag  type="danger" v-if="DetailData.orderType=='due'">{{ t('mall.reservation') }}</el-tag>
         </template>
-        <el-descriptions-item label="门店">{{ DetailData.shopName }}</el-descriptions-item>
-        <el-descriptions-item label="取餐号" v-if="DetailData.orderType != 'due'">{{ DetailData.numberId }}</el-descriptions-item>
-        <el-descriptions-item label="桌位号">{{ DetailData.deskNumber ? DetailData.deskNumber : '无' }}</el-descriptions-item>
-        <el-descriptions-item label="就餐人数" v-if="DetailData.orderType != 'due'">{{ DetailData.deskPeople ? DetailData.deskPeople : '无' }}</el-descriptions-item>
-        <el-descriptions-item label="订单号">{{ DetailData.orderId }}</el-descriptions-item>
-        <el-descriptions-item label="预约时间" v-if="DetailData.orderType == 'due'">{{ formatDate(DetailData.dueTime) }}</el-descriptions-item>
-        <el-descriptions-item label="到店时间" v-if="DetailData.orderType == 'due'">{{ DetailData.reachTime }}</el-descriptions-item>
-        <el-descriptions-item label="预约人" v-if="DetailData.orderType == 'due'">{{ DetailData.realName }}</el-descriptions-item>
-        <el-descriptions-item label="预约预留电话" v-if="DetailData.orderType == 'due'">{{ DetailData.userPhone }}</el-descriptions-item>
-        <el-descriptions-item label="订单状态" v-if="DetailData.orderType != 'due'">{{ DetailData.statusStr }}</el-descriptions-item>
-        <el-descriptions-item label="预约状态" v-if="DetailData.orderType == 'due'">
-          <span v-if="DetailData.dueStatus == 1">预约中</span>
-          <span v-else-if="DetailData.dueStatus == 2">已取消</span>
-          <span v-else>已完成</span>
+        <el-descriptions-item :label="t('mall.store')">{{ DetailData.shopName }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.pickupNumber')" v-if="DetailData.orderType != 'due'">{{ DetailData.numberId }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.xxx')">{{ DetailData.deskNumber ? DetailData.deskNumber : t('public.none') }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.numberOfDiners')" v-if="DetailData.orderType != 'due'">{{ DetailData.deskPeople ? DetailData.deskPeople : t('public.none') }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.orderNo')">{{ DetailData.orderId }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.reservationTime')" v-if="DetailData.orderType == 'due'">{{ formatDate(DetailData.dueTime) }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.arrivalTime')" v-if="DetailData.orderType == 'due'">{{ DetailData.reachTime }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.reservationPerson')" v-if="DetailData.orderType == 'due'">{{ DetailData.realName }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.reservationPhone')" v-if="DetailData.orderType == 'due'">{{ DetailData.userPhone }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.orderStatus')" v-if="DetailData.orderType != 'due'">{{ DetailData.statusStr }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.reservationStatus')" v-if="DetailData.orderType == 'due'">
+          <span v-if="DetailData.dueStatus == 1">{{t('mall.reserving')}}</span>
+          <span v-else-if="DetailData.dueStatus == 2">{{t('mall.cancelled')}}</span>
+          <span v-else>{{t('mall.completed')}}</span>
         </el-descriptions-item>
-        <el-descriptions-item label="商品总数">{{ DetailData.totalNum }}</el-descriptions-item>
-        <el-descriptions-item label="商品总价">{{ DetailData.totalPrice }}</el-descriptions-item>
-        <el-descriptions-item label="支付邮费">{{ DetailData.payPostage }}</el-descriptions-item>
-        <el-descriptions-item label="优惠券金额">{{ DetailData.couponPrice }}</el-descriptions-item>
-        <el-descriptions-item label="积分抵扣">{{ DetailData.useIntegral }}</el-descriptions-item>
-        <el-descriptions-item label="实际支付">{{ DetailData.payPrice }}</el-descriptions-item>
-        <el-descriptions-item label="赠送积分">{{ DetailData.gainIntegral }}</el-descriptions-item>
-        <el-descriptions-item label="创建时间">{{ formatDate(DetailData.createTime)}}</el-descriptions-item>
-        <el-descriptions-item label="支付时间">{{ formatDate(DetailData.payTime) }}</el-descriptions-item>
-        <el-descriptions-item label="支付方式">{{ DetailData.payType }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.totalProductQuantity')">{{ DetailData.totalNum }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.totalProductPrice')">{{ DetailData.totalPrice }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.shippingFee')">{{ DetailData.payPostage }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.couponAmount')">{{ DetailData.couponPrice }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.pointsDeduction')">{{ DetailData.useIntegral }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.actualPayment')">{{ DetailData.payPrice }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.bonusPoints')">{{ DetailData.gainIntegral }}</el-descriptions-item>
+        <el-descriptions-item :label="t('public.createTime')">{{ formatDate(DetailData.createTime)}}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.paymentTime')">{{ formatDate(DetailData.payTime) }}</el-descriptions-item>
+        <el-descriptions-item :label="t('mall.paymentMethod')">{{ DetailData.payType }}</el-descriptions-item>
       </el-descriptions>
       <div style="margin-top:50px;text-align:center">
-        <el-button type="primary" @click="openHelp()">协助点餐</el-button>
-        <el-button type="success" @click="handlePay(DetailData.id)">确认收款</el-button>
-        <el-button type="danger" @click="handlePrint(DetailData.orderId)">出单打印小票</el-button>
+        <el-button type="primary" @click="openHelp()">{{t('mall.assistWithOrdering')}}</el-button>
+        <el-button type="success" @click="handlePay(DetailData.id)">{{t('mall.confirmCollection')}}</el-button>
+        <el-button type="danger" @click="handlePrint(DetailData.orderId)">{{t('mall.issueOrderAndPrintReceipt')}}</el-button>
       </div>
     </div>
   </el-drawer>
@@ -145,11 +145,11 @@ const openHelp = () => {
 
 const handlePay = async (id: number) => {
   if(!id) {
-    message.error('请先点餐哦!')
+    message.error(t('mall.pleasePlaceAnOrderFirst'))
     return
   }
   try {
-    await message.confirm('确定下线收款')
+    await message.confirm(t('mall.confirmOfflineCollection'))
     await StoreOrderApi.payStoreOrder(id)
     message.success(t('common.updateSuccess'))
 
@@ -160,7 +160,7 @@ const handlePay = async (id: number) => {
 
 const handlePrint = async (id) => {
   if(!id) {
-    message.error('请先点餐哦!')
+    message.error(t('mall.pleasePlaceAnOrderFirst'))
     return
   }
   try {
@@ -168,7 +168,7 @@ const handlePrint = async (id) => {
     //await StoreOrderApi.payStoreOrder(id)
     //message.success(t('common.updateSuccess'))
     await CashierApi.printOrder({orderId:id})
-    message.success('已出单')
+    message.success(t('mall.orderIssued'))
    drawer.value = false
 
   } catch {}

+ 3 - 3
src/views/mall/order/storeOrder/OrderRecord.vue

@@ -1,9 +1,9 @@
 <template>
   <el-drawer v-model="drawer" :title="dialogTitle" size="40%">
     <el-table :data="tableData" style="width: 100%">
-      <el-table-column prop="oid" label="订单id" width="180" />
-      <el-table-column prop="changeMessage" label="操作记录" width="180" />
-      <el-table-column prop="changeTime" :formatter="dateFormatter" label="操作时间" />
+      <el-table-column prop="oid" :label="t('mall.orderId')" width="180" />
+      <el-table-column prop="changeMessage" :label="t('mall.operationRecord')" width="180" />
+      <el-table-column prop="changeTime" :formatter="dateFormatter" :label="t('mall.operationTime')" />
     </el-table>
   </el-drawer>
 

Некоторые файлы не были показаны из-за большого количества измененных файлов