Эх сурвалжийг харах

feat(i18n): implement internationalization for admin, merchant, and buffet views

- Replace hardcoded text with translation keys in multiple views
- Update locale files for en, ja, zh-Hans, zh-Hant
- Integrate useI18n in merchant, admin, and buffet components
FanLide 2 долоо хоног өмнө
parent
commit
122bba45aa

+ 1 - 1
package-lock.json

@@ -16,7 +16,7 @@
         "pinia": "^2.1.7",
         "pinia-plugin-persistedstate": "^3.2.1",
         "socket.io-client": "^4.7.2",
-        "vant": "^4.6.2",
+        "vant": "^4.9.22",
         "vue": "^3.4.21",
         "vue-i18n": "^9.14.2",
         "vue-router": "^4.3.0"

+ 1 - 1
package.json

@@ -17,7 +17,7 @@
     "pinia": "^2.1.7",
     "pinia-plugin-persistedstate": "^3.2.1",
     "socket.io-client": "^4.7.2",
-    "vant": "^4.6.2",
+    "vant": "^4.9.22",
     "vue": "^3.4.21",
     "vue-i18n": "^9.14.2",
     "vue-router": "^4.3.0"

+ 117 - 10
src/locale/en.json

@@ -112,11 +112,30 @@
     "ordered": "Ordered",
     "items": "Items",
     "clear": "Clear",
+    "delete": "Delete",
     "checkout": "Confirm Order",
+    "submitOrder": "Submit Order",
     "confirmClear": "Clear cart?",
-    "emptyCart": "Please select items first",
+    "emptyCart": "Cart is empty",
+    "goShopping": "Go Shopping",
     "total": "Total",
-    "amountToPay": "Payable"
+    "amountToPay": "Payable",
+    "selectAll": "Select All",
+    "coupon": "Coupon",
+    "couponSelected": "Coupon selected",
+    "noCoupon": "No coupon available",
+    "orderNote": "Enter order note",
+    "selectGoods": "Please select items",
+    "deleted": "Deleted",
+    "confirmDelete": "Delete this item?",
+    "confirmSubmit": "Submit order?",
+    "orderSubmitted": "Order submitted!",
+    "mockCoupon": {
+      "condition": "Min ¥100",
+      "name": "New User Coupon",
+      "description": "First order only",
+      "value": "10"
+    }
   },
   "order": {
     "title": "Orders",
@@ -228,6 +247,24 @@
       "table": "Table",
       "my": "Mine"
     },
