Prechádzať zdrojové kódy

feat: 提取多语言硬编码

Jack Zhou 2 týždňov pred
rodič
commit
a1f21cab3c

+ 34 - 0
src/api/module/multilingual.ts

@@ -0,0 +1,34 @@
+import HttpAxios from '@/utils/axios'
+
+const base = import.meta.env.VITE_API_HOST
+const baseUrl = `${base}/main_new_version.php`
+
+/**
+ * save Multilingual Config
+ */
+export const saveMultilingualConfig = (params: any, config: any) => {
+  return HttpAxios.post(
+    `${baseUrl}`,
+    {
+      action: 'multilingual',
+      operate: 'multilingual_save',
+      ...params
+    },
+    config
+  )
+}
+
+/**
+ * search Multilingual Config
+ */
+export const searchMultilingualConfig = (params: any, config: any) => {
+  return HttpAxios.post(
+    `${baseUrl}`,
+    {
+      action: 'multilingual',
+      operate: 'multilingual_search',
+      ...params
+    },
+    config
+  )
+}

+ 138 - 10
src/locales/en.json

@@ -61,7 +61,6 @@
   "common": {
     "search": "Search",
     "searchUserNamePlaceholder": "Search user name",
-    "searchQuestionPlaceholder": "Search Question ID、User",
     "searchChatPlaceholder": "Search Question ID、User",
     "customerSearchPlaceholder": "Search by Customer code, Customer name",
     "customerType": "Customer Type",
@@ -71,8 +70,14 @@
     "cancel": "Cancel",
     "save": "Save",
     "reset": "Reset",
+    "copy": "Copy",
+    "edit": "Edit",
+    "delete": "Delete",
     "ok": "OK",
     "change": "Change",
+    "login": "Login",
+    "download": "Download",
+    "selected": "Selected",
     "all": "All",
     "update": "Update",
     "prompt": "Prompt",
@@ -153,6 +158,8 @@
     "pleaseSelectDateRange": "Please Select Date Range",
     "pleaseSelectService": "Please Select Service",
     "seeAll": "See All",
+    "changePassword": "Change Password",
+    "action":"action",
     "partyType": "Party Type",
     "partyDetails": "Party Details",
     "pleaseSelectPartyType": "Please Select Party Type",
@@ -348,6 +355,15 @@
     "showAll": "Show All",
     "hideAll": "Hide All",
     "of": "of",
+    "reportDataReview": "Report Data Review",
+    "reportName": "Report Name",
+    "ascending": "Ascending",
+    "descending": "Descending",
+    "sortBy": "Sort by",
+    "reportDescription": "Report Description",
+    "reportLevel": "Report Level",
+    "reportAccessControl": "Report Access Control",
+    "reportAccessControlDescription": "Report Access Control Description",
     "fieldsVisible": "Fields Visible",
     "systemName": "System Name",
     "displayNameInReport": "Display Name in Report",
@@ -368,9 +384,22 @@
     "isActivePlaceholder": "Is Active",
     "applicationScopePlaceholder": "Application Scope",
     "partyIdsPlaceholder": "Party IDs",
+    "partyId": "Party ID",
+    "groupName": "Group Name",
+    "systemAccount": "System Account",
+    "klnOnlineAccount": "KLN Online Account",
+    "specificRoles": "Specific Roles",
+    "allUsersDescription": " This report will be available to all users in the system ",
+    "specificRolesDescription": "Restrict access to specific user roles",
+    "action" :"Action",
     "active": "Active",
     "inactive": "Inactive",
     "allUsers": "All Users",
+    "createNewReportTemplate": "Create New Report Template",
+    "emptyCreateTip": "Click the \"Create New Report Template\" button to add a report template.",
+    "shipmentLevel": "Shipment Level",
+    "containerLevel": "Container Level",
+    "itemLevel": "Item Level",
     "specificUsers": "Specific Users",
     "selectPartyIdsMulti": "Select Party IDs (Multi-select allowed)",
     "selectGroupNameMulti": "Select Group Name (Multi-select allowed)",
@@ -381,7 +410,10 @@
     "reportFieldsConfigurationReportLevelRequired": "Please select the report level.",
     "reportNameRequired": "Please enter the Report Name.",
     "reportDescriptionRequired": "Please enter the Report Description.",
+    "specificRolesRequired": "Please select Party ID or Group Name or KLN ONLINE Account for Specific Roles access control.",
     "savedSuccessfully": "Report Template saved successfully!",
+    "saveFailed": "Failed to save Report Template.",
+    "basicReportInformation": "Basic Report Information",
     "newFieldNameRequired": "Please enter a field name.",
     "fixedValueRequired": "Please enter a fixed value.",
     "reportLevelRequired": "Please enter the Report Level",
@@ -406,7 +438,23 @@
     "outputValueLabel": "Output Value",
     "addMapping": "Add Mapping",
     "cancel": "Cancel",
-    "apply": "Apply"
+    "apply": "Apply",
+    "reportName": "Report Name",
+    "reportLevel": "Report Level",
+    "isActive": "Is Active",
+    "applicationScope": "Application Scope",
+    "creationDate": "Creation Date",
+    "createdBy": "Created By",
+    "modifyBy": "Modify By",
+    "inactivate": "Inactivate",
+    "activate": "Activate",
+    "delete": "Delete",
+    "reportDescription": "Report Description",
+    "reportAccessControl": "Report Access Control",
+    "reportAccessControlDescription": "Report Access Control Description",
+    "fieldsVisible": "Fields Visible",
+    "systemName": "System Name",
+    "displayNameInReport": "Display Name in Report"
   },
   "reportSchedule": {
     "scheduleConfiguration": "Schedule Configuration - {name}",
@@ -424,7 +472,25 @@
     "startDate": "Start Date",
     "endDate": "End Date",
     "past": "Past",
+    "emailRecipients": "Email Recipients",
+    "timezone": "Timezone",
+    "deliveryFrequency": "Delivery Frequency",
+    "time": "Time",
+    "week": "Week",
+    "monthly": "Monthly",
+    "quarterly": "Quarterly",
+    "yearly": "Yearly",
+    "day": "Day",
+    "month": "Month",
+    "quarter": "Quarter",
+    "quarterMonth": "Quarter Month",
+    "yearlyMonth": "Yearly Month",
+    "year": "Year",
     "future": "Future",
+    "daysOfWeekSelectMultiple": "Days of Week (Select Multiple)",
+    "daysOfMonthSelectMultiple": "Days of Month (Select Multiple)",
+    "monthsSelectMultiple": "Months (Select Multiple)",
+    "scheduleDetails": "Schedule Details",
     "dynamicRollingTooltipLine1": "Configuration: Past X days to Future Y days, always dynamically calculated based on current date when generating reports.",
     "dynamicRollingTooltipLine2": "Usage: For example, setting 5 days to 3 days means the data range differs each time it's automatically generated. Used for short-cycle operational monitoring.",
     "fixedRangeTooltipLine1": "Configuration: Specific start and end dates, always query this range when automatically generating reports.",
@@ -459,18 +525,52 @@
     "title": "AI API Log",
     "searchPlaceholder": "Search Request ID, Question ID",
     "aiModel": "AI Model",
-    "responseDuration": "Response Duration",
     "selected": "Selected",
     "requestContent": "Request Content",
     "responseContent": "Response Content",
     "selectDataOnLogList": "Select data on your Operation Log list:",
+    "downloadWithSelectedColumns": "Download with selected columns"
+  },
+  "operationLog": {
+    "title": "Operation Log",
+    "customizeColumns":"Customize Columns",
+    "openDetailedPage":"Open Detailed Page",
+    "closeDetailedPage":"Close Detailed Page",
+    "download":"Download",
+    "sendEmail":"Send Email",
+    "publicTracking":"Public Tracking",
+    "addReference":"Add Reference",
+    "uploadFile":"Upload File",
+    "amsIsf":"AMS/ISF",
+    "changePassword":"Change Password",
+    "logout":"Logout",
+    "profile":"Profile",
+    "personalProfile":"Personal Profile",
+    "subscribeNotifications":"Subscribe Notifications",
+    "monitoringSettings":"Monitoring Settings",
+    "notificationEventsForSubscribedShipments":"Notification Events for Subscribed Shipments",
+    "edit":"Edit",
+    "add":"Add",
+    "subscribedShipments":"Subscribed Shipments",
+    "addRule":"Add Rule",
+    "customizeYourShipmentTrackingPreferences":"Customize your shipment tracking preferences.",
+    "event":"Event",
+    "eventDetails":"Event Details",
+    "frequency":"Frequency",
+    "methods":"Methods",
+    "hbolHawb":"HBOL/HAWB",
+    "shipper":"Shipper",
+    "consignee":"Consignee",
+    "etd":"ETD",
+    "recentMilestone":"Recent Milestone",
+    "recentMilestoneTitle":"Recent Milestone",
+    "recentMilestoneDescription":"Recent Milestone",
+    "recentMilestoneButton":"Recent Milestone",
+    "recentMilestoneButtonText":"Recent Milestone",
+    "selectDataOnLogList": "Select data on your Operation Log list:",
     "downloadWithSelectedColumns": "Download with selected columns",
-    "deepseek": "Deepseek",
-    "claude": "Claude",
-    "greaterOrEqual": ">=",
-    "equal": "=",
-    "lessOrEqual": "<=",
-    "download": "Download"
+    "supportedReferenceTip1": "We support the following references number to find booking:",
+    "supportedReferenceTip2": "· Booking No./HAWB No./MAWB No./PO No./Carrier Booking No./Contract No./File No./Quote No."
   },
   "notificationRules": {
     "shipmentRange": "Shipment Range",
@@ -675,12 +775,39 @@
     "profile": "Profile",
     "personalProfileTab": "Personal Profile",
     "subscribeNotificationsTab": "Subscribe Notifications",
+    "event": "Event",
+    "eventDetails": "Event Details",
+    "frequency": "Frequency",
+    "methods": "Methods",
+    "hbolHawb": "HBOL/HAWB",
+    "shipper": "Shipper",
+    "consignee": "Consignee",
+    "etd": "ETD",
+    "recentMilestone": "Recent Milestone",
+    "recentMilestoneTitle": "Recent Milestone",
+    "recentMilestoneDescription": "Recent Milestone",
+    "recentMilestoneButton": "Recent Milestone",
+    "recentMilestoneButtonText": "Recent Milestone",
+    "selectDataOnLogList": "Select data on your Operation Log list:",
+    "downloadWithSelectedColumns": "Download with selected columns",
+    "supportedReferenceTip1": "We support the following references number to find booking:",
+    "supportedReferenceTip2": "· Booking No./HAWB No./MAWB No./PO No./Carrier Booking No./Contract No./File No./Quote No.",
     "monitoringSettingsTab": "Monitoring Settings",
+    "shipmentRange":"Shipment Range",
     "notificationEventsForSubscribedShipments": "Notification Events for Subscribed Shipments",
     "edit": "Edit",
     "add": "Add",
     "subscribedShipments": "Subscribed Shipments",
-    "addRule": "Add Rule"
+    "addRule": "Add Rule",
+    "deleteRule": "Delete Rule",
+    "confirmDeleteRule": "Are you sure to delete this notification event?",
+    "configuration": "Configuration",
+    "addedRules": "Added Rules",
+    "failedToLoadOptions": "Failed to load options",
+    "bookings": "Bookings",
+    "customizeYourShipmentTrackingPreferences": "Customize your shipment tracking preferences",
+    "accountPasswordExpiredUnavailable": "This account's password has expired and is currently unavailable. Please select a different customer account to continue.",
+    "accountPasswordExpiredUnavailableDescription": "This account's password has expired and is currently unavailable. Please select a different customer account to continue."
   },
  
   "dashboard": {
@@ -941,6 +1068,7 @@
     "freeStoragePeriodEnds": "Free Storage Period Ends",
     "total": "Total",
     "shipments": "shipments",
+    "ctns": "ctns",
     "totalCartons": "Total Cartons",
     "packingList": "Packing List",
     "bookingDetail": "Booking Detail",

+ 6 - 6
src/views/AIApiLog/src/AIApiLog.vue

@@ -19,26 +19,26 @@ const searchData = ref({
 
 const aiModelList = [
   {
-    label: t('aiApiLog.deepseek'),
+    label: 'Deepseek',
     value: 'Deepseek'
   },
   {
-    label: t('aiApiLog.claude'),
+    label: 'Claude',
     value: 'Claude'
   }
 ]
 
 const comparatorList = [
   {
-    label: t('aiApiLog.greaterOrEqual'),
+    label: '>=',
     value: 'thanOrEqual'
   },
   {
-    label: t('aiApiLog.equal'),
+    label: '=',
     value: 'equal'
   },
   {
-    label: t('aiApiLog.lessOrEqual'),
+    label: '<=',
     value: 'lessOrEqual'
   }
 ]
@@ -94,7 +94,7 @@ const DateChange = (date: any) => {
           </el-select>
         </div>
         <div class="comparator-tips_filter">
-          <span>{{ t('aiApiLog.responseDuration') }}</span>
+          <span>{{ t('common.responseDuration') }}</span>
           <el-select
             placeholder=""
             clearable

+ 4 - 2
src/views/AIApiLog/src/components/TableView/src/TableView.vue

@@ -386,7 +386,7 @@ defineExpose({
       <div class="right-tools-btn">
         <el-button class="el-button--main el-button--pain-theme" @click="handleDownload">
           <span style="margin-right: 8px" class="font_family icon-icon_download_b"></span>
-          {{ t('tracking.download') }}
+          {{ t('common.download') }}
         </el-button>
       </div>
     </div>
@@ -411,7 +411,9 @@ defineExpose({
     </vxe-grid>
     <vxe-grid :height="10" ref="allTableRef" class="all-table" v-bind="allTable"> </vxe-grid>
     <div class="bottom-pagination">
-      <div class="left-total-records">{{ t('common.total') }} {{ formatNumber(pageInfo.total) }}</div>
+      <div class="left-total-records">
+        {{ t('common.total') }} {{ formatNumber(pageInfo.total) }}
+      </div>
       <div class="right-pagination">
         <el-pagination
           v-model:current-page="pageInfo.pageNo"

+ 11 - 7
src/views/AIApiLog/src/components/TableView/src/components/DownloadDialog.vue

@@ -41,13 +41,17 @@ defineExpose({
 
 <template>
   <div>
-    <el-dialog @close="clearData" v-model="dialogVisible" :title="t('common.downloadFile')" width="540">
+    <el-dialog
+      @close="clearData"
+      v-model="dialogVisible"
+      :title="t('common.downloadFile')"
+      width="540"
+    >
       <div class="download-dialog">
         <div class="select-data">
           <div style="display: inline-block">
-            {{ t('aiApiLog.selectDataOnLogList') }}<span style="color: var(--color-theme)">{{
-              selectedDataNumber
-            }}</span>
+            {{ t('aiApiLog.selectDataOnLogList')
+            }}<span style="color: var(--color-theme)">{{ selectedDataNumber }}</span>
           </div>
         </div>
         <div class="download-filter" v-if="!props.isHideSelectColumn">
@@ -73,9 +77,9 @@ defineExpose({
       </div>
       <template #footer>
         <div class="dialog-footer">
-          <el-button class="cancel-btn" type="default" @click="dialogVisible = false"
-            >{{ t('common.cancel') }}</el-button
-          >
+          <el-button class="cancel-btn" type="default" @click="dialogVisible = false">{{
+            t('common.cancel')
+          }}</el-button>
           <el-button class="download-btn el-button--dark" @click="handleDownload"
             ><span style="margin-right: 8px" class="font_family icon-icon_download_b"></span>
             {{ t('tracking.download') }}</el-button

+ 1 - 5
src/views/ChatLog/src/ChatLog.vue

@@ -129,11 +129,7 @@ const DateChange = (date: any) => {
           <CalendarDate @DateChange="DateChange"></CalendarDate>
         </div>
         <div class="tips_filter">
-          <el-select
-            v-model="searchData.user_type"
-            clearable
-            :placeholder="t('common.userType')"
-          >
+          <el-select v-model="searchData.user_type" clearable :placeholder="t('common.userType')">
             <el-option
               v-for="item in userTypeList"
               :key="item.value"

+ 40 - 25
src/views/DestinationDelivery/src/components/CreateNewBooking/src/CreateNewbooking.vue

@@ -727,12 +727,13 @@ onMounted(() => {
       <div v-else>{{ t('destinationDelivery.modifyBooking') }}</div>
       <div class="flex">
         <div class="select-info">
-          <span style="color: var(--color-neutral-2)">{{ t('destinationDelivery.selected') }}: </span>
+          <span style="color: var(--color-neutral-2)"
+            >{{ t('destinationDelivery.selected') }}:
+          </span>
           <span
-            >{{ bookingTableRef?.getTableCheckedRows().length }} Shipments|{{
-              ctnsCount
-            }}
-            ctns</span
+            >{{ bookingTableRef?.getTableCheckedRows().length }}
+            {{ t('destinationDelivery.shipments') }}|{{ ctnsCount }}
+            {{ t('destinationDelivery.ctns') }}</span
           >
         </div>
         <el-button @click="CancelRulesVisible = true" class="el-button--default create-button">
@@ -742,13 +743,15 @@ onMounted(() => {
           :disabled="isNotSubmit"
           @click="SubmitBooking"
           class="el-button--main create-button"
-          ><span class="font_family icon-icon_submit_b"></span> {{ t('destinationDelivery.submit') }}</el-button>
+          ><span class="font_family icon-icon_submit_b"></span>
+          {{ t('destinationDelivery.submit') }}</el-button
+        >
         >
       </div>
     </div>
     <div class="booking-info" v-if="a != undefined">
       <div class="booking-no">
-        <span class="no">Booking No.{{ booking }}</span>
+        <span class="no">{{ t('booking.bookingNo') }}{{ booking }}</span>
         <v-tag class="tag" type="Pending Approval">{{ status }}</v-tag>
       </div>
     </div>
@@ -756,9 +759,8 @@ onMounted(() => {
     <!-- Select Shipments -->
     <div class="Delivery" style="font-weight: bold">
       <span class="serial-number">1</span>
-      <span class="stars_red">*</span>{{ t('destinationDelivery.selectShipments') }}<span class="title_warning"
-        >*{{ t('destinationDelivery.selectSameConsigneeTip') }}</span
-      >
+      <span class="stars_red">*</span>{{ t('destinationDelivery.selectShipments')
+      }}<span class="title_warning">*{{ t('destinationDelivery.selectSameConsigneeTip') }}</span>
     </div>
     <div class="select_shipments">
       <div v-if="isNotSameConfiguration" class="alertIndormation">
@@ -786,7 +788,9 @@ onMounted(() => {
               class="log_input"
             >
             </el-input>
-            <span v-if="showLabelShipper" class="border-label">{{ t('destinationDelivery.shipper') }}</span>
+            <span v-if="showLabelShipper" class="border-label">{{
+              t('destinationDelivery.shipper')
+            }}</span>
           </div>
           <div class="input-with-label">
             <!-- <AutoSelect ASPlaceholder="Input Vessel Name" :ASValue="VesselName" @changeFocus="changeFocus"></AutoSelect> -->
@@ -798,7 +802,9 @@ onMounted(() => {
               class="log_input"
             >
             </el-input>
-            <span v-if="showLabelConsignee" class="border-label">{{ t('destinationDelivery.consignee') }}</span>
+            <span v-if="showLabelConsignee" class="border-label">{{
+              t('destinationDelivery.consignee')
+            }}</span>
           </div>
 
           <div class="input-with-label">
@@ -834,9 +840,9 @@ onMounted(() => {
               style="width: 100%; height: 40px"
             >
             </a-date-picker>
-            <span v-if="isFocused.deliveryDate" class="border-label"
-              >{{ t('destinationDelivery.recommendedDeliveryDate') }}</span
-            >
+            <span v-if="isFocused.deliveryDate" class="border-label">{{
+              t('destinationDelivery.recommendedDeliveryDate')
+            }}</span>
           </div>
 
           <div class="input-with-label">
@@ -850,7 +856,9 @@ onMounted(() => {
               style="width: 100%"
             >
             </el-input>
-            <span v-if="showLabelVessel" class="border-label">{{ t('destinationDelivery.vesselName') }}</span>
+            <span v-if="showLabelVessel" class="border-label">{{
+              t('destinationDelivery.vesselName')
+            }}</span>
           </div>
           <div class="right-btn">
             <el-button
@@ -879,7 +887,8 @@ onMounted(() => {
           :disabled="isNotClickAddress"
           @click="handleClickAddress"
           class="el-button--noborder--configuration"
-          ><span class="font_family icon-icon_location_b"></span> {{ t('destinationDelivery.addressBook') }}</el-button
+          ><span class="font_family icon-icon_location_b"></span>
+          {{ t('destinationDelivery.addressBook') }}</el-button
         >
       </div>
       <div class="empty_address" v-if="isselectedAddress == null">
@@ -936,7 +945,9 @@ onMounted(() => {
       </div>
       <div class="delivery_type">
         <div>
-          <div class="delivery_type_title"><span class="stars_red">*</span>{{ t('destinationDelivery.modeType') }}</div>
+          <div class="delivery_type_title">
+            <span class="stars_red">*</span>{{ t('destinationDelivery.modeType') }}
+          </div>
           <el-select
             v-model="modetypeValue"
             :placeholder="t('destinationDelivery.select')"
@@ -980,7 +991,9 @@ onMounted(() => {
           </a-date-picker>
         </div>
         <div>
-          <div class="delivery_type_title"><span class="stars_red">*</span>{{ t('destinationDelivery.deliveryTime') }}</div>
+          <div class="delivery_type_title">
+            <span class="stars_red">*</span>{{ t('destinationDelivery.deliveryTime') }}
+          </div>
           <el-time-select
             v-model="DeliveryTime"
             :disabled="isNotClickAddress"
@@ -1143,7 +1156,7 @@ onMounted(() => {
     <el-dialog
       v-model="AddNewAddressVisible"
       width="640"
-    :title="t('destinationDelivery.addNewDeliveryAddressTitle')"
+      :title="t('destinationDelivery.addNewDeliveryAddressTitle')"
       :show-close="false"
     >
       <div class="diaolog_add_title"><span class="stars_red">*</span>Address</div>
@@ -1157,7 +1170,7 @@ onMounted(() => {
         <el-input
           @input="handleAddressLine1"
           class="inputmargin2"
-            :placeholder="t('destinationDelivery.addressLine1Placeholder')"
+          :placeholder="t('destinationDelivery.addressLine1Placeholder')"
           v-model="AddressLine1"
         >
           <template #suffix>
@@ -1177,7 +1190,7 @@ onMounted(() => {
         <el-input
           @input="handleAddressLine2"
           class="inputmargin2"
-            :placeholder="t('destinationDelivery.addressLine2Placeholder')"
+          :placeholder="t('destinationDelivery.addressLine2Placeholder')"
           v-model="AddressLine2"
         >
           <template #suffix>
@@ -1197,7 +1210,7 @@ onMounted(() => {
         <el-input
           @input="handleAddressLine3"
           class="inputmargin2"
-            :placeholder="t('destinationDelivery.addressLine3Placeholder')"
+          :placeholder="t('destinationDelivery.addressLine3Placeholder')"
           v-model="AddressLine3"
         >
           <template #suffix>
@@ -1218,7 +1231,7 @@ onMounted(() => {
           style="margin-bottom: 16px"
           @input="handleAddressLine4"
           class="inputmargin2"
-            :placeholder="t('destinationDelivery.addressLine4Placeholder')"
+          :placeholder="t('destinationDelivery.addressLine4Placeholder')"
           v-model="AddressLine4"
         >
           <template #suffix>
@@ -1406,7 +1419,9 @@ onMounted(() => {
     <!-- 當選擇非建議日期内的date時給出的提示 -->
     <el-dialog v-model="isRecommendDate" width="480">
       <div>{{ recommendateWarning }}</div>
-      <div style="margin-top: 4px">{{ t('destinationDelivery.additionalStorageFeesMayApply') }}</div>
+      <div style="margin-top: 4px">
+        {{ t('destinationDelivery.additionalStorageFeesMayApply') }}
+      </div>
       <div style="margin-top: 8px">
         <div class="Notice" v-for="(item, index) in RecommendateList" :key="index">
           HOBL: {{ item.Hbol }}

+ 5 - 5
src/views/Login/src/components/ChangePasswordCard.vue

@@ -46,22 +46,22 @@ const handleChangePwd = () => {
   }
   if (loginForm.value.newPassword.length < 12 || loginForm.value.newPassword.length > 20) {
     loginError.value.newPassword = true
-    newPwdErrTips.value = 'Password length between 12 - 20'
+    newPwdErrTips.value = t('login.passwordLength12to20')
     return
   }
   if (!/[A-Z]/.test(loginForm.value.newPassword)) {
     loginError.value.newPassword = true
-    newPwdErrTips.value = 'Password must contain uppercase letters'
+    newPwdErrTips.value = t('login.passwordMustContainUppercase')
     return
   }
   if (!/[a-z]/.test(loginForm.value.newPassword)) {
     loginError.value.newPassword = true
-    newPwdErrTips.value = 'Password must contain lowercase letters'
+    newPwdErrTips.value = t('login.passwordMustContainLowercase')
     return
   }
   if (!/[0-9]/.test(loginForm.value.newPassword)) {
     loginError.value.newPassword = true
-    newPwdErrTips.value = 'Password must contain numbers'
+    newPwdErrTips.value = t('login.passwordMustContainNumber')
     return
   }
   $api
@@ -132,7 +132,7 @@ const checkPassword = () => {
   <div class="login" :class="{ 'dark-bg': themeStore.theme === 'dark' }">
     <el-card class="login-card">
       <div class="title" :class="{ 'is-dark': themeStore.theme === 'dark' }">
-        <span class="welcome">Change Password</span>
+        <span class="welcome">{{ t('login.changePassword') }}</span>
         <span class="tips">{{ tips }}</span>
       </div>
       <div class="login-form">

+ 1 - 1
src/views/OperationLog/src/OperationLog.vue

@@ -174,7 +174,7 @@ const DateChange = (date: any) => {
 </script>
 <template>
   <div class="dashboard">
-    <div class="Title">Operation Log</div>
+    <div class="Title">{{ t('operationLog.title') }}</div>
     <div class="display">
       <div class="heaer_top">
         <div class="search tips_filter">

+ 9 - 7
src/views/OperationLog/src/components/BookingTable/src/BookingTable.vue

@@ -7,6 +7,9 @@ import { useRowClickStyle } from '@/hooks/rowClickStyle'
 import dayjs from 'dayjs'
 import { useThemeStore } from '@/stores/modules/theme'
 import { formatTimezone, formatNumber } from '@/utils/tools'
+import { useI18n } from 'vue-i18n'
+
+const { t } = useI18n()
 
 const themeStore = useThemeStore()
 
@@ -351,16 +354,16 @@ defineExpose({
     style="padding: 0px 20px"
     class="booking-table"
     v-loading.fullscreen.lock="exportLoading"
-    element-loading-text="Loading..."
+    :element-loading-text="t('common.loading')"
     element-loading-custom-class="element-loading"
     element-loading-background="rgb(43, 47, 54, 0.7)"
   >
     <div class="table-tools">
-      <div class="left-total-records">{{ selectedNumber }} Selected</div>
+      <div class="left-total-records">{{ selectedNumber }} {{ t('common.selected') }}</div>
       <div class="right-tools-btn">
         <el-button class="el-button--main el-button--pain-theme" @click="handleDownload">
           <span style="margin-right: 8px" class="font_family icon-icon_download_b"></span>
-          Download
+          {{ t('common.download') }}
         </el-button>
       </div>
     </div>
@@ -378,11 +381,10 @@ defineExpose({
         <VEmpty>
           <template #suggestion>
             <p style="color: var(--color-neutral-3)">
-              We support the following references number to find booking:
+              {{ t('operationLog.supportedReferenceTip1') }}
             </p>
             <p style="color: var(--color-neutral-3)">
-              · Booking No./HAWB No./MAWB No./PO No./Carrier Booking No./Contract No./File No./Quote
-              No.
+              {{ t('operationLog.supportedReferenceTip2') }}
             </p>
           </template>
         </VEmpty>
@@ -390,7 +392,7 @@ defineExpose({
     </vxe-grid>
     <vxe-grid :height="10" ref="allTableRef" class="all-table" v-bind="allTable"> </vxe-grid>
     <div class="bottom-pagination">
-      <div class="left-total-records">Total {{ formatNumber(pageInfo.total) }}</div>
+      <div class="left-total-records">{{ t('common.total') }} {{ formatNumber(pageInfo.total) }}</div>
       <div class="right-pagination">
         <el-pagination
           v-model:current-page="pageInfo.pageNo"

+ 2 - 2
src/views/OperationLog/src/components/BookingTable/src/components/DownloadDialog.vue

@@ -39,7 +39,7 @@ defineExpose({
       <div class="download-dialog">
         <div class="select-data">
           <div style="display: inline-block">
-            {{ t('aiApiLog.selectDataOnLogList') }}<span style="color: var(--color-theme)">{{
+            {{ t('operationLog.selectDataOnLogList') }}<span style="color: var(--color-theme)">{{
               selectedDataNumber
             }}</span>
           </div>
@@ -47,7 +47,7 @@ defineExpose({
         <div class="download-filter">
           <el-radio-group v-model="downloadFilter">
             <el-radio :value="1"
-              >{{ t('destinationDelivery.downloadWithSelectedColumns') }}
+              >{{ t('operationLog.downloadWithSelectedColumns') }}
               <span class="column-number">{{ columns.length }}</span>
               <SeeAllIcon v-model="isShowSelectColumn" />
             </el-radio>

+ 2 - 2
src/views/Report/src/components/ReportDetail/src/components/FieldsTable.vue

@@ -92,7 +92,7 @@ const handleColumns = (columns: any) => {
     if (item.formatter === 'date' || item.formatter === 'dateTime') {
       curColumn = {
         ...curColumn,
-        formatter: ({ cellValue }: any) => formatTimezone(cellValue, '', '', 'MM/DD/YYYY HH:mm')
+        formatter: ({ cellValue }: any) => formatTimezone(cellValue, '', false, 'MM/DD/YYYY HH:mm')
       }
     } else if (item.formatter === 'number') {
       curColumn = {
@@ -220,7 +220,7 @@ defineExpose({
       <div class="flex">
         <div class="title">{{ t('report.reportDataReview') }}</div>
         <div class="flex" style="margin-bottom: 6px">
-          <span class="sort-text">Sort by:</span>
+          <span class="sort-text">{{ t('report.sortBy') }}:</span>
           <el-select
             style="width: 200px; margin: 0 8px"
             v-model="sortBy"

+ 10 - 11
src/views/Report/src/components/ReportSchedule/src/components/EmailConfiguration.vue

@@ -2,7 +2,6 @@
 import { useI18n } from 'vue-i18n'
 
 const { t } = useI18n()
-import { time } from 'console'
 import moment from 'moment-timezone'
 
 const props = defineProps<{
@@ -245,7 +244,7 @@ defineExpose({
   <div style="padding: 8px 16px 0 16px">
     <div class="title">
       <span class="stars_red">*</span>
-      Email Recipients
+      {{ t('reportSchedule.emailRecipients') }}
     </div>
     <el-input
       v-model="emailValue"
@@ -261,7 +260,7 @@ defineExpose({
       <div class="timezone" style="margin-right: 8px">
         <div class="title">
           <span class="stars_red">*</span>
-          Timezone
+          {{ t('reportSchedule.timezone') }}
         </div>
         <el-select
           class="select_time"
@@ -279,7 +278,7 @@ defineExpose({
       <div class="timezone">
         <div class="title">
           <span class="stars_red">*</span>
-          Delivery Frequency
+          {{ t('reportSchedule.deliveryFrequency') }}
         </div>
         <el-select
           class="select_time"
@@ -297,11 +296,11 @@ defineExpose({
       </div>
     </div>
     <div class="schedule_details">
-      <div class="detail_title">Schedule Details</div>
+      <div class="detail_title">{{ t('reportSchedule.scheduleDetails') }}</div>
       <div class="weelkly_detailes" v-if="frequencyValue == 'weekly'">
         <div class="title">
           <span class="stars_red">*</span>
-          Days of Week (Select multiple)
+          {{ t('reportSchedule.daysOfWeekSelectMultiple') }}
         </div>
         <el-checkbox-group v-model="weeklyChecked" style="margin: 4px 0 16px 0">
           <el-checkbox
@@ -317,7 +316,7 @@ defineExpose({
       <div class="monthly_detailes" v-else-if="frequencyValue == 'monthly'">
         <div class="title">
           <span class="stars_red">*</span>
-          Days of Month (Select multiple)
+          {{ t('reportSchedule.daysOfMonthSelectMultiple') }}
         </div>
         <el-checkbox-group v-model="monthlyChecked" style="margin: 4px 0 16px 0">
           <el-checkbox border v-for="item in 31" :key="item" :value="item">
@@ -328,7 +327,7 @@ defineExpose({
       <div class="yearly_detailes" v-else-if="frequencyValue == 'yearly'">
         <div class="title">
           <span class="stars_red">*</span>
-          Months (Select multiple)
+          {{ t('reportSchedule.monthsSelectMultiple') }}
         </div>
         <el-checkbox-group v-model="yearlyMonth" style="margin: 4px 0 16px 0">
           <el-checkbox
@@ -345,7 +344,7 @@ defineExpose({
         <div class="details_time" v-if="frequencyValue == 'quarterly'">
           <div class="title">
             <span class="stars_red">*</span>
-            Quarter Month
+            {{ t('reportSchedule.quarterMonth') }}
           </div>
           <el-select
             style="margin: 4px 8px 0 0"
@@ -366,7 +365,7 @@ defineExpose({
         >
           <div class="title">
             <span class="stars_red">*</span>
-            Day
+            {{ t('reportSchedule.day') }}
           </div>
           <el-select
             style="margin: 4px 8px 0 0"
@@ -379,7 +378,7 @@ defineExpose({
         <div class="details_time">
           <div class="title">
             <span class="stars_red">*</span>
-            Time
+            {{ t('reportSchedule.time') }}
           </div>
 
           <el-select

+ 22 - 22
src/views/SystemMessage/src/SystemMessage.vue

@@ -7,7 +7,7 @@ import { useNotificationMessage } from '@/stores/modules/notificationMessage'
 import { isMacOS } from '@/utils/tools'
 
 const isMac = isMacOS()
-const activeCardTypeName = ref(sessionStorage.getItem('activeCardTypeName') || 'Milestone Update')
+const activeCardTypeName = ref(sessionStorage.getItem('activeCardTypeName') || 'Milestone_Update')
 
 const notificationMsgStore = useNotificationMessage()
 const collapseVModel = ref<string[]>(['1'])
@@ -38,26 +38,26 @@ const handleShowCount = (typeName: string, index: number) => {
 }
 
 const navList = [
-  'Milestone Update',
-  'Container Status Update',
-  'Departure/Arrival Delay',
-  'ETD/ETA Change'
+  'Milestone_Update',
+  'Container_Status_Update',
+  'Departure/Arrival_Delay',
+  'ETD/ETA_Change'
 ]
 const navLabelMap = {
-  'Milestone Update': 'systemMessage.milestoneUpdate',
-  'Container Status Update': 'systemMessage.containerStatusUpdate',
-  'Departure/Arrival Delay': 'systemMessage.departureArrivalDelay',
-  'ETD/ETA Change': 'systemMessage.etdEtaChange',
-  'Feature Update': 'systemMessage.featureUpdate'
+  Milestone_Update: 'systemMessage.milestoneUpdate',
+  Container_Status_Update: 'systemMessage.containerStatusUpdate',
+  'Departure/Arrival_Delay': 'systemMessage.departureArrivalDelay',
+  'ETD/ETA_Change': 'systemMessage.etdEtaChange',
+  Feature_Update: 'systemMessage.featureUpdate'
 }
 const getNavLabel = (name: string) => t(navLabelMap[name] || name)
 
 const notificationTypeList = ref({
-  Milestone_Update: 'Milestone Update',
-  Container_Status_Update: 'Container Status Update',
-  'Departure/Arrival_Delay': 'Departure/Arrival Delay',
-  'ETD/ETA_Change': 'ETD/ETA Change',
-  Feature_Update: 'Feature Update'
+  Milestone_Update: 'Milestone_Update',
+  Container_Status_Update: 'Container_Status_Update',
+  'Departure/Arrival_Delay': 'Departure/Arrival_Delay',
+  'ETD/ETA_Change': 'ETD/ETA_Change',
+  Feature_Update: 'Feature_Update'
 })
 
 const setActiveItem = (item: string) => {
@@ -65,7 +65,7 @@ const setActiveItem = (item: string) => {
     curTabCount.value[index] = handleShowCount(navItem, index)
   })
   curTabCount.value[tabCountList.value.length - 1] = handleShowCount(
-    'Feature Update',
+    'Feature_Update',
     tabCountList.value.length - 1
   )
 
@@ -100,7 +100,7 @@ const getNotificationList = async (
     readNotificationList.value = []
     notificationList.value = []
     notificationMessageCardRef.value.adjustScrollTop(0)
-    if (activeCardTypeName.value === 'Feature Update') {
+    if (activeCardTypeName.value === 'Feature_Update') {
       pageInfo.value.ps = 100
     } else {
       pageInfo.value.ps = 30
@@ -226,19 +226,19 @@ onMounted(() => {
           </el-collapse-item>
         </el-collapse>
         <div
-          @click="setActiveItem('Feature Update')"
+          @click="setActiveItem('Feature_Update')"
           class="collapse-item"
           style="margin-top: 4px; font-weight: 700"
-          :class="{ 'is-active': activeCardTypeName === 'Feature Update' }"
+          :class="{ 'is-active': activeCardTypeName === 'Feature_Update' }"
         >
-          <div v-if="activeCardTypeName === 'Feature Update'" class="active-sign"></div>
+          <div v-if="activeCardTypeName === 'Feature_Update'" class="active-sign"></div>
           <span>{{ t('systemMessage.featureUpdate') }}</span>
           <div
             class="count"
             :style="{ 'padding-top': isMac ? 0 : '1px' }"
-            v-if="handleShowCount('Feature Update', tabCountList.length - 1)"
+            v-if="handleShowCount('Feature_Update', tabCountList.length - 1)"
           >
-            <span>{{ handleShowCount('Feature Update', tabCountList.length - 1) }}</span>
+            <span>{{ handleShowCount('Feature_Update', tabCountList.length - 1) }}</span>
           </div>
         </div>
       </div>

+ 3 - 0
src/views/SystemMessage/src/components/SystemMessageDetail.vue

@@ -1,8 +1,11 @@
 <script setup lang="ts">
+import { useI18n } from 'vue-i18n'
 import { useRoute } from 'vue-router'
 import EventCard from '@/components/NotificationMessageCard/src/components/EventCard.vue'
 import { useNotificationMessage } from '@/stores/modules/notificationMessage'
 
+const { t } = useI18n()
+
 const route = useRoute()
 const notificationMsgStore = useNotificationMessage()
 const notificationData = ref({

+ 1 - 1
src/views/SystemSettings/src/components/MonitoringTable/src/MonitoringTable.vue

@@ -223,7 +223,7 @@ onMounted(() => {
               >{{ t('common.cancel') }}</el-button
             >
             <el-button style="width: 100px" type="warning" @click="deleteMoniTable(row)">
-              OK
+              {{ t('common.ok') }}
             </el-button>
           </div>
           <template #reference>

+ 9 - 9
src/views/TemplateManagement/src/components/CreateReportTemplate/src/CreateReportTemplate.vue

@@ -80,15 +80,15 @@ interface Field {
 const fieldsList = ref<Field[]>([])
 const levelOptions = [
   {
-    label: 'Shipment Level',
+    label: t('templateManagement.shipmentLevel'),
     value: 'Shipment Level'
   },
   {
-    label: 'Container Level',
+    label: t('templateManagement.containerLevel'),
     value: 'Container Level'
   },
   {
-    label: 'Item Level',
+    label: t('templateManagement.itemLevel'),
     value: 'Item Level'
   }
 ]
@@ -158,9 +158,7 @@ const handlePageSave = () => {
     !specificRoles.value.groupName?.length &&
     !specificRoles.value.systemAccount?.length
   ) {
-    ElMessage.warning(
-      t('templateManagement.specificRolesRequired')
-    )
+    ElMessage.warning(t('templateManagement.specificRolesRequired'))
     verified = false
   }
   if (!verified) {
@@ -185,10 +183,10 @@ const handlePageSave = () => {
     .saveNewReportTemplate({ ...data, serial_no })
     .then((res: any) => {
       if (res.code === 200) {
-        ElMessage.success(t('templateManagement.createReportTemplate.savedSuccessfully'))
+        ElMessage.success(t('templateManagement.savedSuccessfully'))
         router.push('/template-management')
       } else {
-        ElMessage.error(res.data.msg || t('templateManagement.createReportTemplate.saveFailed'))
+        ElMessage.error(res.data.msg || t('templateManagement.saveFailed'))
       }
     })
     .finally(() => {
@@ -288,7 +286,9 @@ const handlePageSave = () => {
                 <div class="radio-content">
                   <div class="top-options">
                     <p class="label">{{ t('templateManagement.specificRoles') }}</p>
-                    <p class="description">{{ t('templateManagement.specificRolesDescription') }}</p>
+                    <p class="description">
+                      {{ t('templateManagement.specificRolesDescription') }}
+                    </p>
                   </div>
                   <div
                     class="extended-filter"

+ 8 - 2
src/views/TemplateManagement/src/components/TableView/src/TableView.vue

@@ -111,7 +111,12 @@ const handleColumns = (columns: any) => {
 // 获取表格列
 const getTableColumns = async () => {
   tableData.value.columns = [
-    { title: t('common.action'), width: 120, fixed: 'left', slots: { default: 'action' } },
+    {
+      title: t('templateManagement.action'),
+      width: 120,
+      fixed: 'left',
+      slots: { default: 'action' }
+    },
     ...handleColumns(tableColumns)
   ]
   // tableRef.value && autoWidth(tableData.value, tableRef.value)
@@ -139,8 +144,9 @@ const assignTableData = (data: any) => {
   pageInfo.value.total = Number(data.rc) || 0
   isShowDeleteBtn.value = data?.isDelete || false
   const actionColumn = tableData.value.columns.find((item) => {
-    return item.title === 'Action'
+    return item.title === t('templateManagement.action')
   })
+  console.log('actionColumn', t('templateManagement.action'), isShowDeleteBtn.value)
   actionColumn.width = isShowDeleteBtn.value ? 150 : 120
   tableRef.value.loadColumn(tableData.value.columns || [])
 }