Răsfoiți Sursa

fix: 订单多语言配置、订单各状态创建时间字段对接

liangan 4 săptămâni în urmă
părinte
comite
3203cdff5f

+ 36 - 0
src/locale/bn.json

@@ -28,6 +28,42 @@
   "addressBook.operate.error.loadPage": "পৃষ্ঠা লোড করতে ব্যর্থ",
   "addressBook.delete.deleting": "মুছে ফেলা হচ্ছে...",
   "addressBook.delete.success": "ঠিকানা সফলভাবে মুছে ফেলা হয়েছে",
+  "myOrders.title": "আমার অর্ডার",
+  "myOrders.tab.all": "সব",
+  "myOrders.tab.toPay": "পেমেন্ট বাকি",
+  "myOrders.tab.success": "সফল",
+  "myOrders.tab.failed": "ব্যর্থ",
+  "myOrders.tab.reward": "পুরস্কার",
+  "myOrders.order.id": "অর্ডার আইডি",
+  "myOrders.order.color": "রং",
+  "myOrders.order.quantity": "পরিমাণ",
+  "orderDetail.title": "অর্ডারের বিস্তারিত",
+  "orderDetail.loading": "লোড হচ্ছে...",
+  "orderDetail.congrats": "অভিনন্দন, আপনি এই গ্রুপে পুরস্কার জিতেছেন!",
+  "orderDetail.receiveReward": "আপনি গ্রুপ ওপেনিং রিওয়ার্ড পেয়েছেন",
+  "orderDetail.sorry": "দুঃখিত, আপনি এই গ্রুপে জিততে পারেননি",
+  "orderDetail.waiting": "অনুগ্রহ করে এই গ্রুপের ড্র এর জন্য অপেক্ষা করুন",
+  "orderDetail.paymentCountdown": "অনুগ্রহ করে এই সময়ের মধ্যে পেমেন্ট করুন:",
+  "orderDetail.address.add": "অনুগ্রহ করে আপনার শিপিং ঠিকানা প্রদান করুন",
+  "orderDetail.address.name": "প্রাপক",
+  "orderDetail.address.orderNo": "অর্ডার আইডি",
+  "orderDetail.address.color": "রং",
+  "orderDetail.address.quantity": "পরিমাণ",
+  "orderDetail.summary.title": "অর্ডার সারাংশ",
+  "orderDetail.summary.subtotal": "মোট",
+  "orderDetail.payment.title": "পেমেন্ট পদ্ধতি",
+  "orderDetail.payment.placedOn": "অর্ডারের তারিখ",
+  "orderDetail.button.cancel": "বাতিল করুন",
+  "orderDetail.button.share": "শেয়ার করুন",
+  "orderDetail.button.pay": "পেমেন্ট করুন",
+  "orderDetail.dialog.cancel.title": "আপনি কি এই অর্ডার বাতিল করতে চান?",
+  "orderDetail.dialog.cancel.confirm": "হ্যাঁ, বাতিল করুন",
+  "orderDetail.dialog.cancel.keep": "অর্ডার রাখুন",
+  "orderDetail.cancel.loading": "অর্ডার বাতিল করা হচ্ছে...",
+  "orderDetail.cancel.success": "অর্ডার সফলভাবে বাতিল করা হয়েছে!",
+  "orderDetail.cancel.error": "অর্ডার বাতিল করতে ব্যর্থ হয়েছে। আবার চেষ্টা করুন।",
+  "orderDetail.cancel.network": "নেটওয়ার্ক ত্রুটি। আপনার সংযোগ পরীক্ষা করে আবার চেষ্টা করুন।",
+  "orderDetail.payment.success": "পেমেন্ট সফল হয়েছে",
   "addressBook.delete.confirm": "মুছে ফেলা নিশ্চিত করুন",
   "addressBook.delete.message": "আপনি কি এই ঠিকানাটি মুছে ফেলতে চান?",
   "addressBook.delete.button": "মুছুন",

+ 36 - 0
src/locale/en.json

@@ -28,6 +28,42 @@
   "addressBook.operate.error.loadPage": "Page load failed",
   "addressBook.delete.deleting": "Deleting...",
   "addressBook.delete.success": "Address deleted successfully",
