Selaa lähdekoodia

feat: 完善多语言硬编码

Jack Zhou 2 viikkoa sitten
vanhempi
commit
0c9ead0e14
30 muutettua tiedostoa jossa 543 lisäystä ja 342 poistoa
  1. 7 7
      src/components/FliterTags/src/FilterTags.vue
  2. 1 1
      src/components/NotificationMessageCard/src/NotificationMessageCard.vue
  3. 13 9
      src/components/NotificationMessageCard/src/components/EventCard.vue
  4. 2 2
      src/components/NotificationMessageCard/src/components/FeatureUpdateCard.vue
  5. 170 100
      src/locales/en.json
  6. 0 3
      src/router/index.ts
  7. 1 0
      src/views/AIApiLog/src/AIApiLog.vue
  8. 12 32
      src/views/AIRobotChat/src/AIRobotChat.vue
  9. 2 2
      src/views/Booking/src/BookingView.vue
  10. 48 6
      src/views/Dashboard/src/components/RecentStatus.vue
  11. 6 3
      src/views/Dashboard/src/components/RevenueChart.vue
  12. 37 13
      src/views/Dashboard/src/components/ScoringSystem.vue
  13. 4 1
      src/views/Dashboard/src/components/TopMap.vue
  14. 21 14
      src/views/DestinationDelivery/src/components/CalendarView.vue
  15. 1 1
      src/views/DestinationDelivery/src/components/ConfiguRations/src/ConfiguRations.vue
  16. 5 2
      src/views/DestinationDelivery/src/components/ConfiguRations/src/components/ConfigurationsTable.vue
  17. 7 6
      src/views/DestinationDelivery/src/components/ConfiguRations/src/components/CreateNewRule.vue
  18. 59 41
      src/views/DestinationDelivery/src/components/CreateNewBooking/src/CreateNewbooking.vue
  19. 12 10
      src/views/DestinationDelivery/src/components/CreateNewBooking/src/components/NewbookingTable.vue
  20. 1 1
      src/views/Login/src/loginView.vue
  21. 17 5
      src/views/MultilingualConfig/src/MultilingualConfig.vue
  22. 2 4
      src/views/MultilingualConfig/src/components/FilterTabs.vue
  23. 5 5
      src/views/Report/src/components/ReportSchedule/src/ReportSchedule.vue
  24. 13 13
      src/views/Report/src/components/ReportSchedule/src/components/EmailConfiguration.vue
  25. 46 26
      src/views/Report/src/components/ReportSchedule/src/components/TimeRange.vue
  26. 17 9
      src/views/SystemMessage/src/components/SystemMessageDetail.vue
  27. 2 2
      src/views/SystemSettings/src/components/CreateNewrule/src/CreateNewrule.vue
  28. 1 1
      src/views/SystemSettings/src/components/MonitoringTable/src/MonitoringTable.vue
  29. 28 21
      src/views/SystemSettings/src/components/PersonalProfile.vue
  30. 3 2
      src/views/Tracking/src/components/TrackingDetail/src/TrackingDetail.vue

+ 7 - 7
src/components/FliterTags/src/FilterTags.vue

@@ -18,13 +18,13 @@ const emits = defineEmits(['tabChange'])
 const getTagLabel = (name: string) => {
   const map = {
     All: t('common.all'),
-    Created: t('filterTags.created'),
-    Confirmed: t('filterTags.confirmed'),
-    Cancelled: t('filterTags.cancelled'),
-    Departed: t('filterTags.departed'),
-    'Cargo Received': t('filterTags.cargoReceived'),
-    Arrived: t('filterTags.arrived'),
-    Completed: t('filterTags.completed')
+    Created: t('common.created'),
+    Confirmed: t('common.confirmed'),
+    Cancelled: t('common.cancelled'),
+    Departed: t('common.departed'),
+    'Cargo Received': t('common.cargoReceived'),
+    Arrived: t('common.arrived'),
+    Completed: t('common.completed')
   }
   return map[name] || name
 }

+ 1 - 1
src/components/NotificationMessageCard/src/NotificationMessageCard.vue

@@ -285,7 +285,7 @@ defineExpose({
     >
       <el-divider v-if="loading"> {{ t('common.loading') }} </el-divider>
       <el-divider v-if="finished && pageData.length > 0">
-        {{ t('notificationMessage.onlyDisplayWithinThreeMonths') }}
+        {{ t('systemMessage.onlyDisplayWithinThreeMonths') }}
       </el-divider>
     </div>
   </div>

+ 13 - 9
src/components/NotificationMessageCard/src/components/EventCard.vue

@@ -83,7 +83,7 @@ const jumpTracking = (data: EventCardPropsData) => {
         class="more-tips"
         v-if="(data.type === 'milestone' || data.type === 'container') && data.numericRecords"
       >
-        <span>{{ t('notificationMessage.latestStatusUpdates', { count: data.numericRecords }) }} </span>
+        <span>{{ t('systemMessage.latestStatusUpdates', { count: data.numericRecords }) }} </span>
         <el-button
           @click="
             handleSeeAll(data, {
@@ -99,17 +99,21 @@ const jumpTracking = (data: EventCardPropsData) => {
       <div class="more-tips" v-if="data.info?.etdOrdeparturNum || data.info?.etaOrarrivalNum">
         <div>
           <span v-if="data.info?.etdOrdeparturNum"
-            >{{ data.type === 'delay' ? t('notificationMessage.departureDelay') : t('notificationMessage.etdChange') }} ({{
-              data.info?.etdOrdeparturNum
-            }})</span
+            >{{
+              data.type === 'delay'
+                ? t('systemMessage.departureDelay')
+                : t('systemMessage.etdChange')
+            }}
+            ({{ data.info?.etdOrdeparturNum }})</span
           >
           <span v-if="data.info?.etdOrdeparturNum && data.info?.etaOrarrivalNum">
             &nbsp;&nbsp;|&nbsp;&nbsp;</span
           >
           <span v-if="data.info?.etaOrarrivalNum">
-            {{ data.type === 'delay' ? t('notificationMessage.arrivalDelay') : t('notificationMessage.etaChange') }} ({{
-              data.info?.etaOrarrivalNum
-            }})
+            {{
+              data.type === 'delay' ? t('systemMessage.arrivalDelay') : t('systemMessage.etaChange')
+            }}
+            ({{ data.info?.etaOrarrivalNum }})
           </span>
         </div>
         <el-button
@@ -146,7 +150,7 @@ const jumpTracking = (data: EventCardPropsData) => {
       </div>
       <div class="route" v-if="data?.info?.route?.length > 0">
         <span class="font_family icon-icon_route_b"></span>
-        <span>{{ t('notificationMessage.route') }}:&nbsp;</span>
+        <span>{{ t('systemMessage.route') }}:&nbsp;</span>
         <template v-for="(item, index) in data.info.route" :key="index">
           <span>{{ item }}</span
           ><span style="margin: 0 3px" v-if="index !== data.info.route.length - 1">→</span>
@@ -155,7 +159,7 @@ const jumpTracking = (data: EventCardPropsData) => {
       <!-- change多程情况中的Leg-->
       <div class="location" v-if="data?.info?.leg?.length > 0">
         <span class="font_family icon-icon_location_b"></span>
-        <span>{{ t('notificationMessage.currentLeg') }}:&nbsp;</span>
+        <span>{{ t('systemMessage.currentLeg') }}:&nbsp;</span>
         <template v-for="(item, index) in data.info.leg" :key="index">
           <span>{{ item }}</span
           ><span style="margin: 0 3px" v-if="index !== data.info.leg.length - 1">→</span>

+ 2 - 2
src/components/NotificationMessageCard/src/components/FeatureUpdateCard.vue

@@ -37,9 +37,9 @@ const handleViewMore = () => {
 
 const handleContent = (header) => {
   if (header === 'New Feature: AI Smart Assistant') {
-    return t('notificationMessage.smartAssistantContent')
+    return t('systemMessage.smartAssistantContent')
   } else {
-    return t('notificationMessage.smartNotificationContent')
+    return t('systemMessage.smartNotificationContent')
   }
 }
 </script>

+ 170 - 100
src/locales/en.json

@@ -25,7 +25,11 @@
     "resetPasswordTitle": "Reset Password",
     "resetPasswordSubtitle": "We'll send your password to your email address.",
     "setYourPassword": "Set Your Password",
+    "tooManyTries": "Oops, too many tries!",
     "helloCreateNewPassword": "Hello {name}, please create a new password for your account.",
+    "passwordAttemptsExceeded": "You have exceeded the maximum number of password attempts.",
+    "tryAgainInFiveMinutesOrReset": "Please try again in 5 minutes or click {action} to reset.",
+    "forgetPassword": "Forget Password",
     "userName": "User Name",
     "emailAddress": "Email Address",
     "sendResetLink": "Send Reset Link",
@@ -56,6 +60,7 @@
     "accountActivatedSuccessfullyLine1": "Your account has been successfully activated.",
     "accountActivatedSuccessfullyLine2": "You can now log in using your email and the password you just created.",
     "goToLogin": "Go to Login",
+    "invalidToken": "Invalid token",
     "pleaseLoginFirst": "Please login first"
   },
   "common": {
@@ -79,10 +84,6 @@
     "all": "All",
     "update": "Update",
     "prompt": "Prompt",
-    "forgetPassword": "Forget Password",
-    "tooManyTries": "Oops, too many tries!",
-    "passwordAttemptsExceeded": "You have exceeded the maximum number of password attempts.",
-    "tryAgainInFiveMinutesOrReset": "Please try again in 5 minutes or click {action} to reset.",
     "logout": "Logout",
     "clearFilters": "Clear Filters",
     "downloadFile": "Download File",
@@ -92,7 +93,6 @@
     "requestFailedRetry": "The request failed. Please try again later",
     "errorPleaseTryAgainLater": "Error! Please try again later.",
     "copySuccess": "Copy success",
-    "invalidToken": "Invalid token",
     "details": "Details",
     "description": "Description",
     "userType": "User Type",
@@ -115,8 +115,6 @@
     "responseDuration": "Response Duration",
     "schedule": "Schedule",
     "failedToLoadOptions": "Failed to load options",
-    "stations": "Stations",
-    "bookingWindow": "Booking Window",
     "operation": "Operation",
     "configureRegionsAndTimeSlots": "Configure available destination delivery regions and time slots.",
     "deleteRule": "Delete Rule",
@@ -169,7 +167,16 @@
     "noResultsFound": "No Results Found",
     "emptyResultLine1": "We didn't find any search results,",
     "emptyResultLine2": "please try to adjust your search keywords.",
-    "pageGuide": "Page Guide"
+    "pageGuide": "Page Guide",
+    "created": "Created",
+    "modified": "Modified",
+    "pending": "Pending",
+    "confirmed": "Confirmed",
+    "cancelled": "Cancelled",
+    "departed": "Departed",
+    "cargoReceived": "Cargo Received",
+    "arrived": "Arrived",
+    "completed": "Completed"
   },
   "tracking": {
     "title": "Tracking",
@@ -305,7 +312,17 @@
     "milestoneUpdate": "Milestone Update",
     "containerStatusUpdate": "Container Status Update",
     "departureArrivalDelay": "Departure/Arrival Delay",
-    "etdEtaChange": "ETD/ETA Change"
+    "etdEtaChange": "ETD/ETA Change",
+    "latestStatusUpdates": "Latest Status Updates ({count})",
+    "departureDelay": "Departure Delay",
+    "etdChange": "ETD Change",
+    "arrivalDelay": "Arrival Delay",
+    "etaChange": "ETA Change",
+    "route": "Route",
+    "currentLeg": "Current Leg",
+    "onlyDisplayWithinThreeMonths": "Only display the message data within three months",
+    "smartAssistantContent": "Smart Assistant is live! Ask in natural language, get real-time shipment data with multi-language support.",
+    "smartNotificationContent": "Smart Notification is here! Four key event alerts with customizable rules and multi-channel delivery."
   },
   "layout": {
     "logoutConfirm": "Are you sure you want to logout?",
@@ -322,6 +339,7 @@
     "viewAsCustomer": "View as Customer",
     "selectCustomer": "Select customer",
     "noData": "no data",
+    "passwordMismatch": "The password does not match. Please try again.",
     "passwordExpiredUnavailable": "This account's password has expired and is currently unavailable. Please select a different customer account to continue.",
     "accountNotActivated": "This account has not been activated yet. Please select a different customer account to continue.",
     "accountDisabled": "This account has been disabled and is no longer accessible. Please select a different customer account to continue.",
@@ -373,7 +391,47 @@
     "onlyExecuteInSpecifiedPeriodTip": "Only automatically execute during specified time period.",
     "effectiveStartDate": "Effective Start Date",
     "effectiveEndDate": "Effective End Date",
-    "pickDate": "Pick a Date"
+    "pickDate": "Pick a Date",
+    "scheduleConfiguration": "Schedule Configuration - {name}",
+    "scheduleRuleValidityPeriod": "Schedule Rule Validity Period",
+    "reportDataTimeRange": "Report Data Time Range",
+    "reportDeliveryFrequencyEmail": "Report Delivery Frequency & Email Configuration",
+    "selectReportDeliveryFrequencyEmailConfig": "Please select the Report Delivery Frequency & Email Configuration",
+    "emailRecipientsPlaceholder": "Enter email address separated by commas",
+    "saveSuccess": "Save Success",
+    "selectReportDataTimeRange": "Please select the Report Data Time Range",
+    "dataTimeReferenceFieldTitle": "Data Time Reference Field Selection",
+    "dataRangeMethodTitle": "Data Range Configuration Method",
+    "dynamicRollingRange": "Dynamic Rolling Range",
+    "fixedRange": "Fixed Range",
+    "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.",
+    "fixedRangeTooltipLine2": "Example: Start date [2025-01-01], End date [2025-12-31]",
+    "thisMonth": "This Month",
+    "thisQuarter": "This Quarter",
+    "lastQuarter": "Last Quarter",
+    "lastYear": "Last Year"
   },
   "templateManagement": {
     "title": "Report Template Management",
@@ -422,71 +480,6 @@
     "cancel": "Cancel",
     "apply": "Apply"
   },
-  "reportSchedule": {
-    "scheduleConfiguration": "Schedule Configuration - {name}",
-    "scheduleRuleValidityPeriod": "Schedule Rule Validity Period",
-    "reportDataTimeRange": "Report Data Time Range",
-    "reportDeliveryFrequencyEmail": "Report Delivery Frequency & Email Configuration",
-    "selectReportDeliveryFrequencyEmailConfig": "Please select the Report Delivery Frequency & Email Configuration",
-    "emailRecipientsPlaceholder": "Enter email address separated by commas",
-    "saveSuccess": "Save Success",
-    "selectReportDataTimeRange": "Please select the Report Data Time Range",
-    "dataTimeReferenceFieldTitle": "Data Time Reference Field Selection",
-    "dataRangeMethodTitle": "Data Range Configuration Method",
-    "dynamicRollingRange": "Dynamic Rolling Range",
-    "fixedRange": "Fixed Range",
-    "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.",
-    "fixedRangeTooltipLine2": "Example: Start date [2025-01-01], End date [2025-12-31]",
-    "thisMonth": "This Month",
-    "thisQuarter": "This Quarter",
-    "lastQuarter": "Last Quarter",
-    "lastYear": "Last Year"
-  },
-  "personalProfile": {
-    "basicInformation": "Basic Information",
-    "firstName": "First Name",
-    "lastName": "Last Name",
-    "email": "Email",
-    "password": "Password",
-    "passwordExpirePrefix": "Your password will be expire in",
-    "passwordExpireDays": "{n} day(s)",
-    "maskCustomerInformation": "Mask Customer Information",
-    "yes": "Yes",
-    "no": "No",
-    "saveSuccessfully": "Save successfully",
-    "saveFailed": "Save failed",
-    "personalPreferences": "Personal Preferences",
-    "dateAndTime": "Date & Time",
-    "numbersFormatNav": "Numbers Format",
-    "dateFormat": "Date Format",
-    "numbersFormat": "Numbers Format",
-    "numbersUsUk": "1,234.56 (US/UK)",
-    "numbersEuropean": "1.234,56 (European)"
-  },
   "aiApiLog": {
     "title": "AI API Log",
     "searchPlaceholder": "Search Request ID, Question ID",
@@ -626,6 +619,22 @@
     "typeYourQuestionHere": "Type your question here...",
     "contentGeneratedByAI": "Content is generated by Al, please check carefully!",
     "importantNoticeAI": "Important Notice: AI-Generated Content",
+    "thinkingAboutQuestion": "Thinking about your question...",
+    "searchingRelevantDataPleaseWait": "Searching for relevant data, please wait...",
+    "queryIsComplexMayTakeMoreTime": "This query is complex and may take more time",
+    "trySimplifyingQuestionOrSelectingFaq": "You may try simplifying your question or selecting a Frequently Asked Question",
+    "queryFailedPleaseTryAgainLaterOrSelectFaq": "Sorry, the query failed. Please try again later or select a Frequently Asked Question",
+    "youHaveStoppedThisAnswer": "You have stopped this answer",
+    "disclaimerParagraph1": "This chat assistant is powered by artificial intelligence (AI) and is designed to help you access information and answer your queries efficiently. Please be aware of the following:",
+    "disclaimerBullet1Title": "• AI-Generated Responses: ",
+    "disclaimerBullet1Text": "All responses are automatically generated by AI. While we strive for accuracy, errors or inaccuracies may occur. Please verify critical information independently before making business decisions.",
+    "disclaimerBullet2Title": "• Data Privacy & Security:",
+    "disclaimerBullet2Text": "You can only access shipment data within your authorized account permissions. Your data remains confidential and will not be shared with other users or third parties.",
+    "disclaimerBullet3Title": "• Information Accuracy: ",
+    "disclaimerBullet3Text": "For critical business decisions or time-sensitive matters, we recommend contacting our customer service team directly for verification.",
+    "disclaimerBullet4Title": "• Service Limitations: ",
+    "disclaimerBullet4Text": "This assistant provides general guidance and data queries. For complex or specialized requests, please reach out to our support team.",
+    "disclaimerParagraph2": "By using this AI assistant, you acknowledge these limitations and agree to use the information provided accordingly.",
     "aiGeneratedResponses": "AI-Generated Responses:",
     "dataPrivacySecurity": "Data Privacy & Security:",
     "informationAccuracy": "Information Accuracy:",
@@ -639,18 +648,7 @@
     "container": "Container",
     "trackingOnCarrierWebsite": "Tracking on carrier website:"
   },
-  "notificationMessage": {
-    "latestStatusUpdates": "Latest Status Updates ({count})",
-    "departureDelay": "Departure Delay",
-    "etdChange": "ETD Change",
-    "arrivalDelay": "Arrival Delay",
-    "etaChange": "ETA Change",
-    "route": "Route",
-    "currentLeg": "Current Leg",
-    "onlyDisplayWithinThreeMonths": "Only display the message data within three months",
-    "smartAssistantContent": "Smart Assistant is live! Ask in natural language, get real-time shipment data with multi-language support.",
-    "smartNotificationContent": "Smart Notification is here! Four key event alerts with customizable rules and multi-channel delivery."
-  },
+  
   "vbox": {
     "moveToTop": "Move to Top",
     "moveUp": "Move Up",
@@ -713,17 +711,6 @@
     "satisfied": "Satisfied",
     "highlySatisfied": "Highly Satisfied"
   },
-  "filterTags": {
-    "created": "Created",
-    "modified": "Modified",
-    "pending": "Pending",
-    "confirmed": "Confirmed",
-    "cancelled": "Cancelled",
-    "departed": "Departed",
-    "cargoReceived": "Cargo Received",
-    "arrived": "Arrived",
-    "completed": "Completed"
-  },
   "dateRange": {
     "startEtaTime": "Start ETA Time",
     "endEtaTime": "End ETA Time",
@@ -753,7 +740,47 @@
     "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?",
+    "event": "Event",
+    "eventDetails": "Event Details",
+    "frequency": "Frequency",
+    "methods": "Methods",
+    "hbolHawb": "HBOL/HAWB",
+    "shipper": "Shipper",
+    "consignee": "Consignee",
+    "etd": "ETD",
+    "recentMilestone": "Recent Milestone",
+    "createNewRule": "Create New Rule",
+    "unsavedChanges": "You have unsaved changes.",
+    "confirmLeavePage": "Are you sure you want to leave this page?",
+    "unsavedChangesTitle": "Unsaved Changes",
+    "notificationEvents": "Notification Events",
+    "selectEventPlaceholder": "Select event",
+    "setting": "Setting",
+    "pleaseSelectNotificationEventsFirst": "Please select Notification Events first",
+    "shipmentRange": "Shipment Range",
+    "customizeYourShipmentTrackingPreferences": "Customize your shipment tracking preferences.",
+    "basicInformation": "Basic Information",
+    "firstName": "First Name",
+    "lastName": "Last Name",
+    "email": "Email",
+    "password": "Password",
+    "passwordExpirePrefix": "Your password will be expire in",
+    "passwordExpireDays": "{n} day(s)",
+    "maskCustomerInformation": "Mask Customer Information",
+    "yes": "Yes",
+    "no": "No",
+    "saveSuccessfully": "Save successfully",
+    "saveFailed": "Save failed",
+    "personalPreferences": "Personal Preferences",
+    "dateAndTime": "Date & Time",
+    "numbersFormatNav": "Numbers Format",
+    "dateFormat": "Date Format",
+    "numbersFormat": "Numbers Format",
+    "numbersUsUk": "1,234.56 (US/UK)",
+    "numbersEuropean": "1.234,56 (European)"
   },
  
   "dashboard": {
@@ -776,6 +803,7 @@
     "recentStatusTip": "Recent Status: Active shipment list with ETD within the past three months and the next month.",
     "revenueSpentTip": "Revenue Spent: Based on the billto object, display the corresponding revenue data.",
     "revenueSpentTitle": "Revenue Spent",
+    "resetZoom": "Reset Zoom",
     "departure": "Departure",
     "arrival": "Arrival",
     "satisfactionQuestionWithSpace": "Satisfaction Question ",
@@ -793,6 +821,11 @@
     "neutral": "Neutral",
     "satisfied": "Satisfied",
     "highlySatisfied": "Highly satisfied",
+    "functionality": "Functionality",
+    "dataAccuracy": "Data accuracy",
+    "lookAndFeel": "Look and feel",
+    "easeOfUse": "Ease of use",
+    "websitePerformance": "Website performance",
     "satisfactionDetailsQuestion": "Would you like to share more details with us?",
     "previous": "Previous",
     "submit": "Submit",
@@ -819,6 +852,8 @@
     "total": "Total",
     "transportMode": "Transport Mode",
     "shipmentStatus": "Shipment Status",
+    "bookingListEmptyTipLine1": "We support the following references number to find booking:",
+    "bookingListEmptyTip2": "Booking No./HAWB No./MAWB No./PO No./Carrier Booking No./Contract No./File No./Quote No.",
     "etd": "ETD",
     "textSearch": "text search",
     "clearFilters": "Clear Filters",
@@ -874,7 +909,8 @@
     "guideDashboardDrag": "Drag the icon to rearrange the report cards on the dashboard.",
     "guideDashboardSaveLayout": "Click \"Save Layout\" to preserve your customized report arrangement.",
     "openInNewTab": "Open in New Tab",
-    "customizeColumnsTip": "Drag item over to this selection or click \"add\" icon to show the column on your booking list",
+   
+    
     "tdReferenceType": "Reference Type",
     "tdAction": "Action"
   },
@@ -904,11 +940,44 @@
     "enterPostalCode": "Enter postal code",
     "contactNamePlaceholder": "Name",
     "contactMobilePlaceholder": "Mobile Numer",
+    "jan": "Jan",
+    "feb": "Feb",
+    "mar": "Mar",
+    "apr": "Apr",
+    "may": "May",
+    "jun": "Jun",
+    "jul": "Jul",
+    "aug": "Aug",
+    "sep": "Sep",
+    "oct": "Oct",
+    "nov": "Nov",
+    "dec": "Dec",
     "deliveryDate": "Delivery Date",
     "deliveryMode": "Delivery Mode",
     "creationDate": "Creation Date",
     "searchQuestionPlaceholder": "Search Question Booking No, HBOL No, MBL No, Container No, Consignee",
+    "stations": "Stations",
+    "bookingWindow": "Booking Window",
     "communication": "Communication",
+    "result": "result",
+    "customizeColumns": "Customize Columns",
+    "serviceNotActivatedYet": "This service isn't activated yet. Please contact our team to enable it.",
+    "noEligibleShipmentsFoundToCreateNewBooking": "No eligible shipments found to create a new booking.",
+    "customizeColumnsTip": "Drag item over to this selection or click \"add\" icon to show the column on your booking list",
+    "manageAddress": "Manage Address",
+    "address": "Address",
+    "maximumCharacterLimitReached": "Maximum character limit reached (45 characters)",
+    "countryCode": "Country Code",
+    "cityCode": "City Code",
+    "postalCode": "Postal Code",
+    "contactInformation": "Contact Information",
+    "contactPerson": "Contact Person",
+    "contactNumber": "Contact Number",
+    "saveAddress": "Save Address",
+    "savedSuccessfully": "Saved successfully",
+    "unsavedChangesMessageLine1": "You have unsaved changes.",
+    "unsavedChangesMessageLine2": "Are you sure you want to leave this page?",
+    "hobl": "HOBL",
     "communicateWithUs": "Communicate with us",
     "separatedBySemicolon": "Separated by ;",
     "sendEmail": "Send Email",
@@ -978,6 +1047,7 @@
     "savingSuccess": "Saving successful",
     "air": "Air",
     "sea": "Sea",
+    "ctns": "ctns",
     "priority": "Priority",
     "ruleType": "Rule Type",
     "port": "Port",

+ 0 - 3
src/router/index.ts

@@ -188,9 +188,6 @@ const router = createRouter({
           path: '/multilingual-config',
           name: 'Multilingual Config',
           component: () => import('../views/MultilingualConfig'),
-          meta: {
-            activeMenu: '/system-settings'
-          }
         },
         {
           path: '/destination-delivery',

+ 1 - 0
src/views/AIApiLog/src/AIApiLog.vue

@@ -173,6 +173,7 @@ const DateChange = (date: any) => {
     height: 32px;
   }
 }
+
 .date-tips_filter {
   flex: 1;
   max-width: 250px;

+ 12 - 32
src/views/AIRobotChat/src/AIRobotChat.vue

@@ -90,12 +90,12 @@ const queryTime = ref(-1)
 // 当前用户问题回复进度
 const progressStatus = {
   init: t('aiRobot.continueConversation'),
-  '0': 'Thinking about your question...',
-  '15': 'Searching for relevant data, please wait...',
-  '30': 'This query is complex and may take more time',
-  '60': 'You may try simplifying your question or selecting a Frequently Asked Question',
-  '120': 'Sorry, the query failed. Please try again later or select a Frequently Asked Question',
-  cancel: 'You have stopped this answer'
+  '0': t('aiRobot.thinkingAboutQuestion'),
+  '15': t('aiRobot.searchingRelevantDataPleaseWait'),
+  '30': t('aiRobot.queryIsComplexMayTakeMoreTime'),
+  '60': t('aiRobot.trySimplifyingQuestionOrSelectingFaq'),
+  '120': t('aiRobot.queryFailedPleaseTryAgainLaterOrSelectFaq'),
+  cancel: t('aiRobot.youHaveStoppedThisAnswer')
 }
 
 const isShowTips = ref(false) // 是否展示提示信息
@@ -520,32 +520,12 @@ defineExpose({
       >
         {{ t('aiRobot.importantNoticeAI') }}
       </div>
-      <p>
-        This chat assistant is powered by artificial intelligence (AI) and is designed to help you
-        access information and answer your queries efficiently. Please be aware of the following:
-      </p>
-      <p>
-        <strong>• AI-Generated Responses: </strong>All responses are automatically generated by AI.
-        While we strive for accuracy, errors or inaccuracies may occur. Please verify critical
-        information independently before making business decisions.
-      </p>
-      <p>
-        <strong>• Data Privacy & Security:</strong> You can only access shipment data within your
-        authorized account permissions. Your data remains confidential and will not be shared with
-        other users or third parties.
-      </p>
-      <p>
-        <strong>• Information Accuracy: </strong> For critical business decisions or time-sensitive
-        matters, we recommend contacting our customer service team directly for verification.
-      </p>
-      <p>
-        <strong>• Service Limitations: </strong> This assistant provides general guidance and data
-        queries. For complex or specialized requests, please reach out to our support team.
-      </p>
-      <p>
-        By using this AI assistant, you acknowledge these limitations and agree to use the
-        information provided accordingly.
-      </p>
+      <p>{{ t('aiRobot.disclaimerParagraph1') }}</p>
+      <p><strong>{{ t('aiRobot.disclaimerBullet1Title') }}</strong>{{ t('aiRobot.disclaimerBullet1Text') }}</p>
+      <p><strong>{{ t('aiRobot.disclaimerBullet2Title') }}</strong>{{ t('aiRobot.disclaimerBullet2Text') }}</p>
+      <p><strong>{{ t('aiRobot.disclaimerBullet3Title') }}</strong>{{ t('aiRobot.disclaimerBullet3Text') }}</p>
+      <p><strong>{{ t('aiRobot.disclaimerBullet4Title') }}</strong>{{ t('aiRobot.disclaimerBullet4Text') }}</p>
+      <p>{{ t('aiRobot.disclaimerParagraph2') }}</p>
     </el-dialog>
   </div>
 </template>

+ 2 - 2
src/views/Booking/src/BookingView.vue

@@ -144,7 +144,7 @@ const tabChange = (changeTabList: any) => {
   tabList.value = changeTabList
   const checkedTabNames = tabList.value.filter((item) => item.checked).map((item) => item.name)
   filtersStore.updateFilter({
-    title: 'Shipment Status',
+    title: t('booking.shipmentStatus'),
     value: checkedTabNames,
     keyType: 'array',
     key: 'filterTag'
@@ -155,7 +155,7 @@ const tabChange = (changeTabList: any) => {
 // 点击search按钮
 const SearchInput = () => {
   filtersStore.updateFilter({
-    title: 'text search',
+    title: t('booking.textSearch'),
     value: textSearch.value,
     keyType: 'normal',
     key: '_textSearch',

+ 48 - 6
src/views/Dashboard/src/components/RecentStatus.vue

@@ -6,6 +6,44 @@ import { formatTimezoneByUTCorGMT, formatTimezone } from '@/utils/tools'
 const { t } = useI18n()
 
 const router = useRouter()
+
+type VTagType =
+  | 'Confirmed'
+  | 'Cancelled'
+  | 'Created'
+  | 'Booked'
+  | 'Cargo Received'
+  | 'Departure'
+  | 'Arrived'
+  | 'Completed'
+  | 'Departed'
+  | 'Pending Approval'
+  | 'Approved'
+  | 'Rejected'
+  | 'Active'
+  | 'Inactive'
+
+const V_TAG_TYPES = new Set<VTagType>([
+  'Confirmed',
+  'Cancelled',
+  'Created',
+  'Booked',
+  'Cargo Received',
+  'Departure',
+  'Arrived',
+  'Completed',
+  'Departed',
+  'Pending Approval',
+  'Approved',
+  'Rejected',
+  'Active',
+  'Inactive'
+])
+
+const asVTagType = (val: string): VTagType | undefined => {
+  return V_TAG_TYPES.has(val as VTagType) ? (val as VTagType) : undefined
+}
+
 interface RecentItem {
   Title: string
   name: string
@@ -81,7 +119,7 @@ const SubscribeShipments = (val: any) => {
         <div class="recent-title" @click="RouteToDetail(item)">{{ item.Title }}</div>
         <div class="recent-name">{{ item.name }}</div>
         <div class="recent-booking">
-          {{ t('dashboard.bookingNo') }}
+          {{ t('booking.bookingNo') }}:
           <span>{{ item.bookingNumber }}</span>
         </div>
       </div>
@@ -109,10 +147,10 @@ const SubscribeShipments = (val: any) => {
       <!-- 左 -->
       <div class="recent-content-left">
         <div class="left_title">
-          {{ t('common.shipper') }}: <span class="left_text">{{ item.shipperName }}</span>
+          {{ t('booking.shipper') }}: <span class="left_text">{{ item.shipperName }}</span>
         </div>
         <div class="left_title">
-          {{ t('common.consignee') }}: <span class="left_text">{{ item.consigneeName }}</span>
+          {{ t('booking.consignee') }}: <span class="left_text">{{ item.consigneeName }}</span>
         </div>
       </div>
       <!-- 中 -->
@@ -126,7 +164,9 @@ const SubscribeShipments = (val: any) => {
             </span>
             {{ item.startStation }}
           </div>
-          <div class="startStation_time">{{ t('tracking.etd') }}: {{ formatTimezone(item.ETD) }}</div>
+          <div class="startStation_time">
+            {{ t('tracking.etd') }}: {{ formatTimezone(item.ETD) }}
+          </div>
         </div>
         <div class="StationIcon">
           <div>
@@ -147,12 +187,14 @@ const SubscribeShipments = (val: any) => {
             </span>
             {{ item.endStation }}
           </div>
-          <div class="startStation_time">{{ t('tracking.eta') }}: {{ formatTimezone(item.ETA) }}</div>
+          <div class="startStation_time">
+            {{ t('tracking.eta') }}: {{ formatTimezone(item.ETA) }}
+          </div>
         </div>
       </div>
       <!-- 右 -->
       <div class="recent-content-right">
-        <VTag :type="item.type" style="margin-bottom: 4px">{{ item.type }}</VTag>
+        <VTag :type="asVTagType(item.type)" style="margin-bottom: 4px">{{ item.type }}</VTag>
         <div class="right_text">{{ item.Arrived }}</div>
         <div class="startStation_time" v-if="item.Time != null">
           {{ formatTimezoneByUTCorGMT(item.Time, item.timezone) }}&nbsp;&nbsp;{{ item.timezone }}

+ 6 - 3
src/views/Dashboard/src/components/RevenueChart.vue

@@ -212,7 +212,9 @@ const initOption = reactive({
       allnum = allnum.toFixed(2)
       str +=
         '<div style= ' +
-        'color:#FFF;font-family: Lato-Light>Total: ' +
+        'color:#FFF;font-family: Lato-Light>' +
+        t('common.total') +
+        ': ' +
         formatNumber(allnum) +
         '</div>'
       return str
@@ -298,7 +300,7 @@ const initOption = reactive({
       saveAsImage: {
         icon: 'path://M588.8 830.976H179.52a48 48 0 0 1-48-48v-110.72l212.032-120.96 117.76 67.2a16 16 0 0 0 15.744 0.128l396.16-220.8-0.192-0.256h0.384v-156.8c0-44.16-35.84-80-80-80H179.52c-44.16 0-80 35.84-80 80v542.208c0 44.16 35.84 80 80 80H588.8v-32zM131.52 240.832a48 48 0 0 1 48-48h613.888a48 48 0 0 1 48 48V378.88L469.312 586.24l-117.76-67.2a16.128 16.128 0 0 0-12.032-1.664l-3.84 1.6-204.16 116.48V240.896zM309.632 467.2a85.76 85.76 0 0 0 85.376-76.992l0.384-8.768c0-44.416-33.728-80.96-76.992-85.376L309.76 295.68c-47.36 0-85.824 38.4-85.824 85.76l0.448 8.832A85.76 85.76 0 0 0 300.8 466.816l8.832 0.448z m0-32a53.76 53.76 0 1 1 0-107.584 53.76 53.76 0 0 1 0 107.52z m452.736 423.04a16 16 0 0 0 22.592 0l138.368-138.368-22.592-22.656-111.104 111.104V545.6h-32v262.784l-111.04-111.104-22.592 22.656 138.368 138.368z',
         show: true,
-        name: 'Revenue Spent',
+        name: t('dashboard.revenueSpentTitle'),
         pixelRatio: 2
       },
       myTool1: {
@@ -309,7 +311,8 @@ const initOption = reactive({
           'M560.384 115.392a16.064 16.064 0 0 1 13.056 4.608l257.216 257.216c1.92 1.92 3.136 4.288 3.84 6.784h0.832v118.72h-32V404.48H626.112c-44.16 0-80-35.84-80-80V147.2H230.208a48 48 0 0 0-48 48v672c0 26.56 21.504 48 48 48h341.504v32H230.208c-44.16 0-80-35.776-80-80V195.2c0-44.16 35.84-80 80-80h330.24v0.192z m232.768 495.296v281.984l119.872-119.872 22.592 22.656-147.072 147.2a16.064 16.064 0 0 1-22.656 0l-147.2-147.2 22.656-22.656 119.808 119.872V610.688h32zM427.648 476.352c2.496 0 4.224 0.448 5.312 1.216a8.96 8.96 0 0 1 3.072 3.84L474.24 565.12a48.256 48.256 0 0 1 1.792-3.2c0.64-1.152 1.344-2.24 2.112-3.392l53.952-76.736a13.76 13.76 0 0 1 3.648-4.032 9.152 9.152 0 0 1 4.864-1.28h37.76L498.432 583.04l59.712 125.824h-32.64a7.872 7.872 0 0 1-5.76-2.112 15.936 15.936 0 0 1-3.264-4.48l-43.52-97.088a42.112 42.112 0 0 1-3.2 5.376l-64.768 91.648a14.208 14.208 0 0 1-5.312 5.248 13.952 13.952 0 0 1-6.272 1.408h-36.352L448 584.768l-53.248-108.416h32.96zM578.112 324.48c0 26.496 21.504 48 48 48h154.56L578.176 169.92V324.48z',
         onclick: function () {
           let filename =
-            'Revenue Spent Details ' +
+            t('dashboard.revenueSpentTitle') +
+            ' Details ' +
             barName.value[0] +
             '-' +
             barName.value[barName.value.length - 1]

+ 37 - 13
src/views/Dashboard/src/components/ScoringSystem.vue

@@ -134,23 +134,47 @@ smileAspects.value = [
     radio: ''
   },
   {
-    title: 'Data accuracy',
-    proposal: ['Highly Dissatisfied', 'Dissatisfied', 'Neutral', 'Satisfied', 'Highly Satisfied'],
+    title: t('dashboard.dataAccuracy'),
+    proposal: [
+      t('dashboard.highlyDissatisfied'),
+      t('dashboard.dissatisfied'),
+      t('dashboard.neutral'),
+      t('dashboard.satisfied'),
+      t('dashboard.highlySatisfied')
+    ],
     radio: ''
   },
   {
-    title: 'Look and feel',
-    proposal: ['Highly Dissatisfied', 'Dissatisfied', 'Neutral', 'Satisfied', 'Highly Satisfied'],
+    title: t('dashboard.lookAndFeel'),
+    proposal: [
+      t('dashboard.highlyDissatisfied'),
+      t('dashboard.dissatisfied'),
+      t('dashboard.neutral'),
+      t('dashboard.satisfied'),
+      t('dashboard.highlySatisfied')
+    ],
     radio: ''
   },
   {
-    title: 'Ease of use',
-    proposal: ['Highly Dissatisfied', 'Dissatisfied', 'Neutral', 'Satisfied', 'Highly Satisfied'],
+    title: t('dashboard.easeOfUse'),
+    proposal: [
+      t('dashboard.highlyDissatisfied'),
+      t('dashboard.dissatisfied'),
+      t('dashboard.neutral'),
+      t('dashboard.satisfied'),
+      t('dashboard.highlySatisfied')
+    ],
     radio: ''
   },
   {
-    title: 'Website performance',
-    proposal: ['Highly Dissatisfied', 'Dissatisfied', 'Neutral', 'Satisfied', 'Highly Satisfied'],
+    title: t('dashboard.websitePerformance'),
+    proposal: [
+      t('dashboard.highlyDissatisfied'),
+      t('dashboard.dissatisfied'),
+      t('dashboard.neutral'),
+      t('dashboard.satisfied'),
+      t('dashboard.highlySatisfied')
+    ],
     radio: ''
   }
 ]
@@ -192,23 +216,23 @@ const OpenScoring = (item: any) => {
   InnerTitle.value = item.itemtext
   InnerTileQues.value = item.proposal
   if (item.expression == 'angry') {
-    SubmitText.value = 'Apologize once again for your experience.'
+    SubmitText.value = t('dashboard.apologizeAgain')
     checkexpression.value = 'angry'
     isShowAngry.value = true
   } else if (item.expression == 'sad') {
-    SubmitText.value = 'Apologize once again for your experience.'
+    SubmitText.value = t('dashboard.apologizeAgain')
     checkexpression.value = 'sad'
     isShowAngry.value = true
   } else if (item.expression == 'smile') {
-    SubmitText.value = 'We greatly appreciate your valuable time and feedback.'
+    SubmitText.value = t('dashboard.appreciateFeedback')
     checkexpression.value = 'smile'
     isShowSmile.value = true
   } else if (item.expression == 'hhh') {
-    SubmitText.value = 'Once again, thank you for your positive evaluation.'
+    SubmitText.value = t('dashboard.thankYouPositive')
     checkexpression.value = 'hhh'
     isShowHappy.value = true
   } else if (item.expression == 'happy') {
-    SubmitText.value = 'Once again, thank you for your positive evaluation.'
+    SubmitText.value = t('dashboard.thankYouPositive')
     checkexpression.value = 'happy'
     isShowHappy.value = true
   }

+ 4 - 1
src/views/Dashboard/src/components/TopMap.vue

@@ -4,6 +4,9 @@ import OriginIcon from '../image/hhh_2.png'
 import L from 'leaflet'
 import { useThemeStore } from '@/stores/modules/theme'
 import { formatNumber } from '@/utils/tools'
+import { useI18n } from 'vue-i18n'
+
+const { t } = useI18n()
 
 const themeStore = useThemeStore()
 const MapDataList = ref([])
@@ -39,7 +42,7 @@ const addResetZoomButton = (center: L.LatLng, zoom: number) => {
       // 创建重置缩放按钮
       const resetZoomButton = L.DomUtil.create('a', 'reset-zoom-button leaflet-bar-part', container)
       resetZoomButton.href = '#'
-      resetZoomButton.title = 'Reset Zoom'
+      resetZoomButton.title = t('dashboard.resetZoom')
       resetZoomButton.innerHTML = `<div class="outer-ring" style="height: 100%; padding: 4px;border: 1px solid #2b2f36;border-radius: 50%;">
         <div class="inner-ring" style=" height: 100%; width: 100%; background-color: #2b2f36; border-radius: 50%;"></div>
         </div>`

+ 21 - 14
src/views/DestinationDelivery/src/components/CalendarView.vue

@@ -9,6 +9,7 @@ import CalendarTagDetailDialog from './CalendarTagDetailDialog.vue'
 import { useUserStore } from '@/stores/modules/user'
 import { debounce } from 'lodash'
 import axios from 'axios'
+import DestinationDelivery from '../DestinationDelivery.vue'
 
 const userStore = useUserStore()
 
@@ -193,18 +194,18 @@ const test = () => {
             <a-select-option v-for="m in 12" :key="m" :value="m">
               {{
                 [
-                  t('common.jan'),
-                  t('common.feb'),
-                  t('common.mar'),
-                  t('common.apr'),
-                  t('common.may'),
-                  t('common.jun'),
-                  t('common.jul'),
-                  t('common.aug'),
-                  t('common.sep'),
-                  t('common.oct'),
-                  t('common.nov'),
-                  t('common.dec')
+                  t('destinationDelivery.jan'),
+                  t('destinationDelivery.feb'),
+                  t('destinationDelivery.mar'),
+                  t('destinationDelivery.apr'),
+                  t('destinationDelivery.may'),
+                  t('destinationDelivery.jun'),
+                  t('destinationDelivery.jul'),
+                  t('destinationDelivery.aug'),
+                  t('destinationDelivery.sep'),
+                  t('destinationDelivery.oct'),
+                  t('destinationDelivery.nov'),
+                  t('destinationDelivery.dec')
                 ][m - 1]
               }}
             </a-select-option>
@@ -284,9 +285,15 @@ const test = () => {
               <!-- <div class="label">Destination Booking</div> -->
               <div class="tag-style">
                 <span class="font_family icon-icon_booking_order_b" style="font-size: 12px"></span>
-                <span class="type">{{ getDataByDate(current, 'bookingNumber') }} {{ t('destinationDelivery.bookings') }}</span>
+                <span class="type"
+                  >{{ getDataByDate(current, 'bookingNumber') }}
+                  {{ t('destinationDelivery.bookings') }}</span
+                >
                 <div class="grid-lines"></div>
-                <span class="ctns-tag">{{ getDataByDate(current, 'bookingCtns') }} ctns</span>
+                <span class="ctns-tag"
+                  >{{ getDataByDate(current, 'bookingCtns') }}
+                  {{ t('destinationDelivery.ctns') }}</span
+                >
               </div>
               <div class="list">
                 <div class="item" v-for="size in getDataByDate(current, 'ctnrSize')">

+ 1 - 1
src/views/DestinationDelivery/src/components/ConfiguRations/src/ConfiguRations.vue

@@ -8,7 +8,7 @@ const filterRef: Ref<HTMLElement | null> = ref(null)
 const router = useRouter()
 const { t } = useI18n()
 
-const AddRulesTableColumns = ref([
+const AddRulesTableColumns: any = ref([
   {
     field: 'country',
     title: t('common.country'),

+ 5 - 2
src/views/DestinationDelivery/src/components/ConfiguRations/src/components/ConfigurationsTable.vue

@@ -173,11 +173,14 @@ onMounted(() => {
           </div>
           <p class="delete_content">{{ t('destinationDelivery.confirmDeleteRule') }}</p>
           <div style="text-align: right; margin: 0; padding: 8px">
-            <el-button style="width: 100px" class="el-button--default" @click="row.visible = false"
+            <el-button
+              style="width: 100px"
+              class="el-button--default"
+              @click="row.visible = false"
               >{{ t('common.cancel') }}</el-button
             >
             <el-button style="width: 100px" type="warning" @click="deleteMoniTable(row)">
-              OK
+              {{ t('common.ok') }}
             </el-button>
           </div>
           <template #reference>

+ 7 - 6
src/views/DestinationDelivery/src/components/ConfiguRations/src/components/CreateNewRule.vue

@@ -334,11 +334,11 @@ onMounted(() => {
           <div style="font-weight: 400">{{ t('destinationDelivery.confirmLeavePage') }}</div>
           <template #footer>
             <div class="dialog-footer">
-              <el-button type="default" @click="CancelRulesVisible = false" style="width: 100px"
-                >{{ t('common.cancel') }}</el-button
-              >
+              <el-button type="default" @click="CancelRulesVisible = false" style="width: 100px">{{
+                t('common.cancel')
+              }}</el-button>
               <el-button class="el-button--warning" @click="router.back()" style="width: 100px">
-                OK
+                {{ t('common.ok') }}
               </el-button>
             </div>
           </template>
@@ -360,7 +360,7 @@ onMounted(() => {
                 @click="UnableSaveVisible = false"
                 style="width: 100px"
               >
-                OK
+                {{ t('common.ok') }}
               </el-button>
             </div>
           </template>
@@ -393,7 +393,8 @@ onMounted(() => {
                   ></use>
                 </svg>
               </span>
-              <span class="stars_red">*</span>{{ t('destinationDelivery.selectStationEnableBooking') }}
+              <span class="stars_red">*</span
+              >{{ t('destinationDelivery.selectStationEnableBooking') }}
             </div>
           </template>
           <div>

+ 59 - 41
src/views/DestinationDelivery/src/components/CreateNewBooking/src/CreateNewbooking.vue

@@ -75,11 +75,11 @@ const checkShipmentsSubmitInfo = ref({})
 const RecommendateList = ref([])
 const ModeType = ref([
   {
-    label: 'Truck',
+    label: t('destinationDelivery.truck'),
     value: 'Truck'
   },
   {
-    label: 'Rail',
+    label: t('destinationDelivery.rail'),
     value: 'Rail'
   }
 ])
@@ -731,10 +731,9 @@ onMounted(() => {
             >{{ 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">
@@ -752,7 +751,7 @@ onMounted(() => {
     </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>
@@ -899,7 +898,7 @@ onMounted(() => {
           class="el-button--main"
           @click="AddNewAddressDelivery"
         >
-          + Add New Address</el-button
+          + {{ t('destinationDelivery.addNewAddress') }}</el-button
         >
       </div>
       <div v-else class="addressradio" style="padding-bottom: 4px">
@@ -1133,23 +1132,23 @@ onMounted(() => {
       </div>
       <template #header>
         <div class="my-header">
-          <div class="header_Title">Manage Address</div>
+          <div class="header_Title">{{ t('destinationDelivery.manageAddress') }}</div>
           <el-button @click="handleClickAddNewAddress" class="el-button--noborder--configuration"
-            >+ Add New Address</el-button
+            >+ {{ t('destinationDelivery.addNewAddress') }}</el-button
           >
         </div>
       </template>
       <template #footer>
         <div class="dialog-footer">
-          <el-button class="el-button--default dialog-button" @click="ManageVisible = false"
-            >Cancel</el-button
-          >
+          <el-button class="el-button--default dialog-button" @click="ManageVisible = false">{{
+            t('common.cancel')
+          }}</el-button>
           <el-button
             :disabled="ManageAddressList.length == 0"
             class="el-button--dark dialog-button"
             @click="changeAddressRadio"
           >
-            OK
+            {{ t('common.ok') }}
           </el-button>
         </div>
       </template>
@@ -1160,12 +1159,14 @@ onMounted(() => {
       :title="t('destinationDelivery.addNewDeliveryAddressTitle')"
       :show-close="false"
     >
-      <div class="diaolog_add_title"><span class="stars_red">*</span>Address</div>
+      <div class="diaolog_add_title">
+        <span class="stars_red">*</span>{{ t('destinationDelivery.address') }}
+      </div>
       <el-tooltip
         class="box-item"
         :visible="isShowLimitLine1"
         effect="dark"
-        content="Maximum character limit reached (45 characters)"
+        :content="t('destinationDelivery.maximumCharacterLimitReached')"
         placement="bottom"
       >
         <el-input
@@ -1185,7 +1186,7 @@ onMounted(() => {
         class="box-item"
         :visible="isShowLimitLine2"
         effect="dark"
-        content="Maximum character limit reached (45 characters)"
+        :content="t('destinationDelivery.maximumCharacterLimitReached')"
         placement="bottom"
       >
         <el-input
@@ -1205,7 +1206,7 @@ onMounted(() => {
         class="box-item"
         :visible="isShowLimitLine3"
         effect="dark"
-        content="Maximum character limit reached (45 characters)"
+        :content="t('destinationDelivery.maximumCharacterLimitReached')"
         placement="bottom"
       >
         <el-input
@@ -1225,7 +1226,7 @@ onMounted(() => {
         class="box-item"
         :visible="isShowLimitLine4"
         effect="dark"
-        content="Maximum character limit reached (45 characters)"
+        :content="t('destinationDelivery.maximumCharacterLimitReached')"
         placement="bottom"
       >
         <el-input
@@ -1244,7 +1245,9 @@ onMounted(() => {
       </el-tooltip>
       <div class="flex">
         <div style="width: 33%">
-          <div class="diaolog_add_title"><span class="stars_red">*</span>Country Code</div>
+          <div class="diaolog_add_title">
+            <span class="stars_red">*</span>{{ t('destinationDelivery.countryCode') }}
+          </div>
           <el-select
             v-model="CountryCode"
             filterable
@@ -1263,7 +1266,9 @@ onMounted(() => {
           </el-select>
         </div>
         <div style="margin: 0 9px; width: 33%">
-          <div class="diaolog_add_title"><span class="stars_red">*</span>City Code</div>
+          <div class="diaolog_add_title">
+            <span class="stars_red">*</span>{{ t('destinationDelivery.cityCode') }}
+          </div>
           <el-select
             v-model="CityCode"
             filterable
@@ -1282,7 +1287,9 @@ onMounted(() => {
           </el-select>
         </div>
         <div style="width: 33%">
-          <div class="diaolog_add_title"><span class="stars_red">*</span>Postal Code</div>
+          <div class="diaolog_add_title">
+            <span class="stars_red">*</span>{{ t('destinationDelivery.postalCode') }}
+          </div>
           <el-input
             class="inputmargin"
             :placeholder="t('destinationDelivery.enterPostalCode')"
@@ -1290,10 +1297,12 @@ onMounted(() => {
           ></el-input>
         </div>
       </div>
-      <div class="diaolog_add_title_bold">Contact Information</div>
+      <div class="diaolog_add_title_bold">{{ t('destinationDelivery.contactInformation') }}</div>
       <div class="flex">
         <div style="margin-right: 9px; width: 50%">
-          <div class="diaolog_add_title"><span class="stars_red">*</span>Contact Person</div>
+          <div class="diaolog_add_title">
+            <span class="stars_red">*</span>{{ t('destinationDelivery.contactPerson') }}
+          </div>
           <el-input
             style="margin-top: 4px"
             :placeholder="t('destinationDelivery.contactNamePlaceholder')"
@@ -1301,7 +1310,9 @@ onMounted(() => {
           ></el-input>
         </div>
         <div style="width: 50%">
-          <div class="diaolog_add_title"><span class="stars_red">*</span>Contact Number</div>
+          <div class="diaolog_add_title">
+            <span class="stars_red">*</span>{{ t('destinationDelivery.contactNumber') }}
+          </div>
           <el-input
             style="margin-top: 4px"
             :placeholder="t('destinationDelivery.contactMobilePlaceholder')"
@@ -1311,11 +1322,13 @@ onMounted(() => {
       </div>
       <template #footer>
         <div class="dialog-footer" style="justify-content: end">
-          <el-button class="el-button--default dialog-button" @click="AddNewAddressVisible = false"
-            >Cancel</el-button
+          <el-button
+            class="el-button--default dialog-button"
+            @click="AddNewAddressVisible = false"
+            >{{ t('common.cancel') }}</el-button
           >
           <el-button class="el-button--dark dialog-button" @click="SaveNewAddress">
-            Save Address
+            {{ t('destinationDelivery.saveAddress') }}
           </el-button>
         </div>
       </template>
@@ -1341,7 +1354,7 @@ onMounted(() => {
             style="width: 80px"
             class="el-button--dark"
             @click="NoPermissionVisible = false"
-            >OK</el-button
+            >{{ t('common.ok') }}</el-button
           >
         </div>
       </template>
@@ -1363,8 +1376,11 @@ onMounted(() => {
       </div>
       <template #footer>
         <div class="dialog-footer">
-          <el-button style="width: 80px" class="el-button--dark" @click="NoEligibleVisible = false"
-            >OK</el-button
+          <el-button
+            style="width: 80px"
+            class="el-button--dark"
+            @click="NoEligibleVisible = false"
+            >{{ t('common.ok') }}</el-button
           >
         </div>
       </template>
@@ -1372,7 +1388,9 @@ onMounted(() => {
     <!-- 保存成功 -->
     <el-dialog v-model="SaveedVisible" width="320" style="height: 212px">
       <div style="text-align: center"><el-image :src="submitsucessful" style="width: 64px" /></div>
-      <div style="text-align: center; margin-top: 20px">Saved successfully</div>
+      <div style="text-align: center; margin-top: 20px">
+        {{ t('destinationDelivery.savedSuccessfully') }}
+      </div>
     </el-dialog>
     <!-- 保存失败 -->
     <el-dialog v-model="UnableSaveVisible" width="480">
@@ -1385,7 +1403,7 @@ onMounted(() => {
             @click="UnableSaveVisible = false"
             style="width: 100px"
           >
-            OK
+            {{ t('common.ok') }}
           </el-button>
         </div>
       </template>
@@ -1398,15 +1416,15 @@ onMounted(() => {
     </el-dialog>
     <!-- 取消保存 -->
     <el-dialog v-model="CancelRulesVisible" width="480">
-      <div style="font-weight: 400">You have unsaved changes.</div>
-      <div style="font-weight: 400">Are you sure you want to leave this page?</div>
+      <div style="font-weight: 400">{{ t('destinationDelivery.unsavedChangesMessageLine1') }}</div>
+      <div style="font-weight: 400">{{ t('destinationDelivery.unsavedChangesMessageLine2') }}</div>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="default" @click="CancelRulesVisible = false" style="width: 100px"
-            >Cancel</el-button
-          >
+          <el-button type="default" @click="CancelRulesVisible = false" style="width: 100px">{{
+            t('common.cancel')
+          }}</el-button>
           <el-button class="el-button--warning" @click="router.back()" style="width: 100px">
-            OK
+            {{ t('common.ok') }}
           </el-button>
         </div>
       </template>
@@ -1425,7 +1443,7 @@ onMounted(() => {
       </div>
       <div style="margin-top: 8px">
         <div class="Notice" v-for="(item, index) in RecommendateList" :key="index">
-          HOBL: {{ item.Hbol }}
+          {{ t('destinationDelivery.hobl') }}: {{ item.Hbol }}
         </div>
       </div>
       <template #footer>
@@ -1435,7 +1453,7 @@ onMounted(() => {
             @click="isRecommendDate = false"
             style="width: 100px"
           >
-            OK
+            {{ t('common.ok') }}
           </el-button>
         </div>
       </template>

+ 12 - 10
src/views/DestinationDelivery/src/components/CreateNewBooking/src/components/NewbookingTable.vue

@@ -5,7 +5,9 @@ import { formatTimezone } from '@/utils/tools'
 import { ref, onMounted } from 'vue'
 import { useRouter } from 'vue-router'
 import { autoWidth } from '@/utils/table'
+import { useI18n } from 'vue-i18n'
 
+const { t } = useI18n()
 const router = useRouter()
 const { currentRoute } = router
 const { value } = currentRoute
@@ -150,7 +152,7 @@ const selectRowsWithSameMbol = ({ row, checked }) => {
   const key = row.same_mbol
   if (!key) return
   const tableRowData = tableRef.value?.getTableData().fullData || []
-  tableRowData.forEach((item, index) => {
+  tableRowData.forEach((item) => {
     if (item.same_mbol === key) {
       tableRef.value?.setCheckboxRow(item, checked)
     }
@@ -290,11 +292,7 @@ const handleCustomizeColumns = () => {
       model_name: 'destination_delivery_shipment_search'
     }
   }
-  CustomizeColumnsRef.value.openDialog(
-    params,
-    -220,
-    'Drag item over to this selection or click "add" icon to show the field on delivery booking list'
-  )
+  CustomizeColumnsRef.value.openDialog(params, -220, t('destinationDelivery.customizeColumnsTip'))
 }
 // 定制表格
 const customizeColumns = async () => {
@@ -328,14 +326,16 @@ defineExpose({
 <template>
   <div class="new-booking-table">
     <div class="table-tools">
-      <div class="table-total-info">{{ tableData.data.length }} result</div>
+      <div class="table-total-info">
+        {{ tableData.data.length }} {{ t('destinationDelivery.result') }}
+      </div>
       <el-button
         style="width: 170px; align-self: flex-end"
         type="default"
         @click="handleCustomizeColumns"
       >
         <span style="margin-right: 6px" class="font_family icon-icon_column_b"></span>
-        Customize Columns
+        {{ t('destinationDelivery.customizeColumns') }}
       </el-button>
     </div>
     <vxe-grid
@@ -358,9 +358,11 @@ defineExpose({
       </template>
       <template #empty>
         <div v-if="isNotActivated" class="empty-text">
-          This service isn't activated yet. Please contact our team to enable it.
+          {{ t('destinationDelivery.serviceNotActivatedYet') }}
+        </div>
+        <div v-else class="empty-text">
+          {{ t('destinationDelivery.noEligibleShipmentsFoundToCreateNewBooking') }}
         </div>
-        <div v-else class="empty-text">No eligible shipments found to create a new booking.</div>
       </template>
     </vxe-grid>
 

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

@@ -55,7 +55,7 @@ const handleTokenRedirect = () => {
         if (res.code === 400) {
           const { data } = res
           if (data.msg === 'Invalid token') {
-            ElMessageBox.alert(t('common.invalidToken'), t('common.prompt'), {
+            ElMessageBox.alert(t('login.invalidToken'), t('common.prompt'), {
               confirmButtonText: t('common.ok'),
               type: 'warning',
               confirmButtonClass: 'el-button--dark'

+ 17 - 5
src/views/MultilingualConfig/src/MultilingualConfig.vue

@@ -20,14 +20,14 @@ const tabList = ref([
     name: 'Chinese (Simplified)',
     checked: false,
     number: 0,
-    type: 'chinese-simplified',
+    type: 'simplifiedChinese',
     statusKey: 'simplifiedChineseStatus'
   },
   {
     name: 'Chinese (Traditional)',
     checked: false,
     number: 0,
-    type: 'chinese-traditional',
+    type: 'traditionalChinese',
     statusKey: 'traditionalChineseStatus'
   },
   { name: 'Français', checked: false, number: 0, type: 'french', statusKey: 'frenchStatus' },
@@ -129,15 +129,21 @@ const capitalizeFirstLetter = (str: string) => {
 }
 const getMultilingualPageInfo = async () => {
   try {
-    const res = await $api.getMultilingualPageInfo()
-    if (res.code === 200) {
-      pageList.value = res.data.map((item: any) => {
+    const { code, data: resData } = await $api.getMultilingualPageInfo()
+    if (code === 200) {
+      pageList.value = resData.pageData.map((item: any) => {
         return {
           label: capitalizeFirstLetter(item.page_key),
           value: item.page_key,
           unverifiedNumber: item.unverified_count
         }
       })
+      Object.entries(resData.langData as Record<string, number>).forEach(([key, value]) => {
+        const tabIndex = tabList.value.findIndex((item) => item.type === key)
+        if (tabIndex !== -1) {
+          tabList.value[tabIndex].number = value
+        }
+      })
     }
   } catch (error) {
     console.error(error)
@@ -297,6 +303,12 @@ const getMultilingualConfig = async () => {
           unverifiedNumber: item.unverified_count
         }
       })
+      Object.entries(responseData.langData as Record<string, number>).forEach(([key, value]) => {
+        const tabIndex = tabList.value.findIndex((item) => item.type === key)
+        if (tabIndex !== -1) {
+          tabList.value[tabIndex].number = value
+        }
+      })
     }
   } catch (error) {
     console.log(error)

+ 2 - 4
src/views/MultilingualConfig/src/components/FilterTabs.vue

@@ -1,6 +1,5 @@
 <script setup lang="ts">
 import { cloneDeep } from 'lodash'
-import { useI18n } from 'vue-i18n'
 
 interface ListItem {
   name: string
@@ -12,7 +11,6 @@ interface Props {
   tabList: ListItem[]
 }
 const props = withDefaults(defineProps<Props>(), {})
-const { t } = useI18n()
 
 const emits = defineEmits(['tabChange'])
 
@@ -127,12 +125,12 @@ const handleTagToggle = (index: any, checked: any) => {
   background-color: var(--color-tag-created-bg);
   color: var(--color-tag-created);
 }
-.v-tag__chinese-simplified {
+.v-tag__simplifiedChinese {
   font-weight: 400;
   background-color: var(--color-tag-chinese-simplified-bg);
   color: var(--color-tag-confirmed);
 }
-.v-tag__chinese-traditional {
+.v-tag__traditionalChinese {
   font-weight: 400;
   background-color: var(--color-tag-chinese-traditional-bg);
   color: var(--color-tag-chinese-traditional);

+ 5 - 5
src/views/Report/src/components/ReportSchedule/src/ReportSchedule.vue

@@ -102,7 +102,7 @@ const handleSave = () => {
     })
     .then((res: any) => {
       if (res.code === 200) {
-        ElMessage.success(t('reportSchedule.saveSuccess'))
+        ElMessage.success(t('report.saveSuccess'))
         router.push({ path: '/report' })
       }
     })
@@ -111,7 +111,7 @@ const handleSave = () => {
 <template>
   <div v-vloading="loading">
     <div class="Title">
-      <span>{{ t('reportSchedule.scheduleConfiguration', { name: pageData.reportName }) }}</span>
+      <span>{{ t('report.scheduleConfiguration', { name: pageData.reportName }) }}</span>
       <el-button @click="handleSave" class="el-button--main save_button"
         ><span class="font_family icon-icon_save_b icon_dark" style="margin-right: 5px"></span
         >{{ t('common.save') }}</el-button
@@ -121,7 +121,7 @@ const handleSave = () => {
       <div class="schedule_rule">
         <div class="schedule_title">
           <span class="stars_red">*</span>
-          {{ t('reportSchedule.scheduleRuleValidityPeriod') }}
+          {{ t('report.scheduleRuleValidityPeriod') }}
         </div>
         <div class="schedule_container">
           <ValidityPeriod
@@ -133,7 +133,7 @@ const handleSave = () => {
         </div>
       </div>
       <div class="schedule_rule" style="margin: 8px 0">
-        <div class="schedule_title">{{ t('reportSchedule.reportDataTimeRange') }}</div>
+        <div class="schedule_title">{{ t('report.reportDataTimeRange') }}</div>
         <div class="schedule_container">
           <TimeRange
             ref="timeRangeRef"
@@ -144,7 +144,7 @@ const handleSave = () => {
         </div>
       </div>
       <div class="schedule_rule" style="margin: 8px 0">
-        <div class="schedule_title">{{ t('reportSchedule.reportDeliveryFrequencyEmail') }}</div>
+        <div class="schedule_title">{{ t('report.reportDeliveryFrequencyEmail') }}</div>
         <div class="schedule_container">
           <EmailConfiguration
             ref="emailConfigurationRef"

+ 13 - 13
src/views/Report/src/components/ReportSchedule/src/components/EmailConfiguration.vue

@@ -205,7 +205,7 @@ const handleClickFrequency = () => {
 
 const getData = () => {
   if (!frequencyValue.value || !emailValue.value || !timezoneValue.value) {
-    ElMessage.warning(t('reportSchedule.selectReportDeliveryFrequencyEmailConfig'))
+    ElMessage.warning(t('report.selectReportDeliveryFrequencyEmailConfig'))
     return false
   }
   if (
@@ -218,7 +218,7 @@ const getData = () => {
     (frequencyValue.value === 'yearly' &&
       (yearlyMonth.value.length === 0 || !dayValue.value || !timeValue.value))
   ) {
-    ElMessage.error(t('reportSchedule.selectReportDeliveryFrequencyEmailConfig'))
+    ElMessage.error(t('report.selectReportDeliveryFrequencyEmailConfig'))
     return false
   }
   return {
@@ -244,13 +244,13 @@ defineExpose({
   <div style="padding: 8px 16px 0 16px">
     <div class="title">
       <span class="stars_red">*</span>
-      {{ t('reportSchedule.emailRecipients') }}
+      {{ t('report.emailRecipients') }}
     </div>
     <el-input
       v-model="emailValue"
       :rows="4"
       type="textarea"
-      :placeholder="t('reportSchedule.emailRecipientsPlaceholder')"
+      :placeholder="t('report.emailRecipientsPlaceholder')"
       style="margin-top: 4px"
     ></el-input>
   </div>
@@ -260,7 +260,7 @@ defineExpose({
       <div class="timezone" style="margin-right: 8px">
         <div class="title">
           <span class="stars_red">*</span>
-          {{ t('reportSchedule.timezone') }}
+          {{ t('report.timezone') }}
         </div>
         <el-select
           class="select_time"
@@ -278,7 +278,7 @@ defineExpose({
       <div class="timezone">
         <div class="title">
           <span class="stars_red">*</span>
-          {{ t('reportSchedule.deliveryFrequency') }}
+          {{ t('report.deliveryFrequency') }}
         </div>
         <el-select
           class="select_time"
@@ -296,11 +296,11 @@ defineExpose({
       </div>
     </div>
     <div class="schedule_details">
-      <div class="detail_title">{{ t('reportSchedule.scheduleDetails') }}</div>
+      <div class="detail_title">{{ t('report.scheduleDetails') }}</div>
       <div class="weelkly_detailes" v-if="frequencyValue == 'weekly'">
         <div class="title">
           <span class="stars_red">*</span>
-          {{ t('reportSchedule.daysOfWeekSelectMultiple') }}
+          {{ t('report.daysOfWeekSelectMultiple') }}
         </div>
         <el-checkbox-group v-model="weeklyChecked" style="margin: 4px 0 16px 0">
           <el-checkbox
@@ -316,7 +316,7 @@ defineExpose({
       <div class="monthly_detailes" v-else-if="frequencyValue == 'monthly'">
         <div class="title">
           <span class="stars_red">*</span>
-          {{ t('reportSchedule.daysOfMonthSelectMultiple') }}
+          {{ t('report.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">
@@ -327,7 +327,7 @@ defineExpose({
       <div class="yearly_detailes" v-else-if="frequencyValue == 'yearly'">
         <div class="title">
           <span class="stars_red">*</span>
-          {{ t('reportSchedule.monthsSelectMultiple') }}
+          {{ t('report.monthsSelectMultiple') }}
         </div>
         <el-checkbox-group v-model="yearlyMonth" style="margin: 4px 0 16px 0">
           <el-checkbox
@@ -344,7 +344,7 @@ defineExpose({
         <div class="details_time" v-if="frequencyValue == 'quarterly'">
           <div class="title">
             <span class="stars_red">*</span>
-            {{ t('reportSchedule.quarterMonth') }}
+            {{ t('report.quarterMonth') }}
           </div>
           <el-select
             style="margin: 4px 8px 0 0"
@@ -365,7 +365,7 @@ defineExpose({
         >
           <div class="title">
             <span class="stars_red">*</span>
-            {{ t('reportSchedule.day') }}
+            {{ t('report.day') }}
           </div>
           <el-select
             style="margin: 4px 8px 0 0"
@@ -378,7 +378,7 @@ defineExpose({
         <div class="details_time">
           <div class="title">
             <span class="stars_red">*</span>
-            {{ t('reportSchedule.time') }}
+            {{ t('report.time') }}
           </div>
 
           <el-select

+ 46 - 26
src/views/Report/src/components/ReportSchedule/src/components/TimeRange.vue

@@ -184,7 +184,7 @@ const changeFixedRange = (val: any) => {
 
 const getData = () => {
   if (!fieldType.value || !type.value) {
-    ElMessage.warning(t('reportSchedule.selectReportDataTimeRange'))
+    ElMessage.warning(t('report.selectReportDataTimeRange'))
     return false
   }
 
@@ -213,7 +213,7 @@ defineExpose({
   <div style="padding: 8px 16px 16px 16px">
     <div class="title">
       <span class="stars_red">*</span>
-      {{ t('reportSchedule.dataTimeReferenceFieldTitle') }}
+      {{ t('report.dataTimeReferenceFieldTitle') }}
     </div>
     <el-select
       class="select_time"
@@ -231,14 +231,14 @@ defineExpose({
     <div class="schedule_rule">
       <div class="schedule_title">
         <span class="stars_red">*</span>
-        {{ t('reportSchedule.dataRangeMethodTitle') }}
+        {{ t('report.dataRangeMethodTitle') }}
       </div>
       <div class="schedule_container">
         <el-radio-group v-model="type" @change="changeTime">
           <el-radio value="dynamic_rolling">
             <div class="radio_custom">
               <div style="height: 32px" class="flex">
-                {{ t('reportSchedule.dynamicRollingRange') }}
+                {{ t('report.dynamicRollingRange') }}
                 <el-tooltip
                   popper-class="schedule-popper"
                   effect="dark"
@@ -246,28 +246,36 @@ defineExpose({
                   placement="right"
                 >
                   <template #content>
-                    <span>{{ t('reportSchedule.dynamicRollingTooltipLine1') }}</span>
+                    <span>{{ t('report.dynamicRollingTooltipLine1') }}</span>
                     <br />
-                    <span>{{ t('reportSchedule.dynamicRollingTooltipLine2') }}</span>
+                    <span>{{ t('report.dynamicRollingTooltipLine2') }}</span>
                   </template>
                   <span class="font_family icon-icon_info_b"></span>
                 </el-tooltip>
               </div>
               <div v-if="isShowRolling" class="oceanCheckbox2">
                 <el-radio-group v-model="rollingRangeRadio" @change="ChangeRollingRangeRadio">
-                  <el-radio-button value="Next 30 days">{{ t('notificationRules.next30Days') }}</el-radio-button>
-                  <el-radio-button value="Next 60 days">{{ t('notificationRules.next60Days') }}</el-radio-button>
+                  <el-radio-button value="Next 30 days">{{
+                    t('notificationRules.next30Days')
+                  }}</el-radio-button>
+                  <el-radio-button value="Next 60 days">{{
+                    t('notificationRules.next60Days')
+                  }}</el-radio-button>
                   <el-radio-button value="Past 10 days to next 60 days">{{
                     t('notificationRules.past10DaysToNext60Days')
                   }}</el-radio-button>
-                  <el-radio-button value="Past 30 days">{{ t('notificationRules.past30Days') }}</el-radio-button>
-                  <el-radio-button value="Customize">{{ t('notificationRules.customize') }}</el-radio-button>
+                  <el-radio-button value="Past 30 days">{{
+                    t('notificationRules.past30Days')
+                  }}</el-radio-button>
+                  <el-radio-button value="Customize">{{
+                    t('notificationRules.customize')
+                  }}</el-radio-button>
                 </el-radio-group>
                 <div class="flex" style="align-items: end; margin: 16px 8px 8px 0; flex-wrap: wrap">
                   <div class="date_flex" style="margin-right: 10px">
-                    <div class="time_title">{{ t('reportSchedule.startDate') }}</div>
+                    <div class="time_title">{{ t('report.startDate') }}</div>
                     <div class="flex">
-                      <div class="currentTime">{{ t('reportSchedule.past') }}</div>
+                      <div class="currentTime">{{ t('report.past') }}</div>
                       <el-input
                         v-model="clampedValueStart"
                         @input="changeTime('dynamic_rolling')"
@@ -278,9 +286,9 @@ defineExpose({
                     </div>
                   </div>
                   <div class="date_flex">
-                    <div class="time_title">{{ t('reportSchedule.endDate') }}</div>
+                    <div class="time_title">{{ t('report.endDate') }}</div>
                     <div class="flex">
-                      <div class="currentTime">{{ t('reportSchedule.future') }}</div>
+                      <div class="currentTime">{{ t('report.future') }}</div>
                       <el-input
                         v-model="clampedValueEnd"
                         @input="changeTime('dynamic_rolling')"
@@ -297,7 +305,7 @@ defineExpose({
           <el-radio value="fixed">
             <div class="radio_custom">
               <div style="height: 32px" class="flex">
-                {{ t('reportSchedule.fixedRange') }}
+                {{ t('report.fixedRange') }}
                 <el-tooltip
                   :show-arrow="false"
                   popper-class="schedule-popper"
@@ -305,9 +313,9 @@ defineExpose({
                   placement="right"
                 >
                   <template #content>
-                    <span>{{ t('reportSchedule.fixedRangeTooltipLine1') }}</span>
+                    <span>{{ t('report.fixedRangeTooltipLine1') }}</span>
                     <br />
-                    <span>{{ t('reportSchedule.fixedRangeTooltipLine2') }}</span>
+                    <span>{{ t('report.fixedRangeTooltipLine2') }}</span>
                   </template>
                   <span class="font_family icon-icon_info_b"></span>
                 </el-tooltip>
@@ -319,18 +327,30 @@ defineExpose({
                     @change="changeFixedRange"
                     class="oceanCheckbox2"
                   >
-                    <el-radio-button value="This Month">{{ t('reportSchedule.thisMonth') }}</el-radio-button>
-                    <el-radio-button value="Last Month">{{ t('dateRange.lastMonth') }}</el-radio-button>
-                    <el-radio-button value="This Quarter">{{ t('reportSchedule.thisQuarter') }}</el-radio-button>
-                    <el-radio-button value="Last Quarter">{{ t('reportSchedule.lastQuarter') }}</el-radio-button>
-                    <el-radio-button value="This Year">{{ t('dateRange.thisYear') }}</el-radio-button>
-                    <el-radio-button value="Last Year">{{ t('reportSchedule.lastYear') }}</el-radio-button>
-                    <el-radio-button value="Customize">{{ t('notificationRules.customize') }}</el-radio-button>
+                    <el-radio-button value="This Month">{{
+                      t('report.thisMonth')
+                    }}</el-radio-button>
+                    <el-radio-button value="Last Month">{{
+                      t('dateRange.lastMonth')
+                    }}</el-radio-button>
+                    <el-radio-button value="This Quarter">{{
+                      t('report.thisQuarter')
+                    }}</el-radio-button>
+                    <el-radio-button value="Last Quarter">{{
+                      t('report.lastQuarter')
+                    }}</el-radio-button>
+                    <el-radio-button value="This Year">{{
+                      t('dateRange.thisYear')
+                    }}</el-radio-button>
+                    <el-radio-button value="Last Year">{{ t('report.lastYear') }}</el-radio-button>
+                    <el-radio-button value="Customize">{{
+                      t('notificationRules.customize')
+                    }}</el-radio-button>
                   </el-radio-group>
                 </div>
                 <div style="display: flex; padding-bottom: 8px">
                   <div style="margin-right: 9px; width: 50%">
-                    <div class="date_text">{{ t('reportSchedule.startDate') }}</div>
+                    <div class="date_text">{{ t('report.startDate') }}</div>
                     <el-date-picker
                       v-model="startDate"
                       type="date"
@@ -344,7 +364,7 @@ defineExpose({
                     />
                   </div>
                   <div style="width: 50%">
-                    <div class="date_text">{{ t('reportSchedule.endDate') }}</div>
+                    <div class="date_text">{{ t('report.endDate') }}</div>
                     <el-date-picker
                       v-model="endDate"
                       type="date"

+ 17 - 9
src/views/SystemMessage/src/components/SystemMessageDetail.vue

@@ -122,7 +122,7 @@ const handleIframeLoaded = () => {
         class="total-tips"
         v-if="route.query.numericRecords && Number(route.query.numericRecords) > -1"
       >
-        {{ t('notificationMessage.latestStatusUpdates', { count: route.query.numericRecords }) }}
+        {{ t('systemMessage.latestStatusUpdates', { count: route.query.numericRecords }) }}
       </div>
       <div
         class="total-tips"
@@ -133,17 +133,23 @@ const handleIframeLoaded = () => {
       >
         <div>
           <span v-if="route.query.etdOrdeparturNum"
-            >{{ notificationData.type === 'delay' ? t('notificationMessage.departureDelay') : t('notificationMessage.etdChange') }} ({{
-              route.query.etdOrdeparturNum
-            }})</span
+            >{{
+              notificationData.type === 'delay'
+                ? t('systemMessage.departureDelay')
+                : t('systemMessage.etdChange')
+            }}
+            ({{ route.query.etdOrdeparturNum }})</span
           >
           <span v-if="route.query.etdOrdeparturNum && route.query.etaOrarrivalNum">
             &nbsp;&nbsp;|&nbsp;&nbsp;</span
           >
           <span v-if="route.query.etaOrarrivalNum">
-            {{ notificationData.type === 'delay' ? t('notificationMessage.arrivalDelay') : t('notificationMessage.etaChange') }} ({{
-              route.query.etaOrarrivalNum
-            }})
+            {{
+              notificationData.type === 'delay'
+                ? t('systemMessage.arrivalDelay')
+                : t('systemMessage.etaChange')
+            }}
+            ({{ route.query.etaOrarrivalNum }})
           </span>
         </div>
       </div>
@@ -158,12 +164,14 @@ const handleIframeLoaded = () => {
           :data="item"
         />
         <div class="footer">
-          <el-divider style="margin-bottom: 0px" v-if="isScrollLoading"> {{ t('common.loading') }} </el-divider>
+          <el-divider style="margin-bottom: 0px" v-if="isScrollLoading">
+            {{ t('common.loading') }}
+          </el-divider>
           <el-divider
             style="margin-bottom: 0px"
             v-if="finished && notificationData.notificationList.length > 0"
           >
-            {{ t('notificationMessage.onlyDisplayWithinThreeMonths') }}
+            {{ t('systemMessage.onlyDisplayWithinThreeMonths') }}
           </el-divider>
         </div>
       </div>

+ 2 - 2
src/views/SystemSettings/src/components/CreateNewrule/src/CreateNewrule.vue

@@ -80,7 +80,7 @@ onMounted(() => {
               t('common.cancel')
             }}</el-button>
             <el-button class="el-button--warning" @click="router.back()" style="width: 100px">
-              OK
+              {{ t('common.ok') }}
             </el-button>
           </div>
         </template>
@@ -144,7 +144,7 @@ onMounted(() => {
       <div>
         <el-select
           v-model="notificationvalue"
-          :placeholder="t('common.select')"
+          :placeholder="t('systemSettings.selectEventPlaceholder')"
           style="width: 400px"
         >
           <el-option

+ 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>

+ 28 - 21
src/views/SystemSettings/src/components/PersonalProfile.vue

@@ -122,9 +122,9 @@ const saveConfig = (model: string) => {
           updatedInfo.is_desensitization_kln = form.is_desensitization_kln
         }
         userStore.setUserInfo(updatedInfo)
-        ElMessage.success(t('personalProfile.saveSuccessfully'))
+        ElMessage.success(t('systemSettings.saveSuccessfully'))
       } else {
-        ElMessage.error(t('personalProfile.saveFailed'))
+        ElMessage.error(t('systemSettings.saveFailed'))
       }
     })
     .finally(() => {
@@ -136,15 +136,19 @@ const saveConfig = (model: string) => {
 <template>
   <div class="personal-profile" v-vloading="loading">
     <div class="basic-information">
-      <div class="title">{{ t('personalProfile.basicInformation') }}</div>
+      <div class="title">{{ t('systemSettings.basicInformation') }}</div>
       <div class="content">
         <div class="row">
           <div class="item">
-            <p class="label">{{ t('personalProfile.firstName') }}</p>
-            <el-input size="large" v-model="form.firstName" :placeholder="t('report.pleaseEnter')" />
+            <p class="label">{{ t('systemSettings.firstName') }}</p>
+            <el-input
+              size="large"
+              v-model="form.firstName"
+              :placeholder="t('report.pleaseEnter')"
+            />
           </div>
           <div class="item">
-            <p class="label">{{ t('personalProfile.lastName') }}</p>
+            <p class="label">{{ t('systemSettings.lastName') }}</p>
             <el-input size="large" v-model="form.lastName" :placeholder="t('report.pleaseEnter')" />
           </div>
         </div>
@@ -154,18 +158,18 @@ const saveConfig = (model: string) => {
             <el-input size="large" :disabled="true" v-model="form.username" />
           </div>
           <div class="item">
-            <p class="label">{{ t('personalProfile.email') }}</p>
+            <p class="label">{{ t('systemSettings.email') }}</p>
             <el-input size="large" :disabled="true" v-model="form.email" />
           </div>
         </div>
         <div class="row">
           <div class="item">
             <p class="label">
-              {{ t('personalProfile.password') }}
+              {{ t('systemSettings.password') }}
               <span style="margin: 0 2px 0 8px" class="font_family icon-icon_time_b"></span>
-              <span>{{ t('personalProfile.passwordExpirePrefix') }}</span>
+              <span>{{ t('systemSettings.passwordExpirePrefix') }}</span>
               <span style="margin-left: 4px; color: var(--color-theme)">{{
-                t('personalProfile.passwordExpireDays', { n: userStore.expireDay })
+                t('systemSettings.passwordExpireDays', { n: userStore.expireDay })
               }}</span>
             </p>
             <div class="password-change">
@@ -180,22 +184,25 @@ const saveConfig = (model: string) => {
             </div>
           </div>
           <div class="item" v-if="userStore.userInfo?.user_type === 'employee'">
-            <p class="label">{{ t('personalProfile.maskCustomerInformation') }}</p>
+            <p class="label">{{ t('systemSettings.maskCustomerInformation') }}</p>
             <el-select size="large" v-model="form.is_desensitization_kln">
-              <el-option :label="t('personalProfile.yes')" value="t"></el-option>
-              <el-option :label="t('personalProfile.no')" value="f"></el-option>
+              <el-option :label="t('systemSettings.yes')" value="t"></el-option>
+              <el-option :label="t('systemSettings.no')" value="f"></el-option>
             </el-select>
           </div>
         </div>
         <div class="row">
-          <el-button @click="saveConfig('profile')" class="el-button--dark save-icon" size="large"
+          <el-button
+            @click="saveConfig('profile')"
+            class="el-button--dark save-icon"
+            size="large"
             >{{ t('common.save') }}</el-button
           >
         </div>
       </div>
     </div>
     <div class="personal-preferences">
-      <div class="title">{{ t('personalProfile.personalPreferences') }}</div>
+      <div class="title">{{ t('systemSettings.personalPreferences') }}</div>
       <div class="segmented">
         <div
           style="width: 121px"
@@ -203,7 +210,7 @@ const saveConfig = (model: string) => {
           @click="handleSegmented('dateTime')"
           class="item"
         >
-          {{ t('personalProfile.dateAndTime') }}
+          {{ t('systemSettings.dateAndTime') }}
         </div>
         <div
           style="width: 162px"
@@ -211,11 +218,11 @@ const saveConfig = (model: string) => {
           @click="handleSegmented('numbersFormat')"
           class="item"
         >
-          {{ t('personalProfile.numbersFormatNav') }}
+          {{ t('systemSettings.numbersFormatNav') }}
         </div>
       </div>
       <div class="date-format" v-if="segmented === 'dateTime'">
-        <div class="title">{{ t('personalProfile.dateFormat') }}</div>
+        <div class="title">{{ t('systemSettings.dateFormat') }}</div>
         <div class="content">
           <el-radio-group v-model="dateFormat" label="string" @change="handleDateFormat">
             <el-row>
@@ -254,21 +261,21 @@ const saveConfig = (model: string) => {
         </div>
       </div>
       <div class="numbers-format" v-if="segmented === 'numbersFormat'">
-        <div class="title">{{ t('personalProfile.numbersFormat') }}</div>
+        <div class="title">{{ t('systemSettings.numbersFormat') }}</div>
         <div class="content">
           <el-radio-group v-model="numbersFormat" label="string">
             <el-row>
               <el-col
                 ><el-radio value="US/UK">
                   <template #default>
-                    <span>{{ t('personalProfile.numbersUsUk') }}</span>
+                    <span>{{ t('systemSettings.numbersUsUk') }}</span>
                   </template>
                 </el-radio></el-col
               >
               <el-col
                 ><el-radio value="European">
                   <template #default>
-                    <span>{{ t('personalProfile.numbersEuropean') }}</span>
+                    <span>{{ t('systemSettings.numbersEuropean') }}</span>
                   </template>
                 </el-radio></el-col
               >

+ 3 - 2
src/views/Tracking/src/components/TrackingDetail/src/TrackingDetail.vue

@@ -19,7 +19,6 @@ import { formatTimezone } from '@/utils/tools'
 import { useThemeStore } from '@/stores/modules/theme'
 import ShareLinkDialog from './components/ShareLinkDialog.vue'
 import { useGuideStore } from '@/stores/modules/guide'
-import { useI18n } from 'vue-i18n'
 const guideStore = useGuideStore()
 const { t } = useI18n()
 
@@ -163,7 +162,9 @@ const SubscribeShipments = () => {
           :class="[`icon-${transportationMode?.[allData?.transportInfo?.mode]}`]"
           style="font-size: 64px"
         ></span>
-        <div class="no">{{ t('tracking.tdHouseNo') }} {{ allData?.transportInfo?.['Tracking No.'] }}</div>
+        <div class="no">
+          {{ t('tracking.tdHouseNo') }} {{ allData?.transportInfo?.['Tracking No.'] }}
+        </div>
         <VTag large :type="allData?.transportInfo?.status">{{
           allData?.transportInfo?.status
         }}</VTag>