/** 管理后台：中文 + 英文 + 马来语（核心短文案）
 * 列表页/弹窗大段文案通过 bundles/ 动态 chunk 平载入，不再静态 import admin-pages。
 */
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': '编辑后台账号',
  'staff.field.visible_menus': '菜单权限',
  '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.pending_badge': '待审核 {n} 笔',
  '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.league_fixtures': '单场赛事',
  'breadcrumb.league_outrights': '优胜冠军',
  'breadcrumb.agent_direct_players': '直属玩家',
  '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.refresh': '刷新',
  'common.reset': '重置',
  'common.edit': '编辑',
  'common.yes': '是',
  'common.no': '否',
  'common.delete': '删除',
  'common.cancel': '取消',
  'common.confirm': '确定',
  'common.retry': '重试',
  'common.status': '状态',
  'user.status.ACTIVE': '正常',
  'user.status.SUSPENDED': '已冻结',
  'user.status.DISABLED': '已停用',
  'common.type': '类型',
  'common.keyword': '关键词',
  'common.actions': '操作',
  'common.seq': '序号',
  '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_online': '当前在线',
  'dash.players_online': '当前在线',
  'dash.players_online_hint': '约 2 分钟内活跃',
  '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': '待结算',
  '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
};

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',
  'staff.field.visible_menus': 'Menu Permissions',
  '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.pending_badge': '{n} pending',
  '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.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',
  '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': 'Admin Console',
  'portal.agent': 'Agent Console',

  'common.all': 'All',
  'common.search': 'Search',
  'common.refresh': 'Refresh',
  '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',
  'user.status.ACTIVE': 'Active',
  'user.status.SUSPENDED': 'Suspended',
  'user.status.DISABLED': 'Disabled',
  'common.type': 'Type',
  'common.keyword': 'Keyword',
  'common.actions': 'Actions',
  'common.seq': 'No.',
  '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_online': 'Online now',
  'dash.players_online': 'Online now',
  'dash.players_online_hint': 'Active within ~2 min',
  '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',
  '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
};

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',
  'staff.field.visible_menus': 'Kebenaran Menu',
  '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.pending_badge': '{n} menunggu',
  '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.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',
  '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': 'Pengurusan Admin',
  'portal.agent': 'Pengurusan Ejen',

  'common.all': 'Semua',
  'common.search': 'Cari',
  'common.refresh': 'Muat semula',
  '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',
  'user.status.ACTIVE': 'Aktif',
  'user.status.SUSPENDED': 'Digantung',
  'user.status.DISABLED': 'Dinyahaktifkan',
  'common.type': 'Jenis',
  'common.keyword': 'Kata kunci',
  'common.actions': 'Tindakan',
  'common.seq': 'No.',
  '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_online': 'Dalam talian',
  'dash.players_online': 'Dalam talian',
  'dash.players_online_hint': 'Aktif dalam ~2 min',
  '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',
  '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
};

/** vue-i18n 文案表（扁平 key，与原先 adminT 一致） */
export const adminMessages: Record<AdminLocale, Record<string, string>> = {
  'zh-CN': zh,
  'en-US': en,
  'ms-MY': ms,
};