+    "dashboard": {
+      "title": "Merchant Dashboard",
+      "myShop": "My Shop",
+      "operating": "Operating",
+      "resting": "Resting",
+      "todayData": "Today's Data",
+      "todayRevenue": "Today's Revenue",
+      "todayOrders": "Today's Orders",
+      "todayTakeout": "Today's Takeout",
+      "todayDineIn": "Today's Dine-in",
+      "orderStats": "Order Statistics",
+      "pending": "Pending",
+      "preparing": "Preparing",
+      "delivering": "Delivering",
+      "completed": "Completed",
+      "loadFailed": "Load Failed",
+      "orderManagementInDev": "Order management in development"
+    },
     "index": {
       "merchantCenter": "Merchant Center",
       "operating": "Operating",
@@ -239,11 +276,16 @@
       "pendingMeals": "Preparing Meals"
     },
     "order": {
-      "title": "Orders",
+      "title": "Order Management",
+      "list": "Orders",
+      "customer": "Customer",
+      "itemsCount": "and {count} more",
+      "accepted": "Accepted",
       "status": {
         "all": "All",
         "pending": "Pending",
         "preparing": "Preparing",
+        "delivering": "Delivering",
         "completed": "Completed",
         "cancelled": "Cancelled"
       },
@@ -251,11 +293,35 @@
         "accept": "Accept",
         "serve": "Serve",
         "complete": "Complete"
+      },
+      "mockData": {
+        "customerName": "John",
+        "kungPao": "Kung Pao Chicken",
+        "rice": "Rice"
       }
     }
   },
   "admin": {
-    "dashboard": "Admin Dash",
+    "dashboard": {
+      "title": "Admin Dashboard",
+      "welcome": "Welcome to Admin Dashboard",
+      "systemAdmin": "System Administrator",
+      "platformStats": "Platform Statistics",
+      "totalUsers": "Total Users",
+      "totalMerchants": "Total Merchants",
+      "todayOrders": "Today's Orders",
+      "totalRevenue": "Total Revenue",
+      "quickActions": "Quick Actions",
+      "userManagement": "User Management",
+      "merchantManagement": "Merchant Management",
+      "systemSettings": "System Settings",
+      "dataStatistics": "Data Statistics",
+      "operationLog": "Operation Log",
+      "dataExport": "Data Export",
+      "loadFailed": "Load Failed",
+      "userManagementInDev": "User management in development",
+      "merchantManagementInDev": "Merchant management in development"
+    },
     "users": "Users",
     "merchants": "Merchants",
     "searchUser": "Search user/phone",
@@ -406,16 +472,57 @@
   "acceptOrder": "Accept",
   "completeOrder": "Complete",
   "buffet": {
-    "title": "All-You-Can-Eat",
-    "selectPlan": "Select Plan",
+    "title": "All-You-Can-Eat Mode",
+    "select": {
+      "title": "Select Buffet Plan",
+      "subtitle": "Unlimited Food & Drinks",
+      "description": "Choose your favorite buffet plan and start your culinary journey",
+      "recommended": "Recommended",
+      "perPerson": "/person",
+      "minutes": "minutes",
+      "unlimitedOrder": "Unlimited Orders",
+      "maxOrders": "Max {count} orders",
+      "drinksIncluded": "Drinks Included",
+      "guestCount": "Number of Guests",
+      "subtotal": "Subtotal",
+      "total": "Total",
+      "startBuffet": "Start Buffet",
+      "confirmTitle": "Confirm Start Buffet",
+      "confirmMessage": "Plan: {plan}\nGuests: {count}\nAmount: ¥{amount}\n\nTimer will start immediately. Confirm?"
+    },
+    "menu": {
+      "title": "Buffet Menu",
+      "timeExpired": "Buffet time has expired",
+      "orderLimitReached": "Order limit reached ({current}/{max})",
+      "cannotOrder": "Cannot order now",
+      "orderedCount": "Ordered",
+      "times": "times",
+      "remainingOrders": "Remaining Orders",
+      "buffetTag": "Buffet",
+      "selectedItems": "{count} items selected",
+      "confirmOrder": "Confirm Order",
+      "confirmOrderTitle": "Confirm Order",
+      "confirmOrderMessage": "Ordering {count} dishes",
+      "orderCountInfo": "Order count: {current}/{max}",
+      "cartNotEmptyTitle": "Notice",
+      "cartNotEmpty": "Items remain in cart. Sure to leave?",
+      "categories": {
+        "hotDishes": "Hot Dishes",
+        "sushi": "Sushi"
+      },
+      "dishes": {
+        "kungPao": "Kung Pao Chicken",
+        "mapo": "Mapo Tofu",
+        "salmonSushi": "Salmon Sushi",
+        "tunaSushi": "Tuna Sushi"
+      }
+    },
     "remaining": "Time Left",
     "pause": "Pause",
     "resume": "Resume",
     "endEarly": "End Early",
-    "timeUp": "Time's up!",
-    "cannotOrder": "Cannot order",
-    "confirmOrder": "Confirm",
-    "orderSuccess": "Success!"
+    "timeUp": "Time's up! Thank you for dining with us",
+    "orderSuccess": "Order Success!"
   },
   "role": {
     "customer": "Customer",

+ 115 - 8
src/locale/ja.json

@@ -112,11 +112,30 @@
     "ordered": "注文済",
     "items": "点",
     "clear": "クリア",
+    "delete": "削除",
     "checkout": "注文確定",
+    "submitOrder": "注文を送信",
     "confirmClear": "カートを空にしますか",
-    "emptyCart": "先に商品を選んでください",
+    "emptyCart": "カートは空です",
+    "goShopping": "買い物に行く",
     "total": "合計",
-    "amountToPay": "支払額"
+    "amountToPay": "支払額",
+    "selectAll": "すべて選択",
+    "coupon": "クーポン",
+    "couponSelected": "クーポンを選択しました",
+    "noCoupon": "利用可能なクーポンなし",
+    "orderNote": "注文メモを入力してください",
+    "selectGoods": "商品を選択してください",
+    "deleted": "削除しました",
+    "confirmDelete": "この商品を削除してもよろしいですか?",
+    "confirmSubmit": "注文を送信してもよろしいですか?",
+    "orderSubmitted": "注文が送信されました!",
+    "mockCoupon": {
+      "condition": "100元以上で利用可能",
+      "name": "新規ユーザークーポン",
+      "description": "初回注文のみ利用可能",
+      "value": "10"
+    }
   },
   "order": {
     "title": "注文履歴",
@@ -228,6 +247,24 @@
       "table": "テーブル",
       "my": "マイ"
     },
+    "dashboard": {
+      "title": "店舗ダッシュボード",
+      "myShop": "私の店舗",
+      "operating": "営業中",
+      "resting": "休憩中",
+      "todayData": "本日のデータ",
+      "todayRevenue": "本日の売上",
+      "todayOrders": "本日の注文",
+      "todayTakeout": "本日のテイクアウト",
+      "todayDineIn": "本日の店内飲食",
+      "orderStats": "注文統計",
+      "pending": "受付待ち",
+      "preparing": "調理中",
+      "delivering": "配送中",
+      "completed": "完了",
+      "loadFailed": "読み込み失敗",
+      "orderManagementInDev": "注文管理機能は開発中です"
+    },
     "index": {
       "merchantCenter": "店舗センター",
       "operating": "営業中",
@@ -239,11 +276,16 @@
       "pendingMeals": "調理待ち"
     },
     "order": {
-      "title": "注文一覧",
+      "title": "注文管理",
+      "list": "注文一覧",
+      "customer": "お客様",
+      "itemsCount": "など{count}品",
+      "accepted": "受付済み",
       "status": {
         "all": "すべて",
         "pending": "受付待ち",
-        "preparing": "調理待ち",
+        "preparing": "調理中",
+        "delivering": "配送中",
         "completed": "完了",
         "cancelled": "キャンセル"
       },
@@ -251,11 +293,35 @@
         "accept": "受付",
         "serve": "提供",
         "complete": "完了"
+      },
+      "mockData": {
+        "customerName": "田中",
+        "kungPao": "宮保鶏丁",
+        "rice": "ご飯"
       }
     }
   },
   "admin": {
-    "dashboard": "管理画面",
+    "dashboard": {
+      "title": "管理画面",
+      "welcome": "管理画面へようこそ",
+      "systemAdmin": "システム管理者",
+      "platformStats": "プラットフォーム統計",
+      "totalUsers": "総ユーザー数",
+      "totalMerchants": "総店舗数",
+      "todayOrders": "本日の注文",
+      "totalRevenue": "総売上",
+      "quickActions": "クイックアクション",
+      "userManagement": "ユーザー管理",
+      "merchantManagement": "店舗管理",
+      "systemSettings": "システム設定",
+      "dataStatistics": "データ統計",
+      "operationLog": "操作ログ",
+      "dataExport": "データエクスポート",
+      "loadFailed": "読み込み失敗",
+      "userManagementInDev": "ユーザー管理機能は開発中です",
+      "merchantManagementInDev": "店舗管理機能は開発中です"
+    },
     "users": "ユーザー管理",
     "merchants": "加盟店管理",
     "searchUser": "ユーザー名/電話番号を検索",
@@ -407,14 +473,55 @@
   "completeOrder": "完了",
   "buffet": {
     "title": "食べ放題モード",
-    "selectPlan": "食べ放題プランを選択",
+    "select": {
+      "title": "食べ放題プランを選択",
+      "subtitle": "飲み放題・食べ放題 無限に楽しむ",
+      "description": "お好みの食べ放題プランを選択して、グルメの旅を始めましょう",
+      "recommended": "おすすめ",
+      "perPerson": "/人",
+      "minutes": "分",
+      "unlimitedOrder": "無限注文",
+      "maxOrders": "最大{count}回注文",
+      "drinksIncluded": "飲み物込み",
+      "guestCount": "人数",
+      "subtotal": "小計",
+      "total": "合計",
+      "startBuffet": "食べ放題を開始",
+      "confirmTitle": "食べ放題開始確認",
+      "confirmMessage": "プラン: {plan}\n人数: {count}人\n金額: ¥{amount}\n\n開始後すぐに時間計測を開始します。よろしいですか?"
+    },
+    "menu": {
+      "title": "食べ放題メニュー",
+      "timeExpired": "食べ放題時間が終了しました",
+      "orderLimitReached": "注文回数上限に達しました ({current}/{max})",
+      "cannotOrder": "現在注文できません",
+      "orderedCount": "注文済み",
+      "times": "回",
+      "remainingOrders": "残り回数",
+      "buffetTag": "食べ放題",
+      "selectedItems": "{count}品選択済み",
+      "confirmOrder": "注文確認",
+      "confirmOrderTitle": "注文確認",
+      "confirmOrderMessage": "今回の注文: {count}品",
+      "orderCountInfo": "注文回数: {current}/{max}",
+      "cartNotEmptyTitle": "お知らせ",
+      "cartNotEmpty": "カートに商品が残っています。本当に戻りますか?",
+      "categories": {
+        "hotDishes": "熱菜",
+        "sushi": "寿司"
+      },
+      "dishes": {
+        "kungPao": "宮保鶏丁",
+        "mapo": "麻婆豆腐",
+        "salmonSushi": "サーモン寿司",
+        "tunaSushi": "マグロ寿司"
+      }
+    },
     "remaining": "残り時間",
     "pause": "一時停止",
     "resume": "再開",
     "endEarly": "早期終了",
     "timeUp": "食べ放題時間終了!ご来店ありがとうございました",
-    "cannotOrder": "現在注文できません",
-    "confirmOrder": "注文確認",
     "orderSuccess": "注文成功!"
   },
   "role": {

+ 115 - 8
src/locale/zh-Hans.json

@@ -112,11 +112,30 @@
     "ordered": "已点",
     "items": "份",
     "clear": "清空",
+    "delete": "删除",
     "checkout": "确定下单",
+    "submitOrder": "提交订单",
     "confirmClear": "确定清空购物车么",
-    "emptyCart": "请先去点餐哦",
+    "emptyCart": "购物车是空的",
+    "goShopping": "去逛逛",
     "total": "合计",
-    "amountToPay": "应付"
+    "amountToPay": "应付",
+    "selectAll": "全选",
+    "coupon": "优惠券",
+    "couponSelected": "已选择优惠券",
+    "noCoupon": "暂无可用",
+    "orderNote": "请输入订单备注",
+    "selectGoods": "请选择商品",
+    "deleted": "已删除",
+    "confirmDelete": "确定要删除这个商品吗?",
+    "confirmSubmit": "确认提交订单吗?",
+    "orderSubmitted": "订单提交成功!",
+    "mockCoupon": {
+      "condition": "满100元可用",
+      "name": "新用户优惠券",
+      "description": "仅限首次下单使用",
+      "value": "10"
+    }
   },
   "order": {
     "title": "订单",
@@ -228,6 +247,24 @@
       "table": "桌台",
       "my": "我的"
     },
+    "dashboard": {
+      "title": "商家仪表盘",
+      "myShop": "我的店铺",
+      "operating": "营业中",
+      "resting": "休息中",
+      "todayData": "今日数据",
+      "todayRevenue": "今日营业额",
+      "todayOrders": "今日订单",
+      "todayTakeout": "今日外卖",
+      "todayDineIn": "今日堂食",
+      "orderStats": "订单统计",
+      "pending": "待接单",
+      "preparing": "制作中",
+      "delivering": "配送中",
+      "completed": "已完成",
+      "loadFailed": "加载失败",
+      "orderManagementInDev": "订单管理功能开发中"
+    },
     "index": {
       "merchantCenter": "商户中心",
       "operating": "营业中",
@@ -239,11 +276,16 @@
       "pendingMeals": "待出餐"
     },
     "order": {
-      "title": "订单列表",
+      "title": "订单管理",
+      "list": "订单列表",
+      "customer": "顾客",
+      "itemsCount": "等{count}件",
+      "accepted": "已接单",
       "status": {
         "all": "全部",
         "pending": "待接单",
-        "preparing": "待出餐",
+        "preparing": "制作中",
+        "delivering": "配送中",
         "completed": "已完成",
         "cancelled": "已取消"
       },
@@ -251,11 +293,35 @@
         "accept": "接单",
         "serve": "出餐",
         "complete": "完成"
+      },
+      "mockData": {
+        "customerName": "张三",
+        "kungPao": "宫保鸡丁",
+        "rice": "米饭"
       }
     }
   },
   "admin": {
-    "dashboard": "管理后台",
+    "dashboard": {
+      "title": "管理后台",
+      "welcome": "欢迎来到管理后台",
+      "systemAdmin": "系统管理员",
+      "platformStats": "平台统计",
+      "totalUsers": "总用户数",
+      "totalMerchants": "总商家数",
+      "todayOrders": "今日订单",
+      "totalRevenue": "总营业额",
+      "quickActions": "快捷操作",
+      "userManagement": "用户管理",
+      "merchantManagement": "商家管理",
+      "systemSettings": "系统设置",
+      "dataStatistics": "数据统计",
+      "operationLog": "操作日志",
+      "dataExport": "数据导出",
+      "loadFailed": "加载失败",
+      "userManagementInDev": "用户管理功能开发中",
+      "merchantManagementInDev": "商家管理功能开发中"
+    },
     "users": "用户管理",
     "merchants": "商家管理",
     "searchUser": "搜索用户名/手机号",
@@ -407,14 +473,55 @@
   "completeOrder": "完成",
   "buffet": {
     "title": "放题模式",
-    "selectPlan": "选择放题方案",
+    "select": {
+      "title": "选择放题方案",
+      "subtitle": "畅饮畅食 无限享受",
+      "description": "选择您喜欢的放题方案,开启美食之旅",
+      "recommended": "推荐",
+      "perPerson": "/人",
+      "minutes": "分钟",
+      "unlimitedOrder": "无限点餐",
+      "maxOrders": "最多{count}次点单",
+      "drinksIncluded": "含酒水饮料",
+      "guestCount": "就餐人数",
+      "subtotal": "小计",
+      "total": "合计",
+      "startBuffet": "开始放题",
+      "confirmTitle": "确认开始放题",
+      "confirmMessage": "方案: {plan}\n人数: {count}人\n金额: ¥{amount}\n\n开始后将立即计时,确认开始吗?"
+    },
+    "menu": {
+      "title": "放题菜单",
+      "timeExpired": "放题时间已结束",
+      "orderLimitReached": "已达点单次数上限 ({current}/{max})",
+      "cannotOrder": "当前无法点餐",
+      "orderedCount": "已点单",
+      "times": "次",
+      "remainingOrders": "剩余次数",
+      "buffetTag": "放题",
+      "selectedItems": "已选{count}份",
+      "confirmOrder": "确认点餐",
+      "confirmOrderTitle": "确认点餐",
+      "confirmOrderMessage": "本次点餐 {count} 份菜品",
+      "orderCountInfo": "点单次数: {current}/{max}",
+      "cartNotEmptyTitle": "提示",
+      "cartNotEmpty": "购物车中还有商品,确定要离开吗?",
+      "categories": {
+        "hotDishes": "热菜",
+        "sushi": "寿司"
+      },
+      "dishes": {
+        "kungPao": "宫保鸡丁",
+        "mapo": "麻婆豆腐",
+        "salmonSushi": "三文鱼寿司",
+        "tunaSushi": "金枪鱼寿司"
+      }
+    },
     "remaining": "剩余时间",
     "pause": "暂停",
     "resume": "继续",
     "endEarly": "提前结束",
     "timeUp": "放题时间已到!感谢光临",
-    "cannotOrder": "当前无法点餐",
-    "confirmOrder": "确认点餐",
     "orderSuccess": "点餐成功!"
   },
   "role": {

+ 115 - 8
src/locale/zh-Hant.json

@@ -112,11 +112,30 @@
     "ordered": "已點",
     "items": "份",
     "clear": "清空",
+    "delete": "刪除",
     "checkout": "確定下單",
+    "submitOrder": "提交訂單",
     "confirmClear": "確定清空購物車麼",
-    "emptyCart": "請先去點餐哦",
+    "emptyCart": "購物車是空的",
+    "goShopping": "去逛逛",
     "total": "合計",
-    "amountToPay": "應付"
+    "amountToPay": "應付",
+    "selectAll": "全選",
+    "coupon": "優惠券",
+    "couponSelected": "已選擇優惠券",
+    "noCoupon": "暫無可用",
+    "orderNote": "請輸入訂單備註",
+    "selectGoods": "請選擇商品",
+    "deleted": "已刪除",
+    "confirmDelete": "確定要刪除這個商品嗎?",
+    "confirmSubmit": "確認提交訂單嗎?",
+    "orderSubmitted": "訂單提交成功!",
+    "mockCoupon": {
+      "condition": "滿100元可用",
+      "name": "新用戶優惠券",
+      "description": "僅限首次下單使用",
+      "value": "10"
+    }
   },
   "order": {
     "title": "訂單",
@@ -228,6 +247,24 @@
       "table": "桌台",
       "my": "我的"
     },
+    "dashboard": {
+      "title": "商家儀表盤",
+      "myShop": "我的店鋪",
+      "operating": "營業中",
+      "resting": "休息中",
+      "todayData": "今日數據",
+      "todayRevenue": "今日營業額",
+      "todayOrders": "今日訂單",
+      "todayTakeout": "今日外賣",
+      "todayDineIn": "今日堂食",
+      "orderStats": "訂單統計",
+      "pending": "待接單",
+      "preparing": "製作中",
+      "delivering": "配送中",
+      "completed": "已完成",
+      "loadFailed": "加載失敗",
+      "orderManagementInDev": "訂單管理功能開發中"
+    },
     "index": {
       "merchantCenter": "商戶中心",
       "operating": "營業中",
@@ -239,11 +276,16 @@
       "pendingMeals": "待出餐"
     },
     "order": {
-      "title": "訂單列表",
+      "title": "訂單管理",
+      "list": "訂單列表",
+      "customer": "顧客",
+      "itemsCount": "等{count}件",
+      "accepted": "已接單",
       "status": {
         "all": "全部",
         "pending": "待接單",
-        "preparing": "待出餐",
+        "preparing": "製作中",
+        "delivering": "配送中",
         "completed": "已完成",
         "cancelled": "已取消"
       },
@@ -251,11 +293,35 @@
         "accept": "接單",
         "serve": "出餐",
         "complete": "完成"
+      },
+      "mockData": {
+        "customerName": "張三",
+        "kungPao": "宮保雞丁",
+        "rice": "米飯"
       }
     }
   },
   "admin": {
-    "dashboard": "管理後台",
+    "dashboard": {
+      "title": "管理後台",
+      "welcome": "歡迎來到管理後台",
+      "systemAdmin": "系統管理員",
+      "platformStats": "平台統計",
+      "totalUsers": "總用戶數",
+      "totalMerchants": "總商家數",
+      "todayOrders": "今日訂單",
+      "totalRevenue": "總營業額",
+      "quickActions": "快捷操作",
+      "userManagement": "用戶管理",
+      "merchantManagement": "商家管理",
+      "systemSettings": "系統設置",
+      "dataStatistics": "數據統計",
+      "operationLog": "操作日誌",
+      "dataExport": "數據導出",
+      "loadFailed": "加載失敗",
+      "userManagementInDev": "用戶管理功能開發中",
+      "merchantManagementInDev": "商家管理功能開發中"
+    },
     "users": "用戶管理",
     "merchants": "商家管理",
     "searchUser": "搜尋用戶名/手機號",
@@ -407,14 +473,55 @@
   "completeOrder": "完成",
   "buffet": {
     "title": "放題模式",
-    "selectPlan": "選擇放題方案",
+    "select": {
+      "title": "選擇放題方案",
+      "subtitle": "暢飲暢食 無限享受",
+      "description": "選擇您喜歡的放題方案,開啟美食之旅",
+      "recommended": "推薦",
+      "perPerson": "/人",
+      "minutes": "分鐘",
+      "unlimitedOrder": "無限點餐",
+      "maxOrders": "最多{count}次點單",
+      "drinksIncluded": "含酒水飲料",
+      "guestCount": "就餐人數",
+      "subtotal": "小計",
+      "total": "合計",
+      "startBuffet": "開始放題",
+      "confirmTitle": "確認開始放題",
+      "confirmMessage": "方案: {plan}\n人數: {count}人\n金額: ¥{amount}\n\n開始後將立即計時,確認開始嗎?"
+    },
+    "menu": {
+      "title": "放題菜單",
+      "timeExpired": "放題時間已結束",
+      "orderLimitReached": "已達點單次數上限 ({current}/{max})",
+      "cannotOrder": "當前無法點餐",
+      "orderedCount": "已點單",
+      "times": "次",
+      "remainingOrders": "剩餘次數",
+      "buffetTag": "放題",
+      "selectedItems": "已選{count}份",
+      "confirmOrder": "確認點餐",
+      "confirmOrderTitle": "確認點餐",
+      "confirmOrderMessage": "本次點餐 {count} 份菜品",
+      "orderCountInfo": "點單次數: {current}/{max}",
+      "cartNotEmptyTitle": "提示",
+      "cartNotEmpty": "購物車中還有商品,確定要離開嗎?",
+      "categories": {
+        "hotDishes": "熱菜",
+        "sushi": "壽司"
+      },
+      "dishes": {
+        "kungPao": "宮保雞丁",
+        "mapo": "麻婆豆腐",
+        "salmonSushi": "三文魚壽司",
+        "tunaSushi": "金槍魚壽司"
+      }
+    },
     "remaining": "剩餘時間",
     "pause": "暫停",
     "resume": "繼續",
     "endEarly": "提前結束",
     "timeUp": "放題時間已到!感謝光臨",
-    "cannotOrder": "當前無法點餐",
-    "confirmOrder": "確認點餐",
     "orderSuccess": "點餐成功!"
   },
   "role": {

+ 27 - 25
src/views/admin/dashboard.vue

@@ -1,40 +1,40 @@
 <template>
   <div class="admin-dashboard">
-    <van-nav-bar title="管理后台" left-arrow @click-left="goBack" />
+    <van-nav-bar :title="$t('admin.dashboard.title')" left-arrow @click-left="goBack" />
 
     <van-pull-refresh v-model="refreshing" @refresh="onRefresh">
       <div class="dashboard-content">
         <div class="welcome-section">
-          <h2>欢迎来到管理后台</h2>
-          <p>系统管理员</p>
+          <h2>{{ $t('admin.dashboard.welcome') }}</h2>
+          <p>{{ $t('admin.dashboard.systemAdmin') }}</p>
         </div>
 
         <!-- 统计卡片 -->
         <div class="stats-section">
-          <h4>平台统计</h4>
+          <h4>{{ $t('admin.dashboard.platformStats') }}</h4>
           <van-grid :column-num="2" :border="false">
-            <van-grid-item icon="friends-o" text="总用户数">
+            <van-grid-item icon="friends-o">
               <template #text>
                 <div class="grid-value">{{ stats.totalUsers }}</div>
-                <div class="grid-label">总用户数</div>
+                <div class="grid-label">{{ $t('admin.dashboard.totalUsers') }}</div>
               </template>
             </van-grid-item>
-            <van-grid-item icon="shop-o" text="总商家数">
+            <van-grid-item icon="shop-o">
               <template #text>
                 <div class="grid-value">{{ stats.totalMerchants }}</div>
-                <div class="grid-label">总商家数</div>
+                <div class="grid-label">{{ $t('admin.dashboard.totalMerchants') }}</div>
               </template>
             </van-grid-item>
-            <van-grid-item icon="orders-o" text="今日订单">
+            <van-grid-item icon="orders-o">
               <template #text>
                 <div class="grid-value">{{ stats.todayOrders }}</div>
-                <div class="grid-label">今日订单</div>
+                <div class="grid-label">{{ $t('admin.dashboard.todayOrders') }}</div>
               </template>
             </van-grid-item>
-            <van-grid-item icon="gold-coin-o" text="总营业额">
+            <van-grid-item icon="gold-coin-o">
               <template #text>
-                <div class="grid-value">¥{{ (stats.totalRevenue / 10000).toFixed(1) }}</div>
-                <div class="grid-label">总营业额</div>
+                <div class="grid-value">¥{{ (stats.totalRevenue / 10000).toFixed(1) }}{{ $t('common.units.tenThousand') }}</div>
+                <div class="grid-label">{{ $t('admin.dashboard.totalRevenue') }}</div>
               </template>
             </van-grid-item>
           </van-grid>
@@ -42,14 +42,14 @@
 
         <!-- 快捷操作 -->
         <div class="actions-section">
-          <h4>快捷操作</h4>
+          <h4>{{ $t('admin.dashboard.quickActions') }}</h4>
           <van-grid :column-num="3" :border="false">
-            <van-grid-item icon="friends-o" text="用户管理" @click="goToUsers" />
-            <van-grid-item icon="shop-o" text="商家管理" @click="goToMerchants" />
-            <van-grid-item icon="setting-o" text="系统设置" @click="showDev" />
-            <van-grid-item icon="bar-chart-o" text="数据统计" @click="showDev" />
-            <van-grid-item icon="records" text="操作日志" @click="showDev" />
-            <van-grid-item icon="down" text="数据导出" @click="showDev" />
+            <van-grid-item icon="friends-o" :text="$t('admin.dashboard.userManagement')" @click="goToUsers" />
+            <van-grid-item icon="shop-o" :text="$t('admin.dashboard.merchantManagement')" @click="goToMerchants" />
+            <van-grid-item icon="setting-o" :text="$t('admin.dashboard.systemSettings')" @click="showDev" />
+            <van-grid-item icon="bar-chart-o" :text="$t('admin.dashboard.dataStatistics')" @click="showDev" />
+            <van-grid-item icon="records" :text="$t('admin.dashboard.operationLog')" @click="showDev" />
+            <van-grid-item icon="down" :text="$t('admin.dashboard.dataExport')" @click="showDev" />
           </van-grid>
         </div>
       </div>
@@ -60,9 +60,11 @@
 <script setup lang="ts">
 import { ref, computed, onMounted } from 'vue'
 import { useRouter } from 'vue-router'
+import { useI18n } from 'vue-i18n'
 import { showToast } from 'vant'
 import { useAdminStore } from '@/store/modules/admin'
 
+const { t } = useI18n()
 const router = useRouter()
 const adminStore = useAdminStore()
 
@@ -74,14 +76,14 @@ const loadData = async () => {
   try {
     await adminStore.loadDashboardStats()
   } catch (error) {
-    showToast('加载失败')
+    showToast(t('admin.dashboard.loadFailed'))
   }
 }
 
 const onRefresh = async () => {
   await loadData()
   refreshing.value = false
-  showToast('刷新成功')
+  showToast(t('common.refreshSuccess'))
 }
 
 const goBack = () => {
@@ -89,15 +91,15 @@ const goBack = () => {
 }
 
 const goToUsers = () => {
-  showToast('用户管理功能开发中')
+  showToast(t('admin.dashboard.userManagementInDev'))
 }
 
 const goToMerchants = () => {
-  showToast('商家管理功能开发中')
+  showToast(t('admin.dashboard.merchantManagementInDev'))
 }
 
 const showDev = () => {
-  showToast('功能开发中')
+  showToast(t('common.featureInDevelopment'))
 }
 
 onMounted(() => {

+ 32 - 26
src/views/buffet/menu.vue

@@ -3,27 +3,27 @@
     <!-- 放题计时器 -->
     <BuffetTimer />
 
-    <van-nav-bar :title="$t('buffet.menu')" left-arrow @click-left="handleBack" fixed :placeholder="true" :style="{ top: timerHeight }" />
+    <van-nav-bar :title="$t('buffet.menu.title')" left-arrow @click-left="handleBack" fixed :placeholder="true" :style="{ top: timerHeight }" />
 
     <!-- 不可点餐提示 -->
     <div v-if="!canOrder" class="order-disabled-banner">
       <van-icon name="warning-o" />
-      <span v-if="session?.status === 'expired'">放题时间已结束</span>
+      <span v-if="session?.status === 'expired'">{{ $t('buffet.menu.timeExpired') }}</span>
       <span v-else-if="session?.maxOrders && session.orderCount >= session.maxOrders">
-        已达点单次数上限 ({{ session.orderCount }}/{{ session.maxOrders }})
+        {{ $t('buffet.menu.orderLimitReached', { current: session.orderCount, max: session.maxOrders }) }}
       </span>
-      <span v-else>当前无法点餐</span>
+      <span v-else>{{ $t('buffet.menu.cannotOrder') }}</span>
     </div>
 
     <!-- 点单统计 -->
     <div class="order-stats">
       <div class="stat-item">
-        <span class="label">已点单</span>
-        <span class="value">{{ session?.orderCount || 0 }}</span>
+        <span class="label">{{ $t('buffet.menu.orderedCount') }}</span>
+        <span class="value">{{ session?.orderCount || 0 }}{{ $t('buffet.menu.times') }}</span>
       </div>
       <div class="stat-item" v-if="session?.maxOrders">
-        <span class="label">剩余次数</span>
-        <span class="value">{{ remainingOrders }}</span>
+        <span class="label">{{ $t('buffet.menu.remainingOrders') }}</span>
+        <span class="value">{{ remainingOrders }}{{ $t('buffet.menu.times') }}</span>
       </div>
     </div>
 
@@ -37,7 +37,7 @@
               <div class="dish-info">
                 <div class="dish-name">{{ dish.name }}</div>
                 <div class="dish-badge">
-                  <van-tag type="success">放题</van-tag>
+                  <van-tag type="success">{{ $t('buffet.menu.buffetTag') }}</van-tag>
                 </div>
               </div>
               <div class="dish-action">
@@ -59,10 +59,10 @@
     <div class="cart-bar" v-if="cartCount > 0">
       <div class="cart-info">
         <van-icon name="shopping-cart-o" :badge="cartCount" />
-        <span>已选{{ cartCount }}份</span>
+        <span>{{ $t('buffet.menu.selectedItems', { count: cartCount }) }}</span>
       </div>
       <van-button type="primary" round @click="submitOrder" :disabled="!canOrder">
-        确认点餐
+        {{ $t('buffet.menu.confirmOrder') }}
       </van-button>
     </div>
   </div>
@@ -71,10 +71,12 @@
 <script setup lang="ts">
 import { ref, computed } from 'vue'
 import { useRouter } from 'vue-router'
+import { useI18n } from 'vue-i18n'
 import { showToast, showConfirmDialog } from 'vant'
 import { useBuffetStore } from '@/store/modules/buffet'
 import BuffetTimer from '@/components/buffet/BuffetTimer.vue'
 
+const { t } = useI18n()
 const router = useRouter()
 const buffetStore = useBuffetStore()
 
@@ -89,22 +91,22 @@ const remainingOrders = computed(() => {
 })
 const cartCount = computed(() => Object.values(cart.value).reduce((sum, n) => sum + n, 0))
 
-// Mock数据
-const categories = ref([
+// Mock数据(使用 computed 使其响应语言切换)
+const categories = computed(() => [
   {
     id: 'cat_1',
-    name: '热菜',
+    name: t('buffet.menu.categories.hotDishes'),
     dishes: [
-      { id: 'dish_1', name: '宫保鸡丁', image: '' },
-      { id: 'dish_2', name: '麻婆豆腐', image: '' }
+      { id: 'dish_1', name: t('buffet.menu.dishes.kungPao'), image: '' },
+      { id: 'dish_2', name: t('buffet.menu.dishes.mapo'), image: '' }
     ]
   },
   {
     id: 'cat_2',
-    name: '寿司',
+    name: t('buffet.menu.categories.sushi'),
     dishes: [
-      { id: 'dish_3', name: '三文鱼寿司', image: '' },
-      { id: 'dish_4', name: '金枪鱼寿司', image: '' }
+      { id: 'dish_3', name: t('buffet.menu.dishes.salmonSushi'), image: '' },
+      { id: 'dish_4', name: t('buffet.menu.dishes.tunaSushi'), image: '' }
     ]
   }
 ])
@@ -121,7 +123,7 @@ const updateQuantity = (dishId: string, quantity: number) => {
 
 const selectDish = (dish: any) => {
   if (!canOrder.value) {
-    showToast('当前无法点餐')
+    showToast(t('buffet.menu.cannotOrder'))
     return
   }
   const current = getQuantity(dish.id)
@@ -130,19 +132,23 @@ const selectDish = (dish: any) => {
 
 const submitOrder = async () => {
   if (!canOrder.value) {
-    showToast('当前无法点餐')
+    showToast(t('buffet.menu.cannotOrder'))
     return
   }
 
   try {
+    const orderInfo = session.value?.maxOrders
+      ? `\n${t('buffet.menu.orderCountInfo', { current: session.value.orderCount + 1, max: session.value.maxOrders })}`
+      : ''
+
     await showConfirmDialog({
-      title: '确认点餐',
-      message: `本次点餐 ${cartCount.value} 份菜品\n${session.value?.maxOrders ? `点单次数: ${session.value.orderCount + 1}/${session.value.maxOrders}` : ''}`
+      title: t('buffet.menu.confirmOrderTitle'),
+      message: t('buffet.menu.confirmOrderMessage', { count: cartCount.value }) + orderInfo
     })
 
     // TODO: 提交订单到后端
     buffetStore.incrementOrderCount()
-    showToast('点餐成功!')
+    showToast(t('buffet.orderSuccess'))
     cart.value = {}
 
   } catch {
@@ -154,8 +160,8 @@ const handleBack = async () => {
   if (cartCount.value > 0) {
     try {
       await showConfirmDialog({
-        title: '提示',
-        message: '购物车中还有商品,确定要离开吗?'
+        title: t('buffet.menu.cartNotEmptyTitle'),
+        message: t('buffet.menu.cartNotEmpty')
       })
       router.back()
     } catch {

+ 23 - 16
src/views/buffet/select.vue

@@ -1,11 +1,11 @@
 <template>
   <div class="buffet-select">
-    <van-nav-bar title="选择放题方案" left-arrow @click-left="$router.back()" fixed placeholder />
+    <van-nav-bar :title="$t('buffet.select.title')" left-arrow @click-left="$router.back()" fixed placeholder />
 
     <div class="intro-banner">
       <van-icon name="fire-o" size="36" color="#ff6b6b" />
-      <h2>畅饮畅食 无限享受</h2>
-      <p>选择您喜欢的放题方案,开启美食之旅</p>
+      <h2>{{ $t('buffet.select.subtitle') }}</h2>
+      <p>{{ $t('buffet.select.description') }}</p>
     </div>
 
     <div class="plans-container">
@@ -17,7 +17,7 @@
         @click="selectPlan(plan)"
       >
         <div class="plan-badge" v-if="plan.duration >= 120">
-          <van-tag type="danger">推荐</van-tag>
+          <van-tag type="danger">{{ $t('buffet.select.recommended') }}</van-tag>
         </div>
 
         <div class="plan-header">
@@ -25,13 +25,13 @@
           <div class="plan-price">
             <span class="currency">¥</span>
             <span class="amount">{{ plan.price }}</span>
-            <span class="unit">/人</span>
+            <span class="unit">{{ $t('buffet.select.perPerson') }}</span>
           </div>
         </div>
 
         <div class="plan-duration">
           <van-icon name="clock-o" />
-          <span>{{ plan.duration }}分钟</span>
+          <span>{{ plan.duration }}{{ $t('buffet.select.minutes') }}</span>
         </div>
 
         <div class="plan-description" v-if="plan.description">
@@ -41,15 +41,15 @@
         <div class="plan-features">
           <div class="feature-item">
             <van-icon name="success" color="#07c160" />
-            <span>无限点餐</span>
+            <span>{{ $t('buffet.select.unlimitedOrder') }}</span>
           </div>
           <div class="feature-item" v-if="plan.maxOrders">
             <van-icon name="success" color="#07c160" />
-            <span>最多{{ plan.maxOrders }}次点单</span>
+            <span>{{ $t('buffet.select.maxOrders', { count: plan.maxOrders }) }}</span>
           </div>
           <div class="feature-item">
             <van-icon name="success" color="#07c160" />
-            <span>含酒水饮料</span>
+            <span>{{ $t('buffet.select.drinksIncluded') }}</span>
           </div>
         </div>
 
@@ -58,24 +58,24 @@
     </div>
 
     <div class="guest-selector">
-      <div class="selector-label">就餐人数</div>
+      <div class="selector-label">{{ $t('buffet.select.guestCount') }}</div>
       <van-stepper v-model="guestCount" min="1" max="20" integer />
     </div>
 
     <div class="total-price">
       <div class="price-breakdown">
-        <span>小计</span>
+        <span>{{ $t('buffet.select.subtotal') }}</span>
         <span>¥{{ subtotal }}</span>
       </div>
       <div class="price-breakdown total">
-        <span>合计</span>
+        <span>{{ $t('buffet.select.total') }}</span>
         <span>¥{{ totalAmount }}</span>
       </div>
     </div>
 
     <div class="action-bar">
       <van-button type="primary" block round size="large" @click="confirmSelection" :disabled="!selectedPlan">
-        开始放题
+        {{ $t('buffet.select.startBuffet') }}
       </van-button>
     </div>
   </div>
@@ -84,9 +84,12 @@
 <script setup lang="ts">
 import { ref, computed, onMounted } from 'vue'
 import { useRoute, useRouter } from 'vue-router'
+import { useI18n } from 'vue-i18n'
 import { showToast, showConfirmDialog } from 'vant'
 import { useBuffetStore, type BuffetPlan } from '@/store/modules/buffet'
 
+const { t } = useI18n()
+
 const route = useRoute()
 const router = useRouter()
 const buffetStore = useBuffetStore()
@@ -112,8 +115,12 @@ const confirmSelection = async () => {
 
   try {
     await showConfirmDialog({
-      title: '确认开始放题',
-      message: `方案: ${selectedPlanData.value.name}\n人数: ${guestCount.value}人\n金额: ¥${totalAmount.value}\n\n开始后将立即计时,确认开始吗?`
+      title: t('buffet.select.confirmTitle'),
+      message: t('buffet.select.confirmMessage', {
+        plan: selectedPlanData.value.name,
+        count: guestCount.value,
+        amount: totalAmount.value
+      })
     })
 
     // 获取桌位信息(从路由或store)
@@ -123,7 +130,7 @@ const confirmSelection = async () => {
     // 开始放题会话
     buffetStore.startSession(selectedPlanData.value, tableId, tableName)
 
-    showToast('放题已开始!')
+    showToast(t('buffet.orderSuccess'))
 
     // 跳转到菜单页面
     router.push({

+ 27 - 25
src/views/cart/cart.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="cart-page">
     <!-- 导航栏 -->
-    <van-nav-bar title="购物车" fixed left-arrow @click-left="$router.back()" />
+    <van-nav-bar :title="$t('cart.title')" fixed left-arrow @click-left="$router.back()" />
 
     <div class="page-content" style="padding-top: 46px; padding-bottom: 60px">
       <!-- 购物车列表 -->
@@ -33,7 +33,7 @@
               <van-button
                 square
                 type="danger"
-                text="删除"
+                :text="$t('cart.delete')"
                 class="delete-button"
                 @click="removeItem(item)"
               />
@@ -43,8 +43,8 @@
 
         <!-- 优惠券 -->
         <van-cell
-          title="优惠券"
-          :value="cartStore.hasCoupon ? `已选择优惠券` : '暂无可用'"
+          :title="$t('cart.coupon')"
+          :value="cartStore.hasCoupon ? $t('cart.couponSelected') : $t('cart.noCoupon')"
           is-link
           @click="showCouponPicker = true"
         />
@@ -55,16 +55,16 @@
           rows="2"
           autosize
           type="textarea"
-          placeholder="请输入订单备注"
+          :placeholder="$t('cart.orderNote')"
           maxlength="200"
           show-word-limit
         />
       </div>
 
       <!-- 空状态 -->
-      <van-empty v-else description="购物车是空的" image="default">
+      <van-empty v-else :description="$t('cart.emptyCart')" image="default">
         <van-button round type="primary" @click="$router.push('/menu')">
-          去逛逛
+          {{ $t('cart.goShopping') }}
         </van-button>
       </van-empty>
     </div>
@@ -73,12 +73,12 @@
     <van-submit-bar
       v-if="cartStore.cart.length > 0"
       :price="totalPrice * 100"
-      button-text="提交订单"
+      :button-text="$t('cart.submitOrder')"
       @submit="handleSubmit"
     >
       <template #tip>
         <div class="submit-tip">
-          <van-checkbox v-model="checkAll" @change="onCheckAllChange">全选</van-checkbox>
+          <van-checkbox v-model="checkAll" @change="onCheckAllChange">{{ $t('cart.selectAll') }}</van-checkbox>
         </div>
       </template>
     </van-submit-bar>
@@ -98,10 +98,12 @@
 <script setup lang="ts">
 import { ref, computed, watch } from 'vue'
 import { useRouter } from 'vue-router'
+import { useI18n } from 'vue-i18n'
 import { showDialog, showToast } from 'vant'
 import { useCartStore } from '@/store/index'
 import YImage from '@/components/common/YImage.vue'
 
+const { t } = useI18n()
 const router = useRouter()
 const cartStore = useCartStore()
 
@@ -110,21 +112,21 @@ const checkedGoods = ref([])
 // 全选
 const checkAll = ref(false)
 
-// 优惠券
+// 优惠券 (使用 computed 使其响应语言切换)
 const showCouponPicker = ref(false)
 const chosenCoupon = ref(-1)
-const coupons = ref([
+const coupons = computed(() => [
   {
     id: 1,
     available: true,
-    condition: '满100元可用',
+    condition: t('cart.mockCoupon.condition'),
     reason: '',
     value: 1000,
-    name: '新用户优惠券',
+    name: t('cart.mockCoupon.name'),
     startAt: Date.now(),
     endAt: Date.now() + 30 * 24 * 60 * 60 * 1000,
-    description: '仅限首次下单使用',
-    valueDesc: '10'
+    description: t('cart.mockCoupon.description'),
+    valueDesc: t('cart.mockCoupon.value')
   }
 ])
 const disabledCoupons = ref([])
@@ -170,11 +172,11 @@ const updateQuantity = (item) => {
 // 删除商品
 const removeItem = (item) => {
   showDialog({
-    title: '提示',
-    message: '确定要删除这个商品吗?'
+    title: t('common.confirmAction'),
+    message: t('cart.confirmDelete')
   }).then(() => {
     cartStore.removeFromCart(item.id)
-    showToast('已删除')
+    showToast(t('cart.deleted'))
   })
 }
 
@@ -194,7 +196,7 @@ const onCouponChange = (index) => {
   showCouponPicker.value = false
   if (index >= 0) {
     cartStore.setCoupon(coupons.value[index])
-    showToast('已选择优惠券')
+    showToast(t('cart.couponSelected'))
   } else {
     cartStore.clearCoupon()
   }
@@ -203,19 +205,19 @@ const onCouponChange = (index) => {
 // 提交订单
 const handleSubmit = () => {
   if (checkedGoods.value.length === 0) {
-    showToast('请选择商品')
+    showToast(t('cart.selectGoods'))
     return
   }
 
   // 这里应该跳转到订单确认页
   showDialog({
-    title: '提示',
-    message: '确认提交订单吗?',
-    confirmButtonText: '确认',
-    cancelButtonText: '取消',
+    title: t('common.confirmAction'),
+    message: t('cart.confirmSubmit'),
+    confirmButtonText: t('common.confirm'),
+    cancelButtonText: t('common.cancel'),
     showCancelButton: true
   }).then(() => {
-    showToast('订单提交成功!')
+    showToast(t('cart.orderSubmitted'))
     // 清空购物车
     cartStore.clearCart()
     // 跳转到订单页面

+ 22 - 20
src/views/merchant/dashboard.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="merchant-dashboard">
     <van-nav-bar
-      title="商家仪表盘"
+      :title="$t('merchant.dashboard.title')"
       left-arrow
       @click-left="goBack"
     />
@@ -10,39 +10,39 @@
       <div class="dashboard-content">
         <!-- 店铺信息 -->
         <div class="shop-card">
-          <h3>{{ shopInfo.name || '我的店铺' }}</h3>
+          <h3>{{ shopInfo.name || $t('merchant.dashboard.myShop') }}</h3>
           <van-tag :type="shopInfo.isOpen ? 'success' : 'default'">
-            {{ shopInfo.isOpen ? '营业中' : '休息中' }}
+            {{ shopInfo.isOpen ? $t('merchant.dashboard.operating') : $t('merchant.dashboard.resting') }}
           </van-tag>
           <p>{{ shopInfo.hours }}</p>
         </div>
 
         <!-- 今日数据 -->
         <div class="stats-section">
-          <h4>今日数据</h4>
+          <h4>{{ $t('merchant.dashboard.todayData') }}</h4>
           <van-grid :column-num="2" :border="false">
-            <van-grid-item icon="gold-coin-o" text="今日营业额">
+            <van-grid-item icon="gold-coin-o">
               <template #text>
                 <div class="grid-value">¥{{ todayStats.revenue }}</div>
-                <div class="grid-label">今日营业额</div>
+                <div class="grid-label">{{ $t('merchant.dashboard.todayRevenue') }}</div>
               </template>
             </van-grid-item>
-            <van-grid-item icon="shopping-cart-o" text="今日订单">
+            <van-grid-item icon="shopping-cart-o">
               <template #text>
                 <div class="grid-value">{{ todayStats.orderCount }}</div>
-                <div class="grid-label">今日订单</div>
+                <div class="grid-label">{{ $t('merchant.dashboard.todayOrders') }}</div>
               </template>
             </van-grid-item>
-            <van-grid-item icon="logistics" text="今日外卖">
+            <van-grid-item icon="logistics">
               <template #text>
                 <div class="grid-value">{{ todayStats.takeoutCount }}</div>
-                <div class="grid-label">今日外卖</div>
+                <div class="grid-label">{{ $t('merchant.dashboard.todayTakeout') }}</div>
               </template>
             </van-grid-item>
-            <van-grid-item icon="shop-o" text="今日堂食">
+            <van-grid-item icon="shop-o">
               <template #text>
                 <div class="grid-value">{{ todayStats.dineInCount }}</div>
-                <div class="grid-label">今日堂食</div>
+                <div class="grid-label">{{ $t('merchant.dashboard.todayDineIn') }}</div>
               </template>
             </van-grid-item>
           </van-grid>
@@ -50,23 +50,23 @@
 
         <!-- 订单统计 -->
         <div class="order-stats-section">
-          <h4>订单统计</h4>
+          <h4>{{ $t('merchant.dashboard.orderStats') }}</h4>
           <div class="order-stats-grid">
             <div class="stat-card" @click="goToOrders('pending')">
               <div class="stat-count" style="color: #ff976a">{{ orderStats.pending }}</div>
-              <div class="stat-name">待接单</div>
+              <div class="stat-name">{{ $t('merchant.dashboard.pending') }}</div>
             </div>
             <div class="stat-card" @click="goToOrders('preparing')">
               <div class="stat-count" style="color: #1989fa">{{ orderStats.preparing }}</div>
-              <div class="stat-name">制作中</div>
+              <div class="stat-name">{{ $t('merchant.dashboard.preparing') }}</div>
             </div>
             <div class="stat-card" @click="goToOrders('delivering')">
               <div class="stat-count" style="color: #07c160">{{ orderStats.delivering }}</div>
-              <div class="stat-name">配送中</div>
+              <div class="stat-name">{{ $t('merchant.dashboard.delivering') }}</div>
             </div>
             <div class="stat-card" @click="goToOrders('completed')">
               <div class="stat-count" style="color: #969799">{{ orderStats.completed }}</div>
-              <div class="stat-name">已完成</div>
+              <div class="stat-name">{{ $t('merchant.dashboard.completed') }}</div>
             </div>
           </div>
         </div>
@@ -78,9 +78,11 @@
 <script setup lang="ts">
 import { ref, computed, onMounted } from 'vue'
 import { useRouter } from 'vue-router'
+import { useI18n } from 'vue-i18n'
 import { showToast } from 'vant'
 import { useMerchantStore } from '@/store/modules/merchant'
 
+const { t } = useI18n()
 const router = useRouter()
 const merchantStore = useMerchantStore()
 
@@ -94,14 +96,14 @@ const loadData = async () => {
   try {
     await merchantStore.loadDashboardData()
   } catch (error) {
-    showToast('加载失败')
+    showToast(t('merchant.dashboard.loadFailed'))
   }
 }
 
 const onRefresh = async () => {
   await loadData()
   refreshing.value = false
-  showToast('刷新成功')
+  showToast(t('common.refreshSuccess'))
 }
 
 const goBack = () => {
@@ -109,7 +111,7 @@ const goBack = () => {
 }
 
 const goToOrders = (status: string) => {
-  showToast('订单管理功能开发中')
+  showToast(t('merchant.dashboard.orderManagementInDev'))
 }
 
 onMounted(() => {

+ 25 - 19
src/views/merchant/orders.vue

@@ -1,13 +1,13 @@
 <template>
   <div class="merchant-orders">
-    <van-nav-bar title="订单管理" left-arrow @click-left="$router.back()" fixed placeholder />
+    <van-nav-bar :title="$t('merchant.order.title')" left-arrow @click-left="$router.back()" fixed placeholder />
 
     <van-tabs v-model:active="activeTab" sticky @change="onTabChange">
-      <van-tab title="全部" :badge="stats.total > 99 ? '99+' : stats.total" />
-      <van-tab title="待接单" :badge="stats.pending || ''" />
-      <van-tab title="制作中" :badge="stats.preparing || ''" />
-      <van-tab title="配送中" :badge="stats.delivering || ''" />
-      <van-tab title="已完成" />
+      <van-tab :title="$t('merchant.order.status.all')" :badge="stats.total > 99 ? '99+' : stats.total" />
+      <van-tab :title="$t('merchant.order.status.pending')" :badge="stats.pending || ''" />
+      <van-tab :title="$t('merchant.order.status.preparing')" :badge="stats.preparing || ''" />
+      <van-tab :title="$t('merchant.order.status.delivering')" :badge="stats.delivering || ''" />
+      <van-tab :title="$t('merchant.order.status.completed')" />
     </van-tabs>
 
     <van-pull-refresh v-model="refreshing" @refresh="onRefresh">
@@ -21,7 +21,7 @@
             <div class="order-info">
               <div class="info-item">
                 <van-icon name="user-o" />
-                <span>{{ order.customerName || '顾客' }}</span>
+                <span>{{ order.customerName || $t('merchant.order.customer') }}</span>
               </div>
               <div class="info-item">
                 <van-icon name="clock-o" />
@@ -36,7 +36,7 @@
               <span v-for="(item, idx) in order.items.slice(0, 2)" :key="idx">
                 {{ item.name }} x{{ item.quantity }}
               </span>
-              <span v-if="order.items.length > 2">等{{ order.items.length }}件</span>
+              <span v-if="order.items.length > 2">{{ $t('merchant.order.itemsCount', { count: order.items.length }) }}</span>
             </div>
             <div class="order-footer">
               <span class="amount">¥{{ order.amount }}</span>
@@ -46,7 +46,7 @@
                 type="primary"
                 @click.stop="acceptOrder(order)"
               >
-                接单
+                {{ $t('merchant.order.actions.accept') }}
               </van-button>
             </div>
           </div>
@@ -57,10 +57,12 @@
 </template>
 
 <script setup lang="ts">
-import { ref } from 'vue'
+import { ref, computed } from 'vue'
 import { useRouter } from 'vue-router'
+import { useI18n } from 'vue-i18n'
 import { showToast } from 'vant'
 
+const { t } = useI18n()
 const router = useRouter()
 
 const activeTab = ref(0)
@@ -75,16 +77,20 @@ const stats = ref({
   delivering: 3
 })
 
-const orders = ref([
+// Mock数据(使用 computed 使其响应语言切换)
+const orders = computed(() => [
   {
     id: '1',
     orderNo: '202401120001',
-    customerName: '张三',
+    customerName: t('merchant.order.mockData.customerName'),
     status: 'pending',
     amount: 158,
     createTime: Date.now() - 3 * 60 * 1000,
     tableNo: 'A1',
-    items: [{ name: '宫保鸡丁', quantity: 1 }, { name: '米饭', quantity: 2 }]
+    items: [
+      { name: t('merchant.order.mockData.kungPao'), quantity: 1 },
+      { name: t('merchant.order.mockData.rice'), quantity: 2 }
+    ]
   }
 ])
 
@@ -100,10 +106,10 @@ const getStatusType = (status: string) => {
 
 const getStatusText = (status: string) => {
   const map: Record<string, string> = {
-    pending: '待接单',
-    preparing: '制作中',
-    delivering: '配送中',
-    completed: '已完成'
+    pending: t('merchant.order.status.pending'),
+    preparing: t('merchant.order.status.preparing'),
+    delivering: t('merchant.order.status.delivering'),
+    completed: t('merchant.order.status.completed')
   }
   return map[status]
 }
@@ -117,7 +123,7 @@ const onTabChange = () => {}
 const onRefresh = () => {
   setTimeout(() => {
     refreshing.value = false
-    showToast('刷新成功')
+    showToast(t('common.refreshSuccess'))
   }, 1000)
 }
 const onLoad = () => {
@@ -131,7 +137,7 @@ const acceptOrder = (order: any) => {
   order.status = 'preparing'
   stats.value.pending--
   stats.value.preparing++
-  showToast('已接单')
+  showToast(t('merchant.order.accepted'))
 }
 </script>