feat(player): 新增桌面端 UI 与响应式双端路由架构

- 将原移动端页面重命名为 Mobile*,新增 22 个 Desktop* 视图与 DesktopShell 布局体系
- 路由入口改为 Wrapper 视图,通过 useViewport(≥1024px)自动切换移动/桌面端
- 新增投注单面板、盘口弹层、联赛侧栏、数据表格等桌面组件及独立样式令牌
- 扩展 betSlip store、串关筛选、冠军盘、Toast/悬浮信箱等交互与三语 i18n
- 公告/消息 Hub 拆分移动与桌面实现;API 投注/钱包/充值记录支持 pageSize 分页
This commit is contained in:
2026-06-29 18:01:39 +08:00
parent 9c5e8d6f5c
commit 8a1ba0fd95
116 changed files with 22249 additions and 8693 deletions

View File

@@ -10,8 +10,26 @@ export default {
back_to_top: 'Back to top',
cancel: 'Cancel',
confirm: 'Confirm',
clear: 'Clear',
no_data: 'No data',
back: 'Back',
save: 'Save',
expand: 'Expand',
collapse: 'Collapse',
not_found: 'Not found',
load_more: 'Load more',
approved: 'Approved',
rejected: 'Rejected',
pending: 'Pending',
cancelled: 'Cancelled',
error: 'Something went wrong',
status: 'Status',
},
nav: { home: 'Home', bet: 'Bet', bet_history: 'History', wallet: 'Wallet', profile: 'Profile' },
pagination: {
total: '{total} total',
per_page: '{size} / page',
},
nav: { home: 'Home', sports: 'Sports', football: 'Football', bet: 'Bet', bet_history: 'History', wallet: 'Transactions', account_hub: 'Bets & Wallet', profile: 'Profile', search: 'Search teams, leagues…', announcements: 'Announcements', sports_more_soon: 'More sports coming soon' },
home: {
hot_matches: 'Hot matches',
hot_tab: 'Hot',
@@ -32,6 +50,7 @@ export default {
empty: 'No announcements yet',
not_found: 'This announcement is unavailable',
view_all: 'View all announcements',
select_hint: 'Select an announcement to read',
type_notice: 'Notice',
type_ticker: 'Ticker',
type_banner: 'Banner',
@@ -39,6 +58,9 @@ export default {
go_link: 'Go to page',
open_link: 'Open link',
back: 'Back',
center_desc: 'Platform notices, promotions, and maintenance updates',
total_count: '{count} total',
read_more: 'Read more',
},
search: {
placeholder: 'Search teams or leagues',
@@ -60,6 +82,7 @@ export default {
not_found: 'Message not found',
view_all: 'Back to inbox',
back: 'Back',
select_hint: 'Select a message to read',
mark_all_read: 'Mark all read',
load_more: 'Load more',
delete: 'Delete',
@@ -79,6 +102,8 @@ export default {
view_recharge_history: 'View recharge history',
unread_badge: '{count} unread',
open_inbox: 'Open inbox',
tab_inbox: 'Inbox',
tab_support: 'Support',
},
inbox_hub: {
title: 'Messages & Support',
@@ -116,6 +141,9 @@ export default {
filter_lost: 'Lost',
filter_pending: 'Pending',
filter_push: 'Push',
filter_status_group: 'Settlement',
filter_push_group: 'Special',
filter_push_hint: 'Push: stake refunded on a draw line',
stats_total: 'Total',
stats_won: 'Won',
stats_lost: 'Lost',
@@ -256,6 +284,20 @@ export default {
cashback_filter_hint: 'This list shows wallet credits; see cashback details for period and rate.',
ref_cashback: 'Cashback batch',
detail_cashback_link: 'View cashback details',
frozen: 'Frozen',
cashback_total: 'Total cashback',
type: 'Type',
note: 'Note',
amount: 'Amount',
time: 'Time',
transaction_detail: 'Transaction details',
balance_before: 'Balance before',
balance_after: 'Balance after',
transaction_id: 'Transaction ID',
detail_title: 'Wallet details',
recharge_btn: 'Deposit',
recharge_history: 'Deposit history',
cashbacks_tab: 'Cashback',
},
recharge: {
title: 'Recharge',
@@ -312,6 +354,15 @@ export default {
reapply: 'Re-apply',
reapply_hint: 'You are resubmitting this order. Transfer again and upload a new screenshot.',
back_to_history: 'Back to history',
order_no: 'Order no.',
method: 'Method',
amount: 'Amount',
screenshot: 'Upload proof',
click_to_upload: 'Click to upload',
choose_method: 'Choose payment account',
success_title: 'Submitted',
success_hint: 'Please wait for review. You will be notified once credited.',
no_history: 'No deposit records',
},
cashback: {
title: 'Cashback Details',
@@ -324,6 +375,10 @@ export default {
empty: 'No cashback records yet',
empty_hint: 'Cashback is issued by the platform after each settlement period.',
ledger_hint: 'Matches wallet entries under the Cashback filter; amounts are the same.',
match: 'Match',
amount: 'Cashback amount',
rate: 'Cashback rate',
batch_no: 'Batch no.',
},
bet: {
bet_slip: 'Bet Slip',
@@ -333,8 +388,30 @@ export default {
parlay: 'Parlay',
tab_matches: 'Matches',
tab_outright: 'Outright',
sport_football: 'Football',
sport_basketball: 'Basketball',
sport_tennis: 'Tennis',
sport_coming_soon: 'Coming soon',
tab_today: 'Today',
tab_early: 'Early',
filter_time: 'Time',
filter_league: 'Leagues',
filter_market: 'Markets',
time_all: 'All',
time_today: 'Today',
time_early: 'Early',
market_all: 'All markets',
market_handicap_ou: 'Handicap / O-U',
correct_score: 'Correct score',
no_markets: 'No markets available',
no_markets_filtered: 'No markets match the current filter',
popover_title: 'Confirm bet',
place_now: 'Bet now',
add_to_single: 'Add to singles',
add_to_parlay: 'Add to parlay',
slip_parlay_added_short: 'In parlay · View',
add_to_single_list: 'Add to singles',
add_to_parlay_list: 'Add to parlay',
filter_status_all: 'All',
filter_status_open: 'Open',
filter_status_settled: 'Settled',
@@ -446,24 +523,37 @@ export default {
slip_pick_hint: 'Tap to add/remove from slip; gold border = selected',
picked_tag: 'Selected',
pick_added: 'Added to bet slip',
added_to_single: 'Added to singles list',
added_to_parlay: 'Added to parlay list',
pick_removed: 'Removed from bet slip',
slip_bar_ready: '1 selection',
slip_bar_go: 'Bet slip',
cs_top_hint: '① Enter stake ② Tap Confirm bet above',
slip_empty_hint: 'Tap odds to open the bet drawer',
slip_clear: 'Clear all',
slip_remove: 'Remove',
slip_locate: 'Locate odds',
slip_locate_aria: 'Scroll to this selection in the odds list',
slip_est_return: 'Est. max payout',
slip_parlay_odds: 'Combined odds {odds}',
slip_review_title: 'Review selection',
slip_balance: 'Account balance',
slip_tab_single: 'Single',
slip_tab_parlay: 'Parlay',
slip_tab_history: 'History',
slip_history_all: 'All',
slip_history_match: 'This match',
slip_history_view_all: 'View all',
slip_history_load_more: 'Load more',
slip_parlay_empty_hint: 'Pick a selection, then tap Add to parlay',
slip_add_parlay: 'Add to parlay',
slip_parlay_only_hint: 'This market is parlay-only. Tap Add to parlay to bet.',
slip_parlay_same_match: 'Parlay selections cannot be from the same match. Remove the same-match leg first.',
slip_parlay_count: '{n} parlay leg(s)',
slip_total_stake: 'Total stake',
slip_place_single: 'Single bet',
slip_place_all: 'Bet all',
slip_parlay_added_btn: 'Added',
slip_currency: 'Amount',
slip_min: 'Min',
slip_min_error: 'Minimum stake is {amount}',
@@ -472,11 +562,34 @@ export default {
accept_changes_place: 'Accept changes & place bet',
odds_was: 'Was',
odds_now: 'Now',
place_confirm_title: 'Confirm bet',
place_confirm_single:
"Selection: {pick} ({'@'}{odds})\nStake: {stake}\nEst. return: {return}\n\nPlace this bet?",
place_confirm_singles:
'{count} single bet(s)\nTotal stake: {stake}\nEst. return: {return}\n\nPlace all?',
place_confirm_parlay:
'Parlay ({count} legs), total odds {odds}\nStake: {stake}\nEst. return: {return}\n\nPlace parlay?',
place_success: 'Bet placed',
place_failed: 'Bet failed',
bet_no: 'Bet no.',
match: 'Match',
selection: 'Selection',
odds: 'Odds',
potential_payout: 'Potential payout',
placed_at: 'Placed at',
detail_title: 'Bet details',
selections: 'Selections',
},
profile: {
edit: 'Edit Profile',
edit_title: 'Edit profile',
save_success: 'Saved successfully',
basic_info: 'Basic info',
change_avatar: 'Change avatar',
username: 'Username',
username_locked: 'Username cannot be changed',
account: 'Account',
quick_nav: 'Quick links',
language: 'Language',
avatar: 'Avatar',
avatar_change: 'Change avatar',