Files
thebet365/apps/admin/src/i18n/admin-messages.ts
Mars 2a8b8415e7 feat: 赛事管理操作日志与审计页体验优化
- API 为赛事/联赛/盘口/赔率/冠军盘写操作写入 CATALOG 审计日志,并新增 catalog-audit-logs 接口

- 管理端将赛事日志独立至赛事管理子页,通用操作日志排除 CATALOG 模块

- 统一赛事子页 list-chrome 布局与面包屑;修复操作日志页表格滚动与分页不可见问题

- 补充中英文/马来语文案及 UAT 验收项 SEC013/SEC014

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-16 10:00:24 +08:00

919 lines
37 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { adminPagesEn, adminPagesZh } from './admin-pages';
import { adminPagesMs } from './admin-pages-ms';
/** 管理后台:中文 + 英文 + 马来语 */
export type AdminLocale = 'zh-CN' | 'en-US' | 'ms-MY';
export const ADMIN_LOCALES: {
code: AdminLocale;
label: string;
}[] = [
{ code: 'zh-CN', label: '中文' },
{ code: 'en-US', label: 'English' },
{ code: 'ms-MY', label: 'Bahasa Melayu' },
];
const zh: Record<string, string> = {
'login.title': '管理后台',
'login.username': '用户名',
'login.password': '密码',
'login.submit': '登录',
'login.username_ph': '请输入用户名',
'login.password_ph': '请输入密码',
'login.err_captcha': '验证码错误,请重试',
'login.err_failed': '登录失败,请检查账号与密码',
'login.err_quick': '快速登录失败',
'login.quick_label': '快速登录(调试)',
'login.quick_admin': '管理员',
'login.quick_agent': '一级代理',
'login.quick_agent2': '二级代理',
'login.quick_match_admin': '赛事管理员',
'login.quick_finance_admin': '财务管理员',
'login.quick_support': '客服查询员',
'staff.create_btn': '创建后台账号',
'staff.col.role': '角色',
'staff.col.last_login': '最近登录',
'staff.dialog.create': '创建后台账号',
'staff.dialog.edit': '编辑后台账号',
'login.captcha_ph': '验证码',
'login.captcha_refresh': '点击刷新',
'nav.dashboard': '概览',
'nav.dashboard.matches': '赛事概览',
'nav.dashboard.players': '玩家概览',
'nav.invites': '邀请管理',
'nav.users': '玩家管理',
'nav.agents': '代理管理',
'nav.agents_players': '代理&玩家',
'nav.matches': '赛事管理',
'nav.outrights': '优胜冠军',
'nav.bets': '注单管理',
'nav.credit_transactions': '额度流水',
'nav.finance_logs': '财务流水',
'nav.cashback': '返水管理',
'nav.contents': '公共管理',
'nav.audit': '操作日志',
'nav.smoke_tests': '自动化测试',
'nav.media': '媒体库',
'nav.payment_methods': '收款方式',
'nav.deposit_orders': '充值审核',
'nav.deposit_manage': '充值管理',
'nav.staff': '后台账号',
'nav.players': '直属玩家',
'deposit.payment_methods_title': '收款方式管理',
'deposit.deposit_orders_title': '充值审核',
'deposit.all_status': '所有状态',
'deposit.all_types': '所有类型',
'deposit.status_pending': '待审核',
'deposit.status_approved': '已通过',
'deposit.status_rejected': '已拒绝',
'deposit.search_player_ph': '搜索玩家...',
'deposit.order_no': '订单号',
'deposit.player': '玩家',
'deposit.amount': '金额',
'deposit.screenshot': '截图',
'deposit.approved_amount': '批准金额',
'deposit.reviewer': '审核人',
'deposit.time': '时间',
'deposit.approve': '批准',
'deposit.reject': '拒绝',
'deposit.approve_title': '批准充值',
'deposit.reject_title': '拒绝充值',
'deposit.submitted_amount': '申报金额',
'deposit.approved_amount_label': '批准金额(可调整)',
'deposit.remark_label': '备注(可选)',
'deposit.confirm_approve': '确认批准',
'deposit.approve_check_hint': '请仔细核对截图中的转账金额,确保与下方「批准金额」完全一致后再提交。',
'deposit.confirm_approve_message': '即将批准金额 {amount}。请再次确认该金额与截图一致,确认后将入账玩家钱包。',
'deposit.confirm_reject': '确认拒绝',
'deposit.reject_reason_label': '拒绝原因 *',
'deposit.reject_reason_ph': '请输入拒绝原因...',
'deposit.reason_required': '请输入拒绝原因',
'deposit.revoke': '撤回',
'deposit.confirm_revoke': '将作废批准后 5 分钟内的待结算注单、扣回已入账金额,并恢复为待审核。确定撤回?',
'deposit.reopen_review': '重新审核',
'deposit.confirm_reopen': '订单将恢复为待审核,可再次批准或拒绝。确定继续?',
'deposit.delete': '删除',
'deposit.confirm_delete': '【仅删除记录】将永久删除本订单记录及截图文件。确定继续?',
'deposit.delete_failed': '删除失败',
'deposit.prev': '上一页',
'deposit.next': '下一页',
'deposit.audit_history': '审核记录',
'deposit.audit_action': '操作',
'deposit.audit_actor': '操作人',
'deposit.audit_time': '时间',
'deposit.audit_remark': '备注',
'deposit.audit_submitted': '提交申请',
'deposit.audit_approved': '审核通过',
'deposit.audit_rejected': '审核拒绝',
'deposit.audit_revoked': '撤销审核',
'deposit.audit_reopened': '重新审核',
'deposit.audit_deleted': '已删除',
'deposit.audit_empty': '暂无审核记录',
'deposit.add_method': '+ 添加',
'deposit.display_name': '展示名称',
'deposit.details': '详情',
'deposit.sort': '排序',
'deposit.active': '启用',
'deposit.show_player': '前台展示',
'deposit.edit_method': '编辑收款方式',
'deposit.create_method': '新建收款方式',
'deposit.bank_name': '银行名称',
'deposit.account_holder': '账户持有人',
'deposit.account_number': '银行账号',
'deposit.usdt_address': 'USDT 地址',
'deposit.qr_code': '二维码',
'deposit.sort_order': '排序序号',
'deposit.show_on_player': '展示给玩家',
'deposit.save': '保存',
'deposit.confirm_deactivate': '确认停用此收款方式?',
'deposit.lang_zh': '中文',
'deposit.lang_en': 'English',
'deposit.lang_ms': 'Bahasa',
'deposit.multilingual_hint': '为不同语言设置显示名称,留空则使用默认值',
'nav.subAgents': '二级代理',
'nav.myBets': '注单查询',
'nav.open_menu': '打开菜单',
'nav.close_menu': '关闭菜单',
'breadcrumb.settlement': '赛事结算',
'breadcrumb.match_edit': '编辑赛事',
'breadcrumb.match_markets': '盘口管理',
'breadcrumb.outright_edit': '编辑优胜冠军',
'role.admin': '系统管理员',
'role.super_admin': '超级管理员',
'role.match_admin': '赛事管理员',
'role.finance_admin': '财务管理员',
'role.support': '客服查询员',
'role.agent': '代理账号',
'role.tier1_agent': '一级代理',
'role.tier2_agent': '二级代理',
'logout': '退出',
'lang': '语言',
'portal.admin': '平台后台',
'portal.agent': '代理后台',
'common.all': '全部',
'common.search': '查询',
'common.reset': '重置',
'common.edit': '编辑',
'common.yes': '是',
'common.no': '否',
'common.delete': '删除',
'common.cancel': '取消',
'common.confirm': '确定',
'common.retry': '重试',
'common.status': '状态',
'common.type': '类型',
'common.keyword': '关键词',
'common.actions': '操作',
'common.more': '更多',
'common.loading': '加载中…',
'common.no_data': '暂无数据',
'common.yesterday': '昨日',
'common.vs_yesterday': '较昨日',
'common.people': '人',
'common.bets_unit': '单',
'common.matches_unit': '场赛事',
'common.frozen': '冻结',
'common.used': '已用',
'common.platform_direct': '平台直属',
'common.updated_at': '更新于',
'common.enable': '启用',
'common.disable': '停用',
'common.show_player': '前台展示',
'common.hide_player': '前台隐藏',
'dash.title': '概览',
'dash.desc': '平台整体运行概况',
'dash.board_title': '整体概览',
'dash.board_hint': '一屏查看经营趋势与平台分布',
'dash.kpi_bet_count': '今日投注笔数',
'dash.kpi_stake': '今日投注额',
'dash.kpi_payout': '今日派彩',
'dash.kpi_ggr': '今日毛利',
'dash.kpi_users': '玩家 / 代理',
'dash.kpi_new_players': '今日新增 {n} 人',
'dash.kpi_pending': '待结算',
'dash.kpi_pending_sub': '{bets} 单 · {matches} 场赛事',
'dash.load_error_hint': '无法加载概览数据,请检查网络或稍后重试。',
'dash.kpi_wallet': '玩家余额',
'dash.kpi_credit': '代理授信',
'dash.trend_caption': '近 7 日经营趋势(金额折线 + 注单柱)',
'dash.chart_stake': '投注额',
'dash.chart_payout': '派彩',
'dash.chart_ggr': '毛利',
'dash.chart_bet_count': '注单笔数',
'dash.axis_amount': '金额',
'dash.axis_count': '笔数',
'dash.count_suffix': '笔',
'dash.chart_tooltip': '{b}{c}{d}%',
'dash.pie_empty': '暂无',
'dash.pie_matches': '赛事',
'dash.pie_bets': '今日注单',
'dash.pie_users': '用户',
'dash.match_draft': '草稿',
'dash.match_published': '已发布',
'dash.match_closed': '已封盘',
'dash.match_pending_settle': '待结算',
'dash.match_settled': '已结算',
'dash.user_active': '正常玩家',
'dash.user_suspended': '停用',
'dash.user_direct': '直属',
'dash.user_agents': '代理',
'dash.section_matches_hint': '投注经营与赛事状态分布',
'dash.section_match_ops_hint': '赛事状态与待办',
'dash.trend_bet_count_caption': '近 7 日注单量趋势',
'dash.section_players_hint': '玩家、代理与资金概况',
'dash.kpi_match_total': '赛事总数',
'dash.kpi_match_total_sub': '草稿 {draft} · 已发布 {published}',
'dash.kpi_match_closed': '已封盘',
'dash.kpi_match_closed_sub': '已取消 {n} 场',
'dash.kpi_match_settled': '已结算赛事',
'dash.kpi_match_settled_sub': '已完成结算的场次',
'dash.kpi_agents_active': '活跃代理',
'dash.kpi_agents_active_sub': '停用玩家 {suspended} 人',
'dash.recent_players': '最新注册玩家',
'dash.recent_bets': '最新注单',
'dash.col_parent': '上级',
'dash.col_bet_no': '注单号',
'dash.col_stake': '投注额',
'dash.col_placed_at': '下注时间',
'page.users.title': '玩家管理',
'page.users.desc': '创建玩家、查看余额与投注概况,支持上分与状态管理',
'page.agents.title': '代理管理',
'page.agents.desc': '创建一级代理、调整授信额度、查看直属玩家与额度占用',
'nav.matches.fixtures': '赛事配置',
'nav.matches.outrights': '优胜赛配置(盘口)',
'nav.matches.market_templates': '盘口模板',
'nav.matches.audit_logs': '赛事日志',
'page.matches.title': '赛事管理',
'page.matches.desc': '草稿可编辑、删除;已发布可改开赛时间与热门;未结算可下架',
'page.bets.title': '注单管理',
'page.bets.desc': '筛选、分页查看全平台注单,支持详情与投注项',
'page.cashback.title': '返水管理',
'page.cashback.desc': '按周期生成返水并发放',
'page.audit.title': '操作日志',
'page.audit.desc': '账务、用户、结算等非赛事类管理操作',
'page.matches_audit.title': '赛事日志',
'page.matches_audit.desc': '联赛、赛事、盘口、赔率、冠军盘等赛事管理操作',
'page.settlement.title': '赛事结算',
'page.agent_dash.title': '代理概览',
'page.agent_dash.desc': '下线经营概况与分布',
'agent_dash.load_error_hint': '无法加载概览数据,请检查网络或重新登录后再试。',
'agent_dash.board_hint': '一屏查看下线经营趋势与分布',
'agent_dash.kpi_players': '直属玩家 / 下级代理',
'agent_dash.kpi_pending_sub': '{bets} 单待结算',
'agent_dash.pie_credit': '授信占用',
'agent_dash.pie_players': '直属玩家',
'agent_dash.credit_available': '可用额度',
'agent_dash.credit_used': '已用额度',
'agent_dash.liability_direct': '玩家余额占用',
'agent_dash.liability_child': '下级代理占用',
'page.agent_players.title': '直属玩家',
'page.agent_players.desc': '管理你名下的直属玩家',
'page.agent_sub.title': '二级代理',
'page.agent_sub.desc': '管理二级代理账号与授信分配',
'page.agent_bets.title': '注单查询',
'page.agent_bets.desc': '下级玩家的全部投注记录',
'agent.credit_limit': '授信额度',
'agent.credit_total': '总额度',
'agent.credit_used': '已用额度',
'agent.credit_occupied': '已占用',
'agent.direct_players': '直属玩家',
'agent.player_count': '玩家数',
'agent.today_stake': '今日投注',
'agent.currency_cny': '人民币',
'bet.status.PENDING': '待结算',
'bet.status.WON': '已赢',
'bet.status.LOST': '已输',
'bet.status.VOID': '作废',
'bet.status.REFUNDED': '已退款',
'bet.type.SINGLE': '单关',
'bet.type.PARLAY': '串关',
'bet.settlement.PENDING': '待结算',
'bet.settlement.SETTLED': '已结算',
'bet.settlement.VOID': '已作废',
'bet.result.WON': '赢',
'bet.result.LOST': '输',
'bet.result.VOID': '走水',
'bet.result.PUSH': '走盘',
'bet.result.HALF_WON': '半赢',
'bet.result.HALF_LOST': '半输',
'match.status.DRAFT': '草稿',
'match.status.PUBLISHED': '已发布',
'match.status.CLOSED': '已封盘',
'match.status.SETTLED': '已结算',
'match.status.PENDING_SETTLEMENT': '待结算',
...adminPagesZh,
};
const en: Record<string, string> = {
'login.title': 'Admin Console',
'login.username': 'Username',
'login.password': 'Password',
'login.submit': 'Sign in',
'login.username_ph': 'Enter username',
'login.password_ph': 'Enter password',
'login.err_captcha': 'Captcha incorrect, try again',
'login.err_failed': 'Sign-in failed. Check username and password',
'login.err_quick': 'Quick sign-in failed',
'login.quick_label': 'Quick sign-in (debug)',
'login.quick_admin': 'Admin',
'login.quick_agent': 'Tier-1 agent',
'login.quick_agent2': 'Tier-2 agent',
'login.quick_match_admin': 'Match admin',
'login.quick_finance_admin': 'Finance admin',
'login.quick_support': 'Support',
'staff.create_btn': 'Create staff account',
'staff.col.role': 'Role',
'staff.col.last_login': 'Last login',
'staff.dialog.create': 'Create staff account',
'staff.dialog.edit': 'Edit staff account',
'login.captcha_ph': 'Captcha',
'login.captcha_refresh': 'Click to refresh',
'nav.dashboard': 'Overview',
'nav.dashboard.matches': 'Match overview',
'nav.dashboard.players': 'Player overview',
'nav.invites': 'Invitations',
'nav.users': 'Players',
'nav.agents': 'Agents',
'nav.agents_players': 'Agents & Players',
'nav.matches': 'Matches',
'nav.outrights': 'Outrights',
'nav.bets': 'Bets',
'nav.credit_transactions': 'Credit ledger',
'nav.finance_logs': 'Finance ledger',
'nav.cashback': 'Cashback',
'nav.contents': 'Public Content',
'nav.audit': 'Audit Log',
'nav.smoke_tests': 'Smoke tests',
'nav.media': 'Media Library',
'nav.payment_methods': 'Payment Methods',
'nav.deposit_orders': 'Deposit Review',
'nav.deposit_manage': 'Deposit Mgmt',
'nav.staff': 'Staff accounts',
'nav.players': 'My Players',
'nav.subAgents': 'Tier-2 agents',
'nav.myBets': 'Bet Search',
'deposit.payment_methods_title': 'Payment Methods',
'deposit.deposit_orders_title': 'Deposit Review',
'deposit.all_status': 'All Status',
'deposit.all_types': 'All Types',
'deposit.status_pending': 'Pending',
'deposit.status_approved': 'Approved',
'deposit.status_rejected': 'Rejected',
'deposit.search_player_ph': 'Search player...',
'deposit.order_no': 'Order No',
'deposit.player': 'Player',
'deposit.amount': 'Amount',
'deposit.screenshot': 'Screenshot',
'deposit.approved_amount': 'Approved Amt',
'deposit.reviewer': 'Reviewer',
'deposit.time': 'Time',
'deposit.approve': 'Approve',
'deposit.reject': 'Reject',
'deposit.approve_title': 'Approve Deposit',
'deposit.reject_title': 'Reject Deposit',
'deposit.submitted_amount': 'Submitted Amount',
'deposit.approved_amount_label': 'Approved Amount (adjust if needed)',
'deposit.remark_label': 'Remark (optional)',
'deposit.confirm_approve': 'Confirm Approve',
'deposit.approve_check_hint': 'Carefully verify the transfer amount in the screenshot matches the approved amount below before submitting.',
'deposit.confirm_approve_message': 'You are about to approve {amount}. Confirm it matches the screenshot; this will credit the player wallet.',
'deposit.confirm_reject': 'Confirm Reject',
'deposit.reject_reason_label': 'Reject Reason *',
'deposit.reject_reason_ph': 'Enter the reason for rejection...',
'deposit.reason_required': 'Please enter a reject reason',
'deposit.revoke': 'Revoke',
'deposit.confirm_revoke': 'Pending bets placed within 5 minutes of approval will be voided, credited balance reversed, and the order reset to pending. Continue?',
'deposit.reopen_review': 'Re-review',
'deposit.confirm_reopen': 'The order will return to pending for approve or reject. Continue?',
'deposit.delete': 'Delete',
'deposit.confirm_delete': '[Records only] Permanently delete this order record and screenshot. Continue?',
'deposit.delete_failed': 'Delete failed',
'deposit.prev': 'Prev',
'deposit.next': 'Next',
'deposit.audit_history': 'Review history',
'deposit.audit_action': 'Action',
'deposit.audit_actor': 'Actor',
'deposit.audit_time': 'Time',
'deposit.audit_remark': 'Remark',
'deposit.audit_submitted': 'Submitted',
'deposit.audit_approved': 'Approved',
'deposit.audit_rejected': 'Rejected',
'deposit.audit_revoked': 'Approval revoked',
'deposit.audit_reopened': 'Reopened for review',
'deposit.audit_deleted': 'Deleted',
'deposit.audit_empty': 'No review history yet',
'deposit.add_method': '+ Add',
'deposit.display_name': 'Display Name',
'deposit.details': 'Details',
'deposit.sort': 'Sort',
'deposit.active': 'Active',
'deposit.show_player': 'Show Player',
'deposit.edit_method': 'Edit Payment Method',
'deposit.create_method': 'Create Payment Method',
'deposit.bank_name': 'Bank Name',
'deposit.account_holder': 'Account Holder',
'deposit.account_number': 'Account Number',
'deposit.usdt_address': 'USDT Address',
'deposit.qr_code': 'QR Code',
'deposit.sort_order': 'Sort Order',
'deposit.show_on_player': 'Show on Player',
'deposit.save': 'Save',
'deposit.confirm_deactivate': 'Confirm deactivate this payment method?',
'deposit.lang_zh': 'Chinese',
'deposit.lang_en': 'English',
'deposit.lang_ms': 'Malay',
'deposit.multilingual_hint': 'Set display names for each language. Leave blank to use default.',
'nav.open_menu': 'Open menu',
'nav.close_menu': 'Close menu',
'breadcrumb.settlement': 'Settlement',
'breadcrumb.match_edit': 'Edit match',
'breadcrumb.match_markets': 'Markets',
'breadcrumb.outright_edit': 'Edit outright',
'role.admin': 'Administrator',
'role.super_admin': 'Super admin',
'role.match_admin': 'Match admin',
'role.finance_admin': 'Finance admin',
'role.support': 'Support',
'role.agent': 'Agent',
'role.tier1_agent': 'Tier-1 Agent',
'role.tier2_agent': 'Tier-2 Agent',
'logout': 'Logout',
'lang': 'Language',
'portal.admin': 'Platform Admin',
'portal.agent': 'Agent Portal',
'common.all': 'All',
'common.search': 'Search',
'common.reset': 'Reset',
'common.edit': 'Edit',
'common.yes': 'Yes',
'common.no': 'No',
'common.delete': 'Delete',
'common.cancel': 'Cancel',
'common.confirm': 'OK',
'common.retry': 'Retry',
'common.status': 'Status',
'common.type': 'Type',
'common.keyword': 'Keyword',
'common.actions': 'Actions',
'common.more': 'More',
'common.loading': 'Loading…',
'common.no_data': 'No data',
'common.yesterday': 'Yesterday',
'common.vs_yesterday': 'vs yesterday',
'common.people': 'users',
'common.bets_unit': 'bets',
'common.matches_unit': 'matches',
'common.frozen': 'Frozen',
'common.used': 'Used',
'common.platform_direct': 'Platform direct',
'common.updated_at': 'Updated',
'common.enable': 'Enable',
'common.disable': 'Disable',
'common.show_player': 'Show player',
'common.hide_player': 'Hide player',
'dash.title': 'Overview',
'dash.desc': 'Platform overview',
'dash.board_title': 'Overview',
'dash.board_hint': 'Trends and distribution at a glance',
'dash.kpi_bet_count': "Today's bet count",
'dash.kpi_stake': "Today's stake",
'dash.kpi_payout': "Today's payout",
'dash.kpi_ggr': "Today's GGR",
'dash.kpi_users': 'Players / Agents',
'dash.kpi_new_players': '{n} new today',
'dash.kpi_pending': 'Pending settlement',
'dash.kpi_pending_sub': '{bets} bets · {matches} matches',
'dash.load_error_hint': 'Could not load overview data. Check your connection and try again.',
'dash.kpi_wallet': 'Player balance',
'dash.kpi_credit': 'Agent credit',
'dash.trend_caption': 'Last 7 days (amount lines + bet bars)',
'dash.chart_stake': 'Stake',
'dash.chart_payout': 'Payout',
'dash.chart_ggr': 'GGR',
'dash.chart_bet_count': 'Bet count',
'dash.axis_amount': 'Amount',
'dash.axis_count': 'Count',
'dash.count_suffix': 'bets',
'dash.chart_tooltip': '{b}: {c} ({d}%)',
'dash.pie_empty': 'N/A',
'dash.pie_matches': 'Matches',
'dash.pie_bets': "Today's bets",
'dash.pie_users': 'Users',
'dash.match_draft': 'Draft',
'dash.match_published': 'Published',
'dash.match_closed': 'Closed',
'dash.match_pending_settle': 'Pending settlement',
'dash.match_settled': 'Settled',
'dash.user_active': 'Active players',
'dash.user_suspended': 'Suspended',
'dash.user_direct': 'Direct',
'dash.user_agents': 'Agents',
'dash.section_matches_hint': 'Betting performance and match distribution',
'dash.section_match_ops_hint': 'Match status and pending work',
'dash.trend_bet_count_caption': '7-day bet volume trend',
'dash.section_players_hint': 'Players, agents, and wallet summary',
'dash.kpi_match_total': 'Total matches',
'dash.kpi_match_total_sub': 'Draft {draft} · Published {published}',
'dash.kpi_match_closed': 'Closed',
'dash.kpi_match_closed_sub': '{n} cancelled',
'dash.kpi_match_settled': 'Settled matches',
'dash.kpi_match_settled_sub': 'Matches fully settled',
'dash.kpi_agents_active': 'Active agents',
'dash.kpi_agents_active_sub': '{suspended} suspended players',
'dash.recent_players': 'Recent sign-ups',
'dash.recent_bets': 'Recent bets',
'dash.col_parent': 'Parent',
'dash.col_bet_no': 'Bet No.',
'dash.col_stake': 'Stake',
'dash.col_placed_at': 'Placed at',
'page.users.title': 'Players',
'page.users.desc': 'Create players, balances, stakes, top-ups, and status',
'page.agents.title': 'Agents',
'page.agents.desc': 'Tier-1 agents, credit limits, players, and usage',
'nav.matches.fixtures': 'Fixtures',
'nav.matches.outrights': 'Outright odds',
'nav.matches.market_templates': 'Market templates',
'nav.matches.audit_logs': 'Match logs',
'page.matches.title': 'Matches',
'page.matches.desc': 'Edit/delete drafts; adjust kickoff and featured when published; unpublish while unsettled',
'page.bets.title': 'Bets',
'page.bets.desc': 'Filter and paginate all bets with leg details',
'page.cashback.title': 'Cashback',
'page.cashback.desc': 'Generate and issue cashback by period',
'page.audit.title': 'Audit Log',
'page.audit.desc': 'Non-catalog admin actions: users, wallet, settlement, etc.',
'page.matches_audit.title': 'Match Logs',
'page.matches_audit.desc': 'Leagues, fixtures, markets, odds, and outright operations',
'page.settlement.title': 'Settlement',
'page.agent_dash.title': 'Agent overview',
'page.agent_dash.desc': 'Downline performance at a glance',
'agent_dash.load_error_hint': 'Could not load overview. Check your network or sign in again.',
'agent_dash.board_hint': 'Trends and distribution for your downline',
'agent_dash.kpi_players': 'Direct players / Sub-agents',
'agent_dash.kpi_pending_sub': '{bets} pending bets',
'agent_dash.pie_credit': 'Credit usage',
'agent_dash.pie_players': 'Direct players',
'agent_dash.credit_available': 'Available',
'agent_dash.credit_used': 'Used',
'agent_dash.liability_direct': 'Player balance',
'agent_dash.liability_child': 'Sub-agent exposure',
'page.agent_players.title': 'My players',
'page.agent_players.desc': 'Players under your account',
'page.agent_sub.title': 'Tier-2 agents',
'page.agent_sub.desc': 'Manage tier-2 agents and credit allocation',
'page.agent_bets.title': 'Bet search',
'page.agent_bets.desc': 'All bets from downstream players',
'agent.credit_limit': 'Credit limit',
'agent.credit_total': 'Total limit',
'agent.credit_used': 'Used credit',
'agent.credit_occupied': 'In use',
'agent.direct_players': 'Direct players',
'agent.player_count': 'Players',
'agent.today_stake': "Today's stake",
'agent.currency_cny': 'CNY',
'bet.status.PENDING': 'Pending',
'bet.status.WON': 'Won',
'bet.status.LOST': 'Lost',
'bet.status.VOID': 'Void',
'bet.status.REFUNDED': 'Refunded',
'bet.type.SINGLE': 'Single',
'bet.type.PARLAY': 'Parlay',
'bet.settlement.PENDING': 'Pending',
'bet.settlement.SETTLED': 'Settled',
'bet.settlement.VOID': 'Void',
'bet.result.WON': 'Won',
'bet.result.LOST': 'Lost',
'bet.result.VOID': 'Void',
'bet.result.PUSH': 'Push',
'bet.result.HALF_WON': 'Half won',
'bet.result.HALF_LOST': 'Half lost',
'match.status.DRAFT': 'Draft',
'match.status.PUBLISHED': 'Published',
'match.status.CLOSED': 'Closed',
'match.status.SETTLED': 'Settled',
'match.status.PENDING_SETTLEMENT': 'Pending settlement',
...adminPagesEn,
};
const ms: Record<string, string> = {
'login.title': 'Konsol Admin',
'login.username': 'Nama pengguna',
'login.password': 'Kata laluan',
'login.submit': 'Log masuk',
'login.username_ph': 'Masukkan nama pengguna',
'login.password_ph': 'Masukkan kata laluan',
'login.err_captcha': 'Captcha salah, cuba lagi',
'login.err_failed': 'Log masuk gagal. Semak nama pengguna dan kata laluan',
'login.err_quick': 'Log masuk pantas gagal',
'login.quick_label': 'Log masuk pantas (debug)',
'login.quick_admin': 'Admin',
'login.quick_agent': 'Ejen peringkat 1',
'login.quick_agent2': 'Ejen peringkat 2',
'login.quick_match_admin': 'Pentadbir perlawanan',
'login.quick_finance_admin': 'Pentadbir kewangan',
'login.quick_support': 'Sokongan',
'staff.create_btn': 'Cipta akaun kakitangan',
'staff.col.role': 'Peranan',
'staff.col.last_login': 'Log masuk terakhir',
'staff.dialog.create': 'Cipta akaun kakitangan',
'staff.dialog.edit': 'Edit akaun kakitangan',
'login.captcha_ph': 'Captcha',
'login.captcha_refresh': 'Klik untuk muat semula',
'nav.dashboard': 'Gambaran',
'nav.dashboard.matches': 'Gambaran perlawanan',
'nav.dashboard.players': 'Gambaran pemain',
'nav.invites': 'Jemputan',
'nav.users': 'Pemain',
'nav.agents': 'Ejen',
'nav.agents_players': 'Ejen & Pemain',
'nav.matches': 'Perlawanan',
'nav.outrights': 'Juara',
'nav.bets': 'Pertaruhan',
'nav.credit_transactions': 'Lejar kredit',
'nav.finance_logs': 'Lejar kewangan',
'nav.cashback': 'Rebat',
'nav.contents': 'Kandungan awam',
'nav.audit': 'Log audit',
'nav.smoke_tests': 'Ujian asap',
'nav.media': 'Perpustakaan Media',
'nav.payment_methods': 'Kaedah Pembayaran',
'nav.deposit_orders': 'Semakan Deposit',
'nav.deposit_manage': 'Urus Deposit',
'nav.staff': 'Akaun kakitangan',
'nav.players': 'Pemain saya',
'nav.subAgents': 'Ejen peringkat 2',
'nav.myBets': 'Carian pertaruhan',
'deposit.payment_methods_title': 'Kaedah Pembayaran',
'deposit.deposit_orders_title': 'Semakan Deposit',
'deposit.all_status': 'Semua Status',
'deposit.all_types': 'Semua Jenis',
'deposit.status_pending': 'Menunggu',
'deposit.status_approved': 'Diluluskan',
'deposit.status_rejected': 'Ditolak',
'deposit.search_player_ph': 'Cari pemain...',
'deposit.order_no': 'No. Pesanan',
'deposit.player': 'Pemain',
'deposit.amount': 'Jumlah',
'deposit.screenshot': 'Tangkapan skrin',
'deposit.approved_amount': 'Jml Diluluskan',
'deposit.reviewer': 'Pengulas',
'deposit.time': 'Masa',
'deposit.approve': 'Luluskan',
'deposit.reject': 'Tolak',
'deposit.approve_title': 'Luluskan Deposit',
'deposit.reject_title': 'Tolak Deposit',
'deposit.submitted_amount': 'Jumlah Dihantar',
'deposit.approved_amount_label': 'Jumlah Diluluskan (laraskan jika perlu)',
'deposit.remark_label': 'Catatan (pilihan)',
'deposit.confirm_approve': 'Sahkan Luluskan',
'deposit.approve_check_hint': 'Semak jumlah pindahan dalam tangkapan skrin sepadan dengan jumlah diluluskan di bawah sebelum hantar.',
'deposit.confirm_approve_message': 'Akan meluluskan {amount}. Sahkan ia sepadan dengan tangkapan skrin; baki pemain akan dikreditkan.',
'deposit.confirm_reject': 'Sahkan Tolak',
'deposit.reject_reason_label': 'Sebab Penolakan *',
'deposit.reject_reason_ph': 'Masukkan sebab penolakan...',
'deposit.reason_required': 'Sila masukkan sebab penolakan',
'deposit.revoke': 'Tarik balik',
'deposit.confirm_revoke': 'Pertaruhan menunggu dalam 5 minit selepas kelulusan akan dibatalkan, baki dikembalikan, dan pesanan kembali menunggu. Teruskan?',
'deposit.reopen_review': 'Semak semula',
'deposit.confirm_reopen': 'Pesanan kembali menunggu untuk lulus atau tolak. Teruskan?',
'deposit.delete': 'Padam',
'deposit.confirm_delete': '[Rekod sahaja] Padam rekod pesanan dan tangkapan skrin. Teruskan?',
'deposit.delete_failed': 'Gagal memadam',
'deposit.prev': 'Sebelum',
'deposit.next': 'Seterus',
'deposit.audit_history': 'Sejarah semakan',
'deposit.audit_action': 'Tindakan',
'deposit.audit_actor': 'Pengendali',
'deposit.audit_time': 'Masa',
'deposit.audit_remark': 'Catatan',
'deposit.audit_submitted': 'Dihantar',
'deposit.audit_approved': 'Diluluskan',
'deposit.audit_rejected': 'Ditolak',
'deposit.audit_revoked': 'Kelulusan dibatalkan',
'deposit.audit_reopened': 'Dibuka semula',
'deposit.audit_deleted': 'Dipadam',
'deposit.audit_empty': 'Tiada sejarah semakan',
'deposit.add_method': '+ Tambah',
'deposit.display_name': 'Nama Paparan',
'deposit.details': 'Butiran',
'deposit.sort': 'Isih',
'deposit.active': 'Aktif',
'deposit.show_player': 'Papar Pemain',
'deposit.edit_method': 'Edit Kaedah Pembayaran',
'deposit.create_method': 'Cipta Kaedah Pembayaran',
'deposit.bank_name': 'Nama Bank',
'deposit.account_holder': 'Pemegang Akaun',
'deposit.account_number': 'Nombor Akaun',
'deposit.usdt_address': 'Alamat USDT',
'deposit.qr_code': 'Kod QR',
'deposit.sort_order': 'Susunan Isih',
'deposit.show_on_player': 'Papar kepada Pemain',
'deposit.save': 'Simpan',
'deposit.confirm_deactivate': 'Sahkan nyahaktifkan kaedah pembayaran ini?',
'deposit.lang_zh': 'Cina',
'deposit.lang_en': 'Inggeris',
'deposit.lang_ms': 'Melayu',
'deposit.multilingual_hint': 'Tetapkan nama paparan untuk setiap bahasa. Kosongkan untuk guna nilai lalai.',
'nav.open_menu': 'Buka menu',
'nav.close_menu': 'Tutup menu',
'breadcrumb.settlement': 'Penyelesaian',
'breadcrumb.match_edit': 'Edit perlawanan',
'breadcrumb.match_markets': 'Pasaran',
'breadcrumb.outright_edit': 'Edit juara',
'role.admin': 'Pentadbir',
'role.super_admin': 'Super pentadbir',
'role.match_admin': 'Pentadbir perlawanan',
'role.finance_admin': 'Pentadbir kewangan',
'role.support': 'Sokongan',
'role.agent': 'Ejen',
'role.tier1_agent': 'Ejen Peringkat 1',
'role.tier2_agent': 'Ejen Peringkat 2',
'logout': 'Log keluar',
'lang': 'Bahasa',
'portal.admin': 'Admin Platform',
'portal.agent': 'Portal Ejen',
'common.all': 'Semua',
'common.search': 'Cari',
'common.reset': 'Set semula',
'common.edit': 'Edit',
'common.yes': 'Ya',
'common.no': 'Tidak',
'common.delete': 'Padam',
'common.cancel': 'Batal',
'common.confirm': 'OK',
'common.retry': 'Cuba lagi',
'common.status': 'Status',
'common.type': 'Jenis',
'common.keyword': 'Kata kunci',
'common.actions': 'Tindakan',
'common.more': 'Lagi',
'common.loading': 'Memuatkan…',
'common.no_data': 'Tiada data',
'common.yesterday': 'Semalam',
'common.vs_yesterday': 'berbanding semalam',
'common.people': 'pengguna',
'common.bets_unit': 'pertaruhan',
'common.matches_unit': 'perlawanan',
'common.frozen': 'Dibekukan',
'common.used': 'Digunakan',
'common.platform_direct': 'Terus platform',
'common.updated_at': 'Dikemas kini',
'common.enable': 'Aktifkan',
'common.disable': 'Nyahaktif',
'common.show_player': 'Papar pemain',
'common.hide_player': 'Sembunyikan pemain',
'dash.title': 'Gambaran',
'dash.desc': 'Gambaran keseluruhan platform',
'dash.board_title': 'Gambaran',
'dash.board_hint': 'Trend dan taburan sepintas lalu',
'dash.kpi_bet_count': 'Bilangan pertaruhan hari ini',
'dash.kpi_stake': 'Stake hari ini',
'dash.kpi_payout': 'Bayaran hari ini',
'dash.kpi_ggr': 'GGR hari ini',
'dash.kpi_users': 'Pemain / Ejen',
'dash.kpi_new_players': '{n} baharu hari ini',
'dash.kpi_pending': 'Menunggu penyelesaian',
'dash.kpi_pending_sub': '{bets} pertaruhan · {matches} perlawanan',
'dash.load_error_hint': 'Tidak dapat memuatkan data gambaran. Semak sambungan dan cuba lagi.',
'dash.kpi_wallet': 'Baki pemain',
'dash.kpi_credit': 'Kredit ejen',
'dash.trend_caption': '7 hari lepas (garis jumlah + palang pertaruhan)',
'dash.chart_stake': 'Stake',
'dash.chart_payout': 'Bayaran',
'dash.chart_ggr': 'GGR',
'dash.chart_bet_count': 'Bilangan pertaruhan',
'dash.axis_amount': 'Jumlah',
'dash.axis_count': 'Kiraan',
'dash.count_suffix': 'pertaruhan',
'dash.chart_tooltip': '{b}: {c} ({d}%)',
'dash.pie_empty': 'Tiada',
'dash.pie_matches': 'Perlawanan',
'dash.pie_bets': 'Pertaruhan hari ini',
'dash.pie_users': 'Pengguna',
'dash.match_draft': 'Draf',
'dash.match_published': 'Diterbitkan',
'dash.match_closed': 'Ditutup',
'dash.match_pending_settle': 'Menunggu penyelesaian',
'dash.match_settled': 'Diselesaikan',
'dash.user_active': 'Pemain aktif',
'dash.user_suspended': 'Digantung',
'dash.user_direct': 'Terus',
'dash.user_agents': 'Ejen',
'dash.section_matches_hint': 'Prestasi pertaruhan dan taburan perlawanan',
'dash.section_match_ops_hint': 'Status perlawanan dan tugasan',
'dash.trend_bet_count_caption': 'Trend bilangan pertaruhan 7 hari',
'dash.section_players_hint': 'Pemain, ejen, dan ringkasan dana',
'dash.kpi_match_total': 'Jumlah perlawanan',
'dash.kpi_match_total_sub': 'Draf {draft} · Diterbitkan {published}',
'dash.kpi_match_closed': 'Ditutup',
'dash.kpi_match_closed_sub': '{n} dibatalkan',
'dash.kpi_match_settled': 'Perlawanan diselesaikan',
'dash.kpi_match_settled_sub': 'Perlawanan yang telah diselesaikan',
'dash.kpi_agents_active': 'Ejen aktif',
'dash.kpi_agents_active_sub': '{suspended} pemain digantung',
'dash.recent_players': 'Pendaftaran terkini',
'dash.recent_bets': 'Pertaruhan terkini',
'dash.col_parent': 'Induk',
'dash.col_bet_no': 'No. pertaruhan',
'dash.col_stake': 'Stake',
'dash.col_placed_at': 'Masa pertaruhan',
'page.users.title': 'Pemain',
'page.users.desc': 'Cipta pemain, baki, stake, tambah baki dan status',
'page.agents.title': 'Ejen',
'page.agents.desc': 'Ejen peringkat 1, had kredit, pemain dan penggunaan',
'nav.matches.fixtures': 'Konfigurasi perlawanan',
'nav.matches.outrights': 'Odds juara',
'nav.matches.market_templates': 'Templat pasaran',
'nav.matches.audit_logs': 'Log perlawanan',
'page.matches.title': 'Perlawanan',
'page.matches.desc': 'Edit/padam draf; laraskan masa mula bila diterbitkan; nyahterbit jika belum selesai',
'page.bets.title': 'Pertaruhan',
'page.bets.desc': 'Tapis dan halaman semua pertaruhan dengan butiran pilihan',
'page.cashback.title': 'Rebat',
'page.cashback.desc': 'Jana dan keluarkan rebat mengikut tempoh',
'page.audit.title': 'Log audit',
'page.audit.desc': 'Tindakan bukan katalog: pengguna, dompet, penyelesaian, dll.',
'page.matches_audit.title': 'Log perlawanan',
'page.matches_audit.desc': 'Liga, perlawanan, pasaran, odds, dan outright',
'page.settlement.title': 'Penyelesaian',
'page.agent_dash.title': 'Gambaran ejen',
'page.agent_dash.desc': 'Prestasi downline sepintas lalu',
'agent_dash.load_error_hint': 'Gagal memuatkan gambaran. Semak rangkaian atau log masuk semula.',
'agent_dash.board_hint': 'Trend dan taburan downline anda',
'agent_dash.kpi_players': 'Pemain terus / Ejen bawahan',
'agent_dash.kpi_pending_sub': '{bets} pertaruhan belum selesai',
'agent_dash.pie_credit': 'Penggunaan kredit',
'agent_dash.pie_players': 'Pemain terus',
'agent_dash.credit_available': 'Tersedia',
'agent_dash.credit_used': 'Digunakan',
'agent_dash.liability_direct': 'Baki pemain',
'agent_dash.liability_child': 'Pendedahan ejen bawahan',
'page.agent_players.title': 'Pemain saya',
'page.agent_players.desc': 'Pemain di bawah akaun anda',
'page.agent_sub.title': 'Ejen peringkat 2',
'page.agent_sub.desc': 'Urus ejen peringkat 2 dan peruntukan kredit',
'page.agent_bets.title': 'Carian pertaruhan',
'page.agent_bets.desc': 'Semua pertaruhan pemain hiliran',
'agent.credit_limit': 'Had kredit',
'agent.credit_total': 'Jumlah had',
'agent.credit_used': 'Kredit digunakan',
'agent.credit_occupied': 'Sedang digunakan',
'agent.direct_players': 'Pemain terus',
'agent.player_count': 'Pemain',
'agent.today_stake': 'Stake hari ini',
'agent.currency_cny': 'CNY',
'bet.status.PENDING': 'Menunggu',
'bet.status.WON': 'Menang',
'bet.status.LOST': 'Kalah',
'bet.status.VOID': 'Batal',
'bet.status.REFUNDED': 'Dibayar balik',
'bet.type.SINGLE': 'Tunggal',
'bet.type.PARLAY': 'Berganda',
'bet.settlement.PENDING': 'Menunggu',
'bet.settlement.SETTLED': 'Diselesaikan',
'bet.settlement.VOID': 'Batal',
'bet.result.WON': 'Menang',
'bet.result.LOST': 'Kalah',
'bet.result.VOID': 'Batal',
'bet.result.PUSH': 'Seri',
'bet.result.HALF_WON': 'Separuh menang',
'bet.result.HALF_LOST': 'Separuh kalah',
'match.status.DRAFT': 'Draf',
'match.status.PUBLISHED': 'Diterbitkan',
'match.status.CLOSED': 'Ditutup',
'match.status.SETTLED': 'Diselesaikan',
'match.status.PENDING_SETTLEMENT': 'Menunggu penyelesaian',
...adminPagesMs,
};
/** vue-i18n 文案表(扁平 key与原先 adminT 一致) */
export const adminMessages: Record<AdminLocale, Record<string, string>> = {
'zh-CN': zh,
'en-US': en,
'ms-MY': ms,
};