sync(theme-3): 同步 main 最新 API/Admin 与玩家端逻辑

从 main 同步站内信手动发送、媒体库选择、列表子路由重构等 API/Admin 改动;玩家端仅合并 ADMIN_CUSTOM 富文本、消息预览与充值截图压缩逻辑,保留 theme-3 样式。
This commit is contained in:
2026-06-22 14:11:47 +08:00
parent f92c5e8a59
commit d8e08aaed0
50 changed files with 4653 additions and 1186 deletions

View File

@@ -140,6 +140,9 @@ const zh: Record<string, string> = {
'breadcrumb.settlement': '赛事结算',
'breadcrumb.match_edit': '编辑赛事',
'breadcrumb.match_markets': '盘口管理',
'breadcrumb.league_fixtures': '单场赛事',
'breadcrumb.league_outrights': '优胜冠军',
'breadcrumb.agent_direct_players': '直属玩家',
'breadcrumb.outright_edit': '编辑优胜冠军',
'role.admin': '系统管理员',
'role.super_admin': '超级管理员',
@@ -319,7 +322,11 @@ const zh: Record<string, string> = {
'match.status.SETTLED': '已结算',
'match.status.PENDING_SETTLEMENT': '待结算',
'match.filter.has_bets': '仅显示有下注',
'match.filter.kickoff_from': '开赛起',
'match.filter.kickoff_to': '开赛止',
'match.sort.default': '默认排序',
'match.sort.kickoff_asc': '按开赛时间(早→晚)',
'match.sort.kickoff_desc': '按开赛时间(晚→早)',
'match.sort.bet_count': '按注单数',
'match.sort.total_stake': '按投注额',
// 列表页/弹窗文案通过 bundles/zh-CN 动态平载,不在此处静态 spread
@@ -453,6 +460,9 @@ const en: Record<string, string> = {
'breadcrumb.settlement': 'Settlement',
'breadcrumb.match_edit': 'Edit match',
'breadcrumb.match_markets': 'Markets',
'breadcrumb.league_fixtures': 'Fixtures',
'breadcrumb.league_outrights': 'Outright odds',
'breadcrumb.agent_direct_players': 'Direct players',
'breadcrumb.outright_edit': 'Edit outright',
'role.admin': 'Administrator',
'role.super_admin': 'Super admin',
@@ -632,7 +642,11 @@ const en: Record<string, string> = {
'match.status.SETTLED': 'Settled',
'match.status.PENDING_SETTLEMENT': 'Pending settlement',
'match.filter.has_bets': 'Show Placed Bets Only',
'match.filter.kickoff_from': 'Kickoff from',
'match.filter.kickoff_to': 'Kickoff to',
'match.sort.default': 'Default Order',
'match.sort.kickoff_asc': 'By kickoff (earliest first)',
'match.sort.kickoff_desc': 'By kickoff (latest first)',
'match.sort.bet_count': 'By Bet Count',
'match.sort.total_stake': 'By Stake Amount',
// 列表页/弹窗文案通过 bundles/en-US 动态平载,不在此处静态 spread
@@ -766,6 +780,9 @@ const ms: Record<string, string> = {
'breadcrumb.settlement': 'Penyelesaian',
'breadcrumb.match_edit': 'Edit perlawanan',
'breadcrumb.match_markets': 'Pasaran',
'breadcrumb.league_fixtures': 'Perlawanan',
'breadcrumb.league_outrights': 'Odds juara',
'breadcrumb.agent_direct_players': 'Pemain langsung',
'breadcrumb.outright_edit': 'Edit juara',
'role.admin': 'Pentadbir',
'role.super_admin': 'Super pentadbir',
@@ -945,7 +962,11 @@ const ms: Record<string, string> = {
'match.status.SETTLED': 'Diselesaikan',
'match.status.PENDING_SETTLEMENT': 'Menunggu penyelesaian',
'match.filter.has_bets': 'Tunjukkan Pertaruhan Sahaja',
'match.filter.kickoff_from': 'Mula dari',
'match.filter.kickoff_to': 'Mula hingga',
'match.sort.default': 'Susunan Lalai',
'match.sort.kickoff_asc': 'Ikut masa mula (awal→lewat)',
'match.sort.kickoff_desc': 'Ikut masa mula (lewat→awal)',
'match.sort.bet_count': 'Ikut Bil. Pertaruhan',
'match.sort.total_stake': 'Ikut Jumlah Taruhan',
// 列表页/弹窗文案通过 bundles/ms-MY 动态平载,不在此处静态 spread

View File

@@ -134,6 +134,7 @@ export const adminPagesMs: Record<string, string> = {
'agent.col.credit': 'Had / Digunakan / Tersedia',
'agent.col.direct_players': 'Pemain terus',
'agent.direct_players_title': 'Pemain terus · {name}',
'agent.open_agent_hint': 'Klik baris ejen untuk buka halaman pemain terus.',
'agent.platform_row_name': 'Platform',
'agent.col.sub_agents': 'Sub-ejen',
'agent.col.cashback': 'Kadar rebat',
@@ -287,6 +288,10 @@ export const adminPagesMs: Record<string, string> = {
'match.hint.edit_published': 'Diterbitkan: edit masa mula, pilihan utama, nama paparan; tertutup/selesai dikunci.',
'match.expand_league_hint': 'Kembangkan liga untuk urus perlawanan; odds juara di tab Odds juara.',
'match.expand_outright_hint': 'Kembangkan liga untuk sunting odds juara; pasukan perlawanan disegerakkan auto, boleh tambah pasukan belum dijadualkan.',
'match.open_league_hint': 'Klik baris liga untuk buka halaman urus perlawanan.',
'match.open_outright_hint': 'Klik baris liga untuk buka halaman odds juara.',
'match.league_fixtures_subtitle': 'Perlawanan',
'match.league_outrights_subtitle': 'Odds juara',
'outright.odds_only_hint': 'Pasukan daripada perlawanan disegerakkan auto; boleh tambah pasukan manual dan sunting odds di sini. Pasaran juara ikut terbitan liga — tiada langkah terbit berasingan.',
'outright.league_unpublished_hint': 'Liga belum diterbitkan. Tetapkan liga kepada Diterbitkan di halaman ini untuk membuka pertaruhan juara secara automatik.',
'outright.unsettled_fixtures_hint': '{n} perlawanan dalam liga ini masih belum diselesaikan. Selesaikan dahulu sebelum juara.',
@@ -355,6 +360,7 @@ export const adminPagesMs: Record<string, string> = {
'audit.action.UPDATE_PLAYER_ACCOUNT_SETTINGS': 'Kemas kini tetapan akaun pemain',
'audit.action.UPDATE_AGENT_SUSPEND_SETTINGS': 'Kemas kini tetapan penggantungan ejen',
'audit.action.UPDATE_AGENT_HIERARCHY_SETTINGS': 'Kemas kini tetapan hierarki ejen',
'audit.action.UPDATE_PLATFORM_DIRECT_CASHBACK_SETTINGS': 'Kemas kini tetapan rebat platform',
'audit.action.UPDATE_BETTING_LIMITS': 'Kemas kini had pertaruhan',
'audit.action.CONFIRM_SETTLEMENT': 'Sahkan penyelesaian',
'audit.action.CONFIRM_RESETTLE': 'Sahkan penyelesaian semula',
@@ -362,6 +368,7 @@ export const adminPagesMs: Record<string, string> = {
'audit.action.CANCEL_CASHBACK': 'Batalkan kelompok rebat',
'audit.action.CREATE_STAFF': 'Cipta kakitangan',
'audit.action.UPDATE_STAFF': 'Kemas kini kakitangan',
'audit.action.DELETE_STAFF': 'Padam kakitangan',
'audit.action.PURGE_UNUSED_FILES': 'Padam media tidak digunakan',
'audit.action.FORGOT_PASSWORD_RESET': 'Pemain set semula kata laluan',
'audit.action.CREATE_LEAGUE': 'Cipta liga',
@@ -613,6 +620,7 @@ export const adminPagesMs: Record<string, string> = {
'settlement.record_score': 'Simpan skor',
'settlement.preview_hint': 'Pratonton menukar perlawanan ke menunggu penyelesaian (skor disimpan selepas pengesahan; boleh buka semula sebelum itu)',
'settlement.preview_btn': 'Pratonton penyelesaian',
'settlement.view_preview_btn': 'Lihat pratonton penyelesaian',
'settlement.preview_failed': 'Gagal menjana pratonton penyelesaian',
'settlement.err_score_not_recorded': 'Sila masukkan skor separuh masa dan penuh masa sebelum penyelesaian',
'settlement.must_close_first': 'Tutup pertaruhan sebelum penyelesaian',
@@ -647,6 +655,33 @@ export const adminPagesMs: Record<string, string> = {
'settlement.smart.strategy.TARGET_HOLD': 'Sasaran pegangan',
'msg.score_recorded': 'Skor disimpan',
'msg.settlement_confirmed': 'Penyelesaian disahkan',
'settlement.resettle_reason': 'Sebab penyelesaian semula',
'settlement.resettle_preview': 'Pratonton penyelesaian semula',
'settlement.resettle_preview_title': 'Pratonton penyelesaian semula',
'settlement.resettle_affected': 'Pertaruhan terpengaruh',
'settlement.resettle_topup': 'Bayaran tambahan diperlukan',
'settlement.resettle_clawback': 'Bayaran balik diperlukan',
'settlement.resettle_confirm': 'Sahkan penyelesaian semula',
'settlement.resettle_affected_list': 'Butiran Pertaruhan Terpengaruh',
'settlement.resettle_col.old_result': 'Keputusan/Bayaran Asal',
'settlement.resettle_col.new_result': 'Keputusan/Bayaran Baharu',
'settlement.resettle_col.adjust': 'Pelarasan',
'settlement.history_tab': 'Rekod Penyelesaian',
'settlement.history_tab_bets': 'Statistik Pertaruhan',
'settlement.history.no_records': 'Tiada rekod penyelesaian',
'settlement.history.col.batch_no': 'No. Kumpulan',
'settlement.history.col.type': 'Jenis',
'settlement.history.col.score': 'Skor (HT/FT)',
'settlement.history.col.corners': 'Sepakan sudut (R/T)',
'settlement.history.col.cards': 'Kad kuning/merah (R/T)',
'settlement.history.col.total_bets': 'Pertaruhan diselesaikan',
'settlement.history.col.total_payout': 'Jumlah bayaran',
'settlement.history.col.total_refund': 'Jumlah bayaran balik',
'settlement.history.col.operator': 'Pengendali',
'settlement.history.col.time': 'Masa diselesaikan',
'settlement.history.col.reason': 'Sebab',
'settlement.history.type.initial': 'Penyelesaian awal',
'settlement.history.type.resettle': 'Penyelesaian semula',
'agent_portal.create_player_section': 'Cipta pemain',
'agent_portal.deposit_section': 'Tambah baki',
@@ -785,6 +820,28 @@ export const adminPagesMs: Record<string, string> = {
'content.inbox_notify.manual_title': 'Tanda "Notifikasi peti mesej" semasa mencipta:',
'content.inbox_notify.banner_note': 'Promosi laman utama',
'content.inbox_notify.announcement_note': 'Notifikasi / ticker',
'content.inbox_broadcast.title': 'Hantar manual',
'content.inbox_broadcast.hint': 'Hantar mesej peti secara manual kepada pemain. Padam rekod juga membuang mesej di peti pemain.',
'content.inbox_broadcast.field_title': 'Tajuk',
'content.inbox_broadcast.field_body': 'Kandungan',
'content.inbox_broadcast.field_target': 'Penerima',
'content.inbox_broadcast.field_username': 'Nama pengguna pemain',
'content.inbox_broadcast.target_all': 'Semua pemain',
'content.inbox_broadcast.target_user': 'Pemain tertentu',
'content.inbox_broadcast.username_placeholder': 'Masukkan nama log masuk pemain',
'content.inbox_broadcast.send': 'Hantar',
'content.inbox_broadcast.send_success': 'Dihantar kepada {n} pemain',
'content.inbox_broadcast.form_invalid': 'Sila isi tajuk atau kandungan sekurang-kurangnya satu bahasa',
'content.inbox_broadcast.target_user_required': 'Nama pengguna pemain diperlukan',
'content.inbox_broadcast.history_title': 'Sejarah penghantaran',
'content.inbox_broadcast.view_title': 'Butiran penghantaran',
'content.inbox_broadcast.col_title': 'Tajuk',
'content.inbox_broadcast.col_target': 'Sasaran',
'content.inbox_broadcast.col_recipients': 'Bilangan',
'content.inbox_broadcast.col_sender': 'Penghantar',
'content.inbox_broadcast.col_time': 'Masa',
'content.inbox_broadcast.delete_confirm': 'Padam "{title}"? Salinan di peti pemain juga akan dibuang.',
'content.inbox_broadcast.locale_fallback_hint': 'Locale yang kosong akan guna susunan: bahasa pemain → Inggeris → Cina Ringkas → Melayu.',
'content.hint.banner': 'Dipaparkan dalam karusel laman utama; ketik untuk halaman butiran. Muat naik imej muka depan dan kandungan kaya seperti pengumuman laman rasmi.',
'content.hint.announcement': 'Dipaparkan sebagai teks bergulir di bahagian atas aplikasi pemain. Isi tajuk dan teks bergulir setiap bahasa — teks biasa sahaja.',
'content.section.publish': 'Tetapan terbitan',
@@ -802,6 +859,7 @@ export const adminPagesMs: Record<string, string> = {
'content.upload.cover_size_hint': 'Lebar disyorkan 860px+. Imej muka depan dan dalam kandungan akan menyesuaikan lebar pada pemain.',
'content.upload.pick_media_title': 'Pilih imej',
'content.upload.no_media': 'Tiada imej dalam pustaka — muat naik dahulu',
'content.upload.load_media_failed': 'Gagal memuat pustaka media',
'content.status.DRAFT': 'Draf',
'content.status.ACTIVE': 'Aktif',
'content.status.INACTIVE': 'Tidak aktif',
@@ -993,6 +1051,15 @@ export const adminPagesMs: Record<string, string> = {
'media.no_files': 'Tiada fail lagi',
'media.refresh': 'Muat Semula',
'media.unused_count': '{n} tidak digunakan',
'media.storage_stats': 'Statistik Storan',
'media.deposits_on_disk': 'Tangkapan Skrin Deposit (Tidak dipetakan ke Media)',
'media.screenshot_cleanup': 'Pembersihan Tangkapan Skrin',
'media.cleanup_auto_enabled': 'Pembersihan Auto Dinonaktifkan/Diaktifkan',
'media.cleanup_keep_days': 'Tempoh Penyimpanan (Hari)',
'media.cleanup_before_date': 'Tarikh Akhir Pembersihan Manual',
'media.cleanup_run_now': 'Bersihkan Sekarang',
'media.cleanup_result': 'Berjaya membersihkan {cleaned} tangkapan skrin, membebaskan storan sebanyak {size}.',
'media.cleanup_expired_tag': 'Dibersihkan',
};
export default adminPagesMs;

View File

@@ -888,6 +888,7 @@ export const adminPagesZh: Record<string, string> = {
'content.upload.pick_media': '从媒体库选择',
'content.upload.pick_media_title': '选择图片',
'content.upload.no_media': '媒体库中暂无图片,请先上传',
'content.upload.load_media_failed': '加载媒体库失败',
'content.upload.url_placeholder': '或手动粘贴图片 URL',
'content.upload.recommended_size': '建议尺寸860 x 360 px或 43:18 同比例图片;前台会完整显示并自动填充不合比例区域。',
'content.link.none': '无跳转',
@@ -1087,6 +1088,14 @@ export const adminPagesZh: Record<string, string> = {
'media.no_files': '暂无文件',
'media.refresh': '刷新',
'media.unused_count': '{n} 个未使用',
'media.storage_stats': '存储空间统计',
'media.deposits_on_disk': '充值订单截图 (未挂靠媒体库)',
'media.screenshot_cleanup': '充值截图清理',
'media.cleanup_auto_enabled': '开启自动定期清理',
'media.cleanup_keep_days': '截图保留天数',
'media.cleanup_before_date': '手动清理截止日期',
'media.cleanup_run_now': '立即清理',
'media.cleanup_result': '成功清理了 {cleaned} 张截图,释放了 {size} 空间。',
};
export const adminPagesEn: Record<string, string> = {
@@ -1979,6 +1988,7 @@ export const adminPagesEn: Record<string, string> = {
'content.upload.pick_media': 'Pick from library',
'content.upload.pick_media_title': 'Select image',
'content.upload.no_media': 'No images in library — upload one first',
'content.upload.load_media_failed': 'Failed to load media library',
'content.upload.url_placeholder': 'Or paste image URL',
'content.upload.recommended_size': 'Recommended size: 860 x 360 px, or any 43:18 image. The player carousel keeps the full image visible and fills extra space.',
'content.link.none': 'No link',
@@ -2178,4 +2188,12 @@ export const adminPagesEn: Record<string, string> = {
'media.no_files': 'No files yet',
'media.refresh': 'Refresh',
'media.unused_count': '{n} unused',
'media.storage_stats': 'Storage Statistics',
'media.deposits_on_disk': 'Recharge Screenshots (Unmapped to Media Library)',
'media.screenshot_cleanup': 'Screenshot Cleanup',
'media.cleanup_auto_enabled': 'Enable Auto-cleanup',
'media.cleanup_keep_days': 'Retention Days',
'media.cleanup_before_date': 'Manual Cleanup Before Date',
'media.cleanup_run_now': 'Clean Now',
'media.cleanup_result': 'Successfully cleaned {cleaned} screenshot(s), freeing {size} of space.',
};

View File

@@ -140,6 +140,7 @@ const adminPages: Record<string, string> = {
'agent.col.credit': 'Limit / Used / Available',
'agent.col.direct_players': 'Direct players',
'agent.direct_players_title': 'Direct players · {name}',
'agent.open_agent_hint': 'Click an agent row to open their direct players page.',
'agent.platform_row_name': 'Platform',
'agent.col.sub_agents': 'Sub-agents',
'agent.col.cashback': 'Cashback rate',
@@ -307,6 +308,10 @@ const adminPages: Record<string, string> = {
'match.hint.edit_published': 'Published: edit kickoff, featured, display names; closed/settled are locked.',
'match.expand_league_hint': 'Expand a league to manage fixtures; use Outright odds for winner markets.',
'match.expand_outright_hint': 'Expand a league to edit winner odds; fixture teams sync automatically, and you can add teams not yet on the schedule.',
'match.open_league_hint': 'Click a league row to open its fixture management page.',
'match.open_outright_hint': 'Click a league row to open its outright odds page.',
'match.league_fixtures_subtitle': 'Fixtures',
'match.league_outrights_subtitle': 'Outright odds',
'outright.odds_only_hint': 'Teams from fixtures are added automatically; add extra teams manually and edit winner odds here. Outright follows league publish—no separate publish step.',
'outright.league_unpublished_hint': 'League is not published yet. Set the league to Published on this page to open outright betting automatically.',
'outright.unsettled_fixtures_hint': '{n} fixture(s) in this league are still unsettled. Settle them before settling the outright market.',
@@ -372,17 +377,24 @@ const adminPages: Record<string, string> = {
'audit.action.UPDATE_AGENT': 'Update agent',
'audit.action.UPDATE_PLAYER_ACCOUNT_SETTINGS': 'Update player account settings',
'audit.action.UPDATE_AGENT_SUSPEND_SETTINGS': 'Update agent suspend settings',
'audit.action.UPDATE_AGENT_HIERARCHY_SETTINGS': 'Update agent hierarchy settings',
'audit.action.UPDATE_PLATFORM_DIRECT_CASHBACK_SETTINGS': 'Update platform cashback settings',
'audit.action.UPDATE_BETTING_LIMITS': 'Update betting limits',
'audit.action.RESET_PLAYER_PASSWORD': 'Reset player password',
'audit.action.CONFIRM_SETTLEMENT': 'Confirm settlement',
'audit.action.CONFIRM_RESETTLE': 'Confirm resettlement',
'audit.action.CONFIRM_CASHBACK': 'Confirm cashback payout',
'audit.action.CANCEL_CASHBACK': 'Cancel cashback batch',
'audit.action.CREATE_STAFF': 'Create staff account',
'audit.action.UPDATE_STAFF': 'Edit staff account',
'audit.action.DELETE_STAFF': 'Delete staff account',
'audit.module.USERS': 'Players',
'audit.module.AGENTS': 'Agents',
'audit.module.SYSTEM': 'System',
'audit.module.SETTINGS': 'Settings',
'audit.module.SETTLEMENT': 'Settlement',
'audit.module.CASHBACK': 'Cashback',
'audit.module.STAFF': 'Staff',
'cashback.start_date': 'Start date',
'cashback.end_date': 'End date',
@@ -591,6 +603,7 @@ const adminPages: Record<string, string> = {
'settlement.record_score': 'Save score',
'settlement.preview_hint': 'Preview moves the match to pending settlement and calculates payouts (scores are saved on confirm; you can reopen betting before confirming)',
'settlement.preview_btn': 'Preview settlement',
'settlement.view_preview_btn': 'View settlement preview',
'settlement.preview_failed': 'Failed to generate settlement preview',
'settlement.err_score_not_recorded': 'Enter half-time and full-time scores before preview',
'settlement.must_close_first': 'Close betting before settlement',
@@ -629,6 +642,26 @@ const adminPages: Record<string, string> = {
'settlement.resettle_topup': 'Top-up required',
'settlement.resettle_clawback': 'Clawback required',
'settlement.resettle_confirm': 'Confirm resettle',
'settlement.resettle_affected_list': 'Affected Bets Details',
'settlement.resettle_col.old_result': 'Old Result/Old Payout',
'settlement.resettle_col.new_result': 'New Result/New Payout',
'settlement.resettle_col.adjust': 'Adjustment',
'settlement.history_tab': 'Settlement Records',
'settlement.history_tab_bets': 'Bet Stats',
'settlement.history.no_records': 'No settlement records',
'settlement.history.col.batch_no': 'Batch No.',
'settlement.history.col.type': 'Type',
'settlement.history.col.score': 'Score (HT/FT)',
'settlement.history.col.corners': 'Corners (H/A)',
'settlement.history.col.cards': 'Yellow/Red cards (H/A)',
'settlement.history.col.total_bets': 'Settled bets',
'settlement.history.col.total_payout': 'Total payout',
'settlement.history.col.total_refund': 'Total refund',
'settlement.history.col.operator': 'Operator',
'settlement.history.col.time': 'Settled at',
'settlement.history.col.reason': 'Reason',
'settlement.history.type.initial': 'Initial settlement',
'settlement.history.type.resettle': 'Resettlement',
'user.betting_limits': 'Betting limits',
'user.betting_limits_hint': 'Global stake/payout/daily limits for player bets',
'user.limit.min_stake': 'Min stake',
@@ -796,6 +829,7 @@ const adminPages: Record<string, string> = {
'content.upload.pick_media_title': 'Select image',
'content.upload.no_media': 'No images in library — upload one first',
'content.upload.load_media_failed': 'Failed to load media library',
'content.btn.create': 'New content',
'content.btn.enable': 'Enable',
'content.btn.disable': 'Disable',
@@ -816,6 +850,28 @@ const adminPages: Record<string, string> = {
'content.inbox_notify.manual_title': 'Check "Inbox notify" when creating:',
'content.inbox_notify.banner_note': 'Homepage promo',
'content.inbox_notify.announcement_note': 'Announcements / ticker',
'content.inbox_broadcast.title': 'Manual send',
'content.inbox_broadcast.hint': 'Manually send inbox messages to players. Deleting a record also removes the message from player inboxes.',
'content.inbox_broadcast.field_title': 'Title',
'content.inbox_broadcast.field_body': 'Body',
'content.inbox_broadcast.field_target': 'Recipients',
'content.inbox_broadcast.field_username': 'Player username',
'content.inbox_broadcast.target_all': 'All players',
'content.inbox_broadcast.target_user': 'Single player',
'content.inbox_broadcast.username_placeholder': 'Enter player login username',
'content.inbox_broadcast.send': 'Send',
'content.inbox_broadcast.send_success': 'Sent to {n} player(s)',
'content.inbox_broadcast.form_invalid': 'Provide a title or body in at least one language',
'content.inbox_broadcast.target_user_required': 'Player username is required',
'content.inbox_broadcast.history_title': 'Send history',
'content.inbox_broadcast.view_title': 'Send details',
'content.inbox_broadcast.col_title': 'Title',
'content.inbox_broadcast.col_target': 'Target',
'content.inbox_broadcast.col_recipients': 'Count',
'content.inbox_broadcast.col_sender': 'Sender',
'content.inbox_broadcast.col_time': 'Sent at',
'content.inbox_broadcast.delete_confirm': 'Delete "{title}"? Player inbox copies will be removed too.',
'content.inbox_broadcast.locale_fallback_hint': 'Missing locales fall back in order: player language → English → Simplified Chinese → Malay.',
'content.hint.banner': 'Shown in the home carousel; tapping opens the detail page. Add a cover image and rich body like an official site announcement.',
'content.hint.announcement': 'Shows as a scrolling marquee at the top of the player app. Enter title and marquee text per language — plain text only.',
'content.section.publish': 'Publish settings',
@@ -1051,6 +1107,15 @@ const adminPages: Record<string, string> = {
'media.no_files': 'No files yet',
'media.refresh': 'Refresh',
'media.unused_count': '{n} unused',
'media.storage_stats': 'Storage Statistics',
'media.deposits_on_disk': 'Recharge Screenshots (Unmapped to Media Library)',
'media.screenshot_cleanup': 'Screenshot Cleanup',
'media.cleanup_auto_enabled': 'Enable Auto-cleanup',
'media.cleanup_keep_days': 'Retention Days',
'media.cleanup_before_date': 'Manual Cleanup Before Date',
'media.cleanup_run_now': 'Clean Now',
'media.cleanup_result': 'Successfully cleaned {cleaned} screenshot(s), freeing {size} of space.',
'media.cleanup_expired_tag': 'Purged',
};
export default adminPages;

View File

@@ -141,6 +141,7 @@ const adminPages: Record<string, string> = {
'agent.col.credit': '授信/已用/可用',
'agent.col.direct_players': '直属玩家',
'agent.direct_players_title': '直属玩家 · {name}',
'agent.open_agent_hint': '点击代理行进入直属玩家管理页。',
'agent.platform_row_name': '平台',
'agent.col.sub_agents': '下级代理',
'agent.col.cashback': '返水率',
@@ -308,6 +309,10 @@ const adminPages: Record<string, string> = {
'match.hint.edit_published': '已发布:可修改开赛时间、热门及显示名称;封盘/已结算后不可编辑。',
'match.expand_league_hint': '展开联赛可管理单场赛事;优胜冠军盘口请到「优胜赛配置」。',
'match.expand_outright_hint': '展开联赛可编辑夺冠赔率;单场球队会自动同步,也可手动补充尚未赛程的球队。',
'match.open_league_hint': '点击联赛行进入单场赛事管理页。',
'match.open_outright_hint': '点击联赛行进入优胜冠军赔率配置页。',
'match.league_fixtures_subtitle': '单场赛事',
'match.league_outrights_subtitle': '优胜冠军赔率',
'outright.odds_only_hint': '单场赛程中的球队会自动加入;可手动添加尚未参赛的球队,并在此调整赔率。冠军盘随联赛发布,无需单独发布。',
'outright.league_unpublished_hint': '联赛尚未发布,请在本页编辑联赛并设为「已发布」后,冠军盘将自动开放投注。',
'outright.unsettled_fixtures_hint': '该联赛仍有 {n} 场单场未结算,请先完成单场结算后再结算冠军盘。',
@@ -373,17 +378,24 @@ const adminPages: Record<string, string> = {
'audit.action.UPDATE_AGENT': '更新代理',
'audit.action.UPDATE_PLAYER_ACCOUNT_SETTINGS': '更新玩家账号设置',
'audit.action.UPDATE_AGENT_SUSPEND_SETTINGS': '更新代理停押设置',
'audit.action.UPDATE_AGENT_HIERARCHY_SETTINGS': '更新代理层级设置',
'audit.action.UPDATE_PLATFORM_DIRECT_CASHBACK_SETTINGS': '更新平台返水设置',
'audit.action.UPDATE_BETTING_LIMITS': '更新投注限额',
'audit.action.RESET_PLAYER_PASSWORD': '重置玩家密码',
'audit.action.CONFIRM_SETTLEMENT': '确认结算',
'audit.action.CONFIRM_RESETTLE': '确认重结算',
'audit.action.CONFIRM_CASHBACK': '确认发放返水',
'audit.action.CANCEL_CASHBACK': '作废返水批次',
'audit.action.CREATE_STAFF': '创建后台账号',
'audit.action.UPDATE_STAFF': '编辑后台账号',
'audit.action.DELETE_STAFF': '删除后台账号',
'audit.module.USERS': '玩家',
'audit.module.AGENTS': '代理',
'audit.module.SYSTEM': '系统',
'audit.module.SETTINGS': '系统设置',
'audit.module.SETTLEMENT': '结算',
'audit.module.CASHBACK': '返水',
'audit.module.STAFF': '后台账号',
'cashback.start_date': '开始日期',
'cashback.end_date': '结束日期',
@@ -573,7 +585,7 @@ const adminPages: Record<string, string> = {
'settlement.chart.stake_by_selection': '选项单关投注额 TOP6',
'settlement.stats_by_market': '按玩法 / 选项汇总',
'settlement.bet_list': '相关注单',
'settlement.bet_list_hint': '按注单聚合;同场串关含多腿时显示 ×腿数',
'settlement.bet_list_hint': '按注单聚合;同场串关含多腿时显示 ×腿数(点击标签可切换查看结算记录)',
'settlement.no_bets': '本场暂无注单',
'settlement.col.market': '玩法',
'settlement.col.selection': '选项',
@@ -592,6 +604,7 @@ const adminPages: Record<string, string> = {
'settlement.record_score': '录入比分',
'settlement.preview_hint': '填写比分后点击生成预览,赛事将进入待结算并计算派彩(正式比分在确认结算后保存;未确认前仍可解除封盘)',
'settlement.preview_btn': '生成结算预览',
'settlement.view_preview_btn': '查看结算预览',
'settlement.preview_failed': '生成结算预览失败',
'settlement.err_score_not_recorded': '请先填写半场与全场比分后再生成预览',
'settlement.must_close_first': '请先封盘后再结算',
@@ -629,6 +642,26 @@ const adminPages: Record<string, string> = {
'settlement.resettle_topup': '需补发金额',
'settlement.resettle_clawback': '需扣回金额',
'settlement.resettle_confirm': '确认重结算',
'settlement.resettle_affected_list': '受影响注单明细',
'settlement.resettle_col.old_result': '原结果/原派彩',
'settlement.resettle_col.new_result': '新结果/新派彩',
'settlement.resettle_col.adjust': '差额调整',
'settlement.history_tab': '结算记录',
'settlement.history_tab_bets': '注单统计',
'settlement.history.no_records': '暂无结算记录',
'settlement.history.col.batch_no': '批次号',
'settlement.history.col.type': '类型',
'settlement.history.col.score': '比分(半/全)',
'settlement.history.col.corners': '角球(主/客)',
'settlement.history.col.cards': '黄牌/红牌(主/客)',
'settlement.history.col.total_bets': '结算注单数',
'settlement.history.col.total_payout': '总派彩',
'settlement.history.col.total_refund': '总退款',
'settlement.history.col.operator': '操作人',
'settlement.history.col.time': '结算时间',
'settlement.history.col.reason': '原因',
'settlement.history.type.initial': '首次结算',
'settlement.history.type.resettle': '重新结算',
'user.betting_limits': '投注限额',
'user.betting_limits_hint': '全局下注校验:最小/最大投注、最高派彩、每日投注上限',
'user.limit.min_stake': '最小投注',
@@ -814,6 +847,28 @@ const adminPages: Record<string, string> = {
'content.inbox_notify.manual_title': '以下类型在新建时勾选「邮箱通知」',
'content.inbox_notify.banner_note': '首页推广',
'content.inbox_notify.announcement_note': '通知公告 / 跑马灯',
'content.inbox_broadcast.title': '手动发送',
'content.inbox_broadcast.hint': '手动向玩家发送站内信;删除记录将同时撤回玩家端对应消息。',
'content.inbox_broadcast.field_title': '标题',
'content.inbox_broadcast.field_body': '正文',
'content.inbox_broadcast.field_target': '发送对象',
'content.inbox_broadcast.field_username': '玩家账号',
'content.inbox_broadcast.target_all': '全部玩家',
'content.inbox_broadcast.target_user': '指定玩家',
'content.inbox_broadcast.username_placeholder': '输入玩家登录账号',
'content.inbox_broadcast.send': '发送',
'content.inbox_broadcast.send_success': '已发送给 {n} 位玩家',
'content.inbox_broadcast.form_invalid': '请至少填写一种语言的标题或正文',
'content.inbox_broadcast.target_user_required': '请填写玩家账号',
'content.inbox_broadcast.history_title': '发送记录',
'content.inbox_broadcast.view_title': '发送详情',
'content.inbox_broadcast.col_title': '标题',
'content.inbox_broadcast.col_target': '对象',
'content.inbox_broadcast.col_recipients': '人数',
'content.inbox_broadcast.col_sender': '发送人',
'content.inbox_broadcast.col_time': '发送时间',
'content.inbox_broadcast.delete_confirm': '确定删除「{title}」?玩家端对应消息将一并删除。',
'content.inbox_broadcast.locale_fallback_hint': '未填写的语言将按玩家语言 → 英文 → 简体中文 → 马来语顺序回退使用已有内容。',
'content.hint.banner': '用于首页轮播展示,点击后进入通知详情页;请填写封面图与正文,像官网发布活动通知一样编辑。',
'content.hint.announcement': '在玩家端顶部显示滚动跑马灯文字;填写各语言标题与滚动文案即可,纯文本无富文本。',
'content.section.publish': '发布设置',
@@ -831,6 +886,7 @@ const adminPages: Record<string, string> = {
'content.upload.cover_size_hint': '建议宽度 860px 以上;玩家端详情页会完整显示封面,正文内图片也会自适应宽度。',
'content.upload.pick_media_title': '选择图片',
'content.upload.no_media': '媒体库中暂无图片,请先上传',
'content.upload.load_media_failed': '加载媒体库失败',
'content.status.DRAFT': '草稿',
'content.status.ACTIVE': '已启用',
'content.status.INACTIVE': '已停用',
@@ -1058,6 +1114,15 @@ const adminPages: Record<string, string> = {
'media.no_files': '暂无文件',
'media.refresh': '刷新',
'media.unused_count': '{n} 个未使用',
'media.storage_stats': '存储空间统计',
'media.deposits_on_disk': '充值订单截图 (未挂靠媒体库)',
'media.screenshot_cleanup': '充值截图清理',
'media.cleanup_auto_enabled': '开启自动定期清理',
'media.cleanup_keep_days': '截图保留天数',
'media.cleanup_before_date': '手动清理截止日期',
'media.cleanup_run_now': '立即清理',
'media.cleanup_result': '成功清理了 {cleaned} 张截图,释放了 {size} 空间。',
'media.cleanup_expired_tag': '已清理',
};
export default adminPages;