+  "myOrders.title": "My Orders",
+  "myOrders.tab.all": "All",
+  "myOrders.tab.toPay": "To Pay",
+  "myOrders.tab.success": "Success",
+  "myOrders.tab.failed": "Failed",
+  "myOrders.tab.reward": "Reward",
+  "myOrders.order.id": "Order ID",
+  "myOrders.order.color": "Color",
+  "myOrders.order.quantity": "Quantity",
+  "orderDetail.title": "Order Detail",
+  "orderDetail.loading": "Loading...",
+  "orderDetail.congrats": "Congrats, You won the prize in this group!",
+  "orderDetail.receiveReward": "You have received group opening reward",
+  "orderDetail.sorry": "So sorry, You didn't win in this group",
+  "orderDetail.waiting": "Please wait for the draw of this group",
+  "orderDetail.paymentCountdown": "Please make payment within:",
+  "orderDetail.address.add": "Please provide your shipping address",
+  "orderDetail.address.name": "Recipient",
+  "orderDetail.address.orderNo": "Order ID",
+  "orderDetail.address.color": "Color",
+  "orderDetail.address.quantity": "Quantity",
+  "orderDetail.summary.title": "Order Summary",
+  "orderDetail.summary.subtotal": "SubTotal",
+  "orderDetail.payment.title": "Paid by",
+  "orderDetail.payment.placedOn": "Placed on",
+  "orderDetail.button.cancel": "Cancel",
+  "orderDetail.button.share": "Share Now",
+  "orderDetail.button.pay": "Pay Now",
+  "orderDetail.dialog.cancel.title": "Are you sure you want to cancel this order?",
+  "orderDetail.dialog.cancel.confirm": "Yes, Cancel",
+  "orderDetail.dialog.cancel.keep": "Keep Order",
+  "orderDetail.cancel.loading": "Cancelling order...",
+  "orderDetail.cancel.success": "Order cancelled successfully!",
+  "orderDetail.cancel.error": "Failed to cancel order. Please try again.",
+  "orderDetail.cancel.network": "Network error. Please check your connection and try again.",
+  "orderDetail.payment.success": "Payment Successful",
   "addressBook.delete.confirm": "Confirm Delete",
   "addressBook.delete.message": "Are you sure you want to delete this address?",
   "addressBook.delete.button": "Delete",

+ 36 - 0
src/locale/zh-Hans.json

@@ -28,6 +28,42 @@
   "addressBook.operate.error.loadPage": "页面加载失败",
   "addressBook.delete.deleting": "删除中...",
   "addressBook.delete.success": "地址删除成功",
+  "myOrders.title": "我的订单",
+  "myOrders.tab.all": "全部",
+  "myOrders.tab.toPay": "待支付",
+  "myOrders.tab.success": "成功",
+  "myOrders.tab.failed": "失败",
+  "myOrders.tab.reward": "奖励",
+  "myOrders.order.id": "订单号",
+  "myOrders.order.color": "颜色",
+  "myOrders.order.quantity": "数量",
+  "orderDetail.title": "订单详情",
+  "orderDetail.loading": "加载中...",
+  "orderDetail.congrats": "恭喜,您在这个团中中奖了!",
+  "orderDetail.receiveReward": "您已收到团购开团奖励",
+  "orderDetail.sorry": "抱歉,您在这个团中未中奖",
+  "orderDetail.waiting": "请等待本团开奖",
+  "orderDetail.paymentCountdown": "请在以下时间内完成支付:",
+  "orderDetail.address.add": "请填写收货地址",
+  "orderDetail.address.name": "收件人",
+  "orderDetail.address.orderNo": "订单号",
+  "orderDetail.address.color": "颜色",
+  "orderDetail.address.quantity": "数量",
+  "orderDetail.summary.title": "订单汇总",
+  "orderDetail.summary.subtotal": "小计",
+  "orderDetail.payment.title": "支付方式",
+  "orderDetail.payment.placedOn": "下单时间",
+  "orderDetail.button.cancel": "取消",
+  "orderDetail.button.share": "立即分享",
+  "orderDetail.button.pay": "立即支付",
+  "orderDetail.dialog.cancel.title": "确定要取消此订单吗?",
+  "orderDetail.dialog.cancel.confirm": "是,取消订单",
+  "orderDetail.dialog.cancel.keep": "保留订单",
+  "orderDetail.cancel.loading": "正在取消订单...",
+  "orderDetail.cancel.success": "订单已成功取消!",
+  "orderDetail.cancel.error": "取消订单失败,请重试。",
+  "orderDetail.cancel.network": "网络错误,请检查网络连接后重试。",
+  "orderDetail.payment.success": "支付成功",
   "addressBook.delete.confirm": "确认删除",
   "addressBook.delete.message": "确定要删除这个地址吗?",
   "addressBook.delete.button": "删除",

+ 2 - 2
src/pages.json

@@ -164,7 +164,7 @@
       "type": "page",
       "layout": "default",
       "style": {
-        "navigationBarTitleText": "My Orders",
+        "navigationBarTitleText": "%myOrders.title%",
         "navigationBarBackgroundColor": "#fff"
       }
     },
@@ -173,7 +173,7 @@
       "type": "page",
       "layout": "default",
       "style": {
-        "navigationBarTitleText": "My Orders",
+        "navigationBarTitleText": "%orderDetail.title%",
         "navigationBarBackgroundColor": "#fff"
       }
     },

+ 11 - 10
src/pages/myOrders/myOrders.vue

@@ -2,7 +2,7 @@
 {
   layout: 'default',
   style: {
-    navigationBarTitleText: 'My Orders',
+    navigationBarTitleText: '%myOrders.title%',
     navigationBarBackgroundColor: '#fff',
   },
 }
@@ -14,6 +14,7 @@
 import { onPageScroll, onReachBottom } from '@dcloudio/uni-app'
 import useZPaging from 'z-paging/components/z-paging/js/hooks/useZPaging.js'
 import { orderList, orderStatusEnum } from '@/api/order'
+import { t } from '@/locale'
 import { formatNumber } from '@/utils'
 import { getPageParams, toPage } from '@/utils/page'
 
@@ -31,23 +32,23 @@ useZPaging(paging)
 const tab = ref<number>(0)
 const tabList = ref<any>([
   {
-    label: 'All',
+    label: 'myOrders.tab.all',
     value: 0,
   },
   {
-    label: 'To pay',
+    label: 'myOrders.tab.toPay',
     value: 1,
   },
   {
-    label: 'Success',
+    label: 'myOrders.tab.success',
     value: 2,
   },
   {
-    label: 'Failed',
+    label: 'myOrders.tab.failed',
     value: 3,
   },
   {
-    label: 'Reward',
+    label: 'myOrders.tab.reward',
     value: 4,
   },
 ])
@@ -101,14 +102,14 @@ onLoad((options) => {
   <z-paging ref="paging" v-model="dataList" use-page-scroll @query="queryList">
     <template #top>
       <wd-tabs v-model="tab" custom-class="bg-transparent!" @click="() => queryList(1, 20)">
-        <wd-tab v-for="tabItem in tabList" :key="tabItem.value" :title="tabItem.label" :name="tabItem.value" />
+        <wd-tab v-for="tabItem in tabList" :key="tabItem.value" :title="t(tabItem.label)" :name="tabItem.value" />
       </wd-tabs>
     </template>
     <wd-card v-for="item in dataList" :key="item.orderId" type="rectangle" custom-class="px-24rpx! py-6rpx!" custom-content-class="py-18rpx!" custom-title-class="py-18rpx!" @click="toPage('/pages/myOrders/orderDetail', { id: item.id })">
       <template #title>
         <view class="flex items-center justify-between">
           <view class="text-28rpx text-#000">
-            Order ID:{{ item.orderId }}
+            {{ $t('myOrders.order.id') }}:{{ item.orderId }}
           </view>
           <wd-text size="26rpx" type="primary" :text="orderStatusEnumData.find((i:any) => i.code === item.status)?.name" />
         </view>
@@ -126,14 +127,14 @@ onLoad((options) => {
             {{ item?.orderInfoVO?.[0]?.productName }}
           </view>
           <view class="py-4rpx text-24rpx text-#3A444C">
-            Color: {{ item?.orderInfoVO?.[0]?.sku }}
+            {{ $t('myOrders.order.color') }}: {{ item?.orderInfoVO?.[0]?.sku }}
           </view>
           <view class="flex items-center justify-between text-24rpx text-#3A444C">
             <view>
               ৳ {{ formatNumber(item?.orderInfoVO?.[0]?.price) }}
             </view>
             <view>
-              Quantity:{{ item?.orderInfoVO?.[0]?.payNum }}
+              {{ $t('myOrders.order.quantity') }}:{{ item?.orderInfoVO?.[0]?.payNum }}
             </view>
           </view>
         </view>

+ 109 - 49
src/pages/myOrders/orderDetail.vue

@@ -2,7 +2,7 @@
 {
   layout: 'default',
   style: {
-    navigationBarTitleText: 'My Orders',
+    navigationBarTitleText: '%orderDetail.title%',
     navigationBarBackgroundColor: '#fff',
   },
 }
@@ -13,13 +13,15 @@ import { getConfigByCode } from '@/api/common'
 import { orderCancel, orderDetail, orderPink, orderStatusEnum, payOrder } from '@/api/order'
 import DialogBox from '@/components/DialogBox/DialogBox.vue'
 import { DialogUtils } from '@/components/DialogBox/utils'
+import { t } from '@/locale'
 import { formatNumber } from '@/utils'
 import { getPageParams, toPage } from '@/utils/page'
-import { toast } from '@/utils/toast'
+import { showToast, toast } from '@/utils/toast'
 
 defineOptions({
   name: 'OrderDetail', // 订单详情
 })
+
 // z-paging
 const paging = ref(null)
 
@@ -28,6 +30,8 @@ const detail = ref<any>({})
 const orderStatusEnumData = ref<any>([])
 const openRedEnvelopeRate = ref<any>()
 const joinRedEnvelopeRate = ref<any>()
+const countdown = ref('00:00')
+const timer = ref()
 
 // DialogBox 函数式调用配置
 const dialogConfig = ref<any>({})
@@ -64,21 +68,58 @@ async function getOrderStatus() {
 
   }
 }
+function startCountdown() {
+  // 清除之前的定时器
+  if (timer.value)
+    clearInterval(timer.value)
+
+  if (!detail.value?.createTime || detail.value?.status !== 1) {
+    countdown.value = '00:00'
+    return
+  }
+
+  // 计算过期时间(创建时间 + 20分钟)
+  const createTime = new Date(detail.value.createTime).getTime()
+  const expireTime = createTime + 20 * 60 * 1000
+
+  timer.value = setInterval(() => {
+    const now = Date.now()
+    const diff = expireTime - now
+
+    if (diff <= 0) {
+      clearInterval(timer.value)
+      countdown.value = '00:00'
+      getDetail() // 刷新订单状态
+      return
+    }
+
+    const minutes = Math.floor(diff / 1000 / 60)
+    const seconds = Math.floor((diff / 1000) % 60)
+    countdown.value = `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`
+  }, 1000)
+}
+
 async function getDetail() {
-  getPink()
+  uni.showLoading({
+    title: t('orderDetail.loading'),
+  })
   try {
     const res = await orderDetail({ id: id.value })
     if (res.code === '200') {
       detail.value = res.data
+      startCountdown() // 开始倒计时
+      await getPink()
       paging.value.complete()
     }
   }
-  catch {}
+  finally {
+    uni.hideLoading()
+  }
 }
 const pinkList = ref<any>([])
 async function getPink() {
   try {
-    const res = await orderPink({ id: id.value })
+    const res = await orderPink({ id: detail.value?.storePink?.id })
     if (res.code === '200') {
       pinkList.value = res.data
     }
@@ -87,33 +128,23 @@ async function getPink() {
 
   }
 }
-onLoad(async (options) => {
-  getConfig('open_red_envelope_rate')
-  getConfig('join_red_envelope_rate')
-  const params = getPageParams(options)
-  id.value = params.id
-  await getOrderStatus()
-})
-onShow(() => {
-  getDetail()
-})
 
 // 跳转到地址簿选择地址
 function selectAddress() {
   toPage('/pages/mine/addressBook', {
     selectMode: true,
-    orderId: id.value,
+    orderId: detail.value?.orderId,
   })
 }
 
 // 显示取消订单确认对话框
 function showCancelOrderDialog() {
   Object.assign(dialogConfig.value, DialogUtils.info(
-    'Are you sure you want to cancel this order?',
+    t('orderDetail.dialog.cancel.title'),
     {
       showCancel: true,
-      confirmText: 'Yes, Cancel',
-      cancelText: 'Keep Order',
+      confirmText: t('orderDetail.dialog.cancel.confirm'),
+      cancelText: t('orderDetail.dialog.cancel.keep'),
     },
   ))
 }
@@ -122,27 +153,28 @@ function showCancelOrderDialog() {
 async function cancelOrder() {
   try {
     uni.showLoading({
-      title: 'Cancelling order...',
+      title: t('orderDetail.cancel.loading'),
+      mask: true,
     })
 
     const res = await orderCancel({ id: id.value })
 
     if (res.code === '200') {
       // 显示成功提示
-      toast.success('Order cancelled successfully!')
+      toast.success(t('orderDetail.cancel.success'))
 
       // 刷新订单详情
       getDetail()
     }
     else {
       // 显示错误提示
-      toast.error(res.message || 'Failed to cancel order. Please try again.')
+      toast.error(res.message || t('orderDetail.cancel.error'))
     }
   }
   catch (error: any) {
     console.error('Cancel order error:', error)
     // 显示错误提示
-    toast.error('Network error. Please check your connection and try again.')
+    toast.error(t('orderDetail.cancel.network'))
   }
   finally {
     uni.hideLoading()
@@ -176,50 +208,76 @@ async function handleClick() {
       type: detail.value?.storePink?.kId ? 'open' : 'join',
     })
     console.log(payRes)
+    if (payRes.code === '200') {
+      showToast({
+        message: t('orderDetail.payment.success'),
+        icon: 'success',
+      })
+      getDetail()
+    }
   }
   else {
     // 去分享
   }
 }
+const timeMap = {
+  create_order: 'placed on',
+  pay_success: 'paid on',
+  delivery: 'shipped on',
+  receive: 'completed on',
+}
+onLoad(async (options) => {
+  getConfig('open_red_envelope_rate')
+  getConfig('join_red_envelope_rate')
+  const params = getPageParams(options)
+  id.value = params.id
+  await getOrderStatus()
+})
+onShow(() => {
+  getDetail()
+})
+
+onUnmounted(() => {
+  if (timer.value)
+    clearInterval(timer.value)
+})
 </script>
 
 <template>
   <z-paging ref="paging" refresher-only @refresh="getDetail">
     <view class="pt-20rpx">
       <!-- 状态显示 -->
-      <template v-if="detail.status !== 4">
+      <template v-if="detail.status !== 4 && detail?.status !== 2">
         <!-- 已中奖 -->
         <view v-if="detail?.storePink?.status === 2 && detail?.storePink?.lId === 1" class="mb-20rpx bg-#17AA68/80 py-20rpx text-center text-28rpx text-white">
-          Congrats,You won the prize in this group!已中奖
+          {{ t('orderDetail.congrats') }}
           <br>
-          You have received
+          {{ t('orderDetail.receiveReward') }}
           <text class="text-[var(--wot-color-theme)]">
             ৳{{ 10 }}
           </text>
-          group opening reward
         </view>
         <!-- 未中奖 -->
         <view v-else-if="detail?.storePink?.status === 2 && detail?.storePink?.lId === 0" class="mb-20rpx bg-#E61B28/80 py-20rpx text-center text-28rpx text-white">
-          So sorry, You didn't win in this group
+          {{ t('orderDetail.sorry') }}
           <br>
-          You have received
+          {{ t('orderDetail.receiveReward') }}
           <text class="text-#66C59B">
             ৳8
           </text>
-          group opening reward
         </view>
         <!-- 未开奖||未支付 -->
         <view v-else-if="detail?.storePink?.status === 1 || detail?.status === 1" class="mb-20rpx bg-#fff py-20rpx text-center text-28rpx text-white">
           <text v-if="detail?.storePink?.status === 1 && detail?.status !== 1" class="text-[var(--wot-color-theme)]">
-            Please wait for the draw of this group
+            {{ t('orderDetail.waiting') }}
           </text>
           <text v-else class="text-[var(--wot-color-theme)]">
-            Please make payment within:29:59
+            {{ t('orderDetail.paymentCountdown') }} {{ countdown }}
           </text>
         </view>
         <!-- 拼团头像 -->
-        <view class="mb-20rpx bg-white px-20rpx py-20rpx text-center">
-          <image v-for="i in 10" :key="i" class="mx-4rpx mb-8rpx h-80rpx w-80rpx rounded-full" src="/static/images/avatar.jpg" />
+        <view v-if="pinkList.length" class="mb-20rpx bg-white px-20rpx py-20rpx text-center">
+          <image v-for="i in pinkList" :key="i" class="mx-4rpx mb-8rpx h-80rpx w-80rpx rounded-full" :src="i.avatar" />
         </view>
       </template>
       <!-- 地址 -->
@@ -228,14 +286,14 @@ async function handleClick() {
         <template v-if="!detail.orderAddressVO">
           <view class="flex items-center justify-between" @click="selectAddress">
             <view class="text-28rpx text-[var(--wot-color-theme)]">
-              Please provide your shipping address
+              {{ t('orderDetail.address.add') }}
             </view>
             <wd-icon name="arrow-right" color="#7D7D7D" size="28rpx" />
           </view>
         </template>
         <!-- 有地址 -->
         <template v-else>
-          <view class="mb-18rpx flex justify-between border-b-1 border-b-#E1E1E1 border-b-solid pb-18rpx text-24rpx">
+          <view v-if="detail.deliveryCode" class="mb-18rpx flex justify-between border-b-1 border-b-#E1E1E1 border-b-solid pb-18rpx text-24rpx">
             <!-- 物流信息 -->
             <view>{{ detail.deliveryName }}</view>
             <view> DHL:{{ detail.deliveryCode || '-' }}</view>
@@ -256,7 +314,7 @@ async function handleClick() {
         <template #title>
           <view class="flex items-center justify-between">
             <view class="text-28rpx text-#000">
-              Order ID:{{ detail?.orderInfoVO?.[0].orderNo }}
+              {{ t('orderDetail.address.orderNo') }}:{{ detail?.orderInfoVO?.[0].orderNo }}
             </view>
             <wd-text size="26rpx" type="primary" :text="orderStatusEnumData.find((i:any) => i.code === detail?.status)?.name" />
           </view>
@@ -274,14 +332,14 @@ async function handleClick() {
               {{ detail?.orderInfoVO?.[0].productName }}
             </view>
             <view class="py-4rpx text-24rpx text-#3A444C">
-              Color:{{ detail?.orderInfoVO?.[0].sku }}
+              {{ t('orderDetail.address.color') }}:{{ detail?.orderInfoVO?.[0].sku }}
             </view>
             <view class="flex items-center justify-between text-24rpx">
               <view class="text-[var(--wot-color-theme)]">
                 ৳ {{ formatNumber(detail?.orderInfoVO?.[0].price) }}
               </view>
               <view class="text-#3A444C">
-                Quantity:{{ detail?.orderInfoVO?.[0].payNum }}
+                {{ t('orderDetail.address.quantity') }}:{{ detail?.orderInfoVO?.[0].payNum }}
               </view>
             </view>
           </view>
@@ -291,7 +349,7 @@ async function handleClick() {
       <view class="bg-white px-24rpx">
         <view class="border-b-1 border-b-#E1E1E1 border-b-solid py-24rpx">
           <view class="mb-12rpx text-28rpx">
-            Oder Summary
+            {{ t('orderDetail.summary.title') }}
           </view>
           <view class="flex flex-col gap-16rpx text-#3A444C">
             <view class="flex items-center justify-between text-24rpx">
@@ -302,7 +360,7 @@ async function handleClick() {
         </view>
         <view class="border-b-1 border-b-#E1E1E1 border-b-solid py-24rpx">
           <view class="mb-12rpx text-28rpx">
-            Paid by
+            {{ t('orderDetail.payment.title') }}
           </view>
           <view class="flex flex-col gap-16rpx text-#3A444C">
             <view class="flex items-center justify-between text-24rpx">
@@ -311,13 +369,15 @@ async function handleClick() {
             </view>
           </view>
         </view>
-        <view class="py-24rpx">
-          <view class="flex flex-col gap-16rpx text-#3A444C">
-            <view class="flex items-center justify-between text-24rpx">
-              <text>Placed on</text>
-              <text>{{ detail.createTime }}</text>
+        <view v-if="detail?.orderStatusVO.length" class="py-24rpx">
+          <template v-for="i in detail?.orderStatusVO" :key="i.id">
+            <view v-if="timeMap[i.changeType]" class="mb-16rpx flex flex-col text-#3A444C">
+              <view class="flex items-center justify-between text-24rpx">
+                <text>{{ timeMap[i.changeType] }}</text>
+                <text>{{ i.createTime }}</text>
+              </view>
             </view>
-          </view>
+          </template>
         </view>
       </view>
     </view>
@@ -330,10 +390,10 @@ async function handleClick() {
           plain
           @click="showCancelOrderDialog"
         >
-          Cancel
+          {{ t('orderDetail.button.cancel') }}
         </wd-button>
         <wd-button @click="handleClick">
-          {{ detail?.status !== 1 ? 'Share Now' : 'Pay Now' }}
+          {{ detail?.status !== 1 ? t('orderDetail.button.share') : t('orderDetail.button.pay') }}
         </wd-button>
       </view>
     </template>