refactor: 完成全站国际化改造,统一多语言支持

此提交完成了全项目的国际化适配:
1. 新增多语言翻译文件与基础配置
2. 替换所有硬编码文本为i18n调用
3. 优化语言切换与文档语言同步逻辑
4. 重构部分业务逻辑以支持动态翻译
5. 移除过时代码与硬编码配置
This commit is contained in:
2026-05-15 10:41:14 +08:00
parent ac612cb32c
commit f2c7f5e4f1
53 changed files with 2179 additions and 767 deletions

View File

@@ -15,6 +15,9 @@
"pending": "待处理",
"failed": "失败"
},
"navigation": {
"notifications": "通知"
},
"errors": {
"general": "通用"
}

View File

@@ -0,0 +1,397 @@
{
"brand": {
"name": "N lotto"
},
"actions": {
"retry": "重试",
"refresh": "刷新",
"apply": "应用",
"clear": "清除",
"cancel": "取消",
"confirm": "确认",
"loading": "加载中...",
"loadMore": "加载更多",
"processing": "处理中...",
"deleteRow": "删除第 {{row}} 行"
},
"nav": {
"aria": "主导航",
"home": "首页",
"results": "开奖结果",
"orders": "我的注单",
"wallet": "钱包"
},
"panel": {
"home": "首页"
},
"network": {
"offline": "网络已断开,请检查网络连接",
"degraded": "网络不稳定,已切换至降级模式(轮询中...",
"retryReconnect": "尝试重连",
"retry": "重试",
"recoverWebsocket": "尝试恢复 WebSocket 连接",
"recover": "恢复",
"reconnect": "重新连接"
},
"token": {
"critical": "登录即将失效",
"warning": "登录即将过期",
"remaining": "剩余 {{time}}",
"autoRenewing": "正在自动续签...",
"renewNow": "立即续签"
},
"serverError": {
"title": "服务器错误",
"appTitle": "应用发生错误",
"unavailable": "服务器暂时不可用",
"serverMessage": "服务器暂时不可用,请稍后重试",
"appMessage": "抱歉,应用遇到了问题,请尝试刷新页面",
"details": "错误详情:",
"errorId": "错误 ID: {{id}}",
"refreshPage": "刷新页面",
"hall": "投注大厅",
"wallet": "我的钱包",
"code": "错误代码: 500 Internal Server Error",
"home": "返回首页"
},
"notFound": {
"title": "页面不存在",
"description": "抱歉,您访问的页面可能已被删除、移动或从未存在过。",
"home": "返回首页",
"hall": "投注大厅",
"results": "开奖结果",
"wallet": "我的钱包"
},
"player": {
"fallback": "玩家 #{{id}}"
},
"draw": {
"currentIssue": "当前期号",
"currentTime": "当前时间",
"closesIn": "距封盘",
"drawsIn": "距开奖",
"coolDown": "冷静期",
"loadFailedRefresh": "加载失败,请下拉刷新",
"issueNo": "期号",
"hall": "下注大厅",
"noIssue": "暂无可用期号,请稍后再试",
"sealedNotice": "已封盘,请等待下一期。",
"status": {
"pending": "未开始",
"open": "可下注",
"closing": "已封盘",
"closed": "待开奖",
"drawing": "开奖中",
"review": "待审核",
"cooldown": "冷静期",
"settling": "结算中",
"settled": "已结算",
"cancelled": "已取消"
}
},
"hall": {
"aria": "下注表格",
"loadingError": "加载玩法失败,请稍后重试。",
"noDraw": "暂无当期期号,无法提交。",
"notBettable": "当前已封盘或不可下注。",
"catalogNotReady": "玩法配置尚未加载完成。",
"emptyLines": "请至少填写一组有效号码和下注金额。",
"previewFailed": "预览失败",
"closedSubmit": "已封盘,无法提交。",
"changedBeforeSubmit": "提交前数据已变化,请关闭预览后重试。",
"placeFailed": "提交失败",
"placeSuccess": "下注成功,订单号 {{orderNo}},实扣 {{amount}}。",
"closed": {
"title": "已封盘",
"subtitle": "当前期已停止接收注单。",
"description": "下注窗口已关闭,请等待下一期再下注。"
},
"boxMode": {
"iboxTitle": "iBox",
"iboxDesc": "按金额分摊全部组合",
"boxTitle": "Box",
"boxDesc": "按金额乘以全部组合"
},
"table": {
"no": "序号",
"number": "号码",
"stake": "下注金额",
"rebate": "佣金 / 回水",
"actual": "实扣金额",
"delete": "删除",
"addRow": "添加一行",
"draftTotal": "草稿合计",
"sealedHint": "已封盘:当前表格不可编辑,请等待下一期。",
"previewing": "预览中...",
"submitBet": "提交下注"
},
"preview": {
"title": "确认下注",
"description": "请核对号码、玩法与实扣金额;确认后将扣减彩票钱包且不可撤单。",
"sealedTitle": "已封盘",
"sealedDescription": "当前期已停止接收注单,无法提交。请选择下一期。",
"empty": "暂无预览数据",
"draw": "期号",
"status": "状态",
"totalBet": "总下注",
"rebateDeduct": "回水抵扣",
"actualDeduct": "实扣金额",
"estimatedPayout": "预估最高赔付",
"lines": "注项明细",
"normalizedNumber": "归一号码",
"combinationCount": "组合数",
"actual": "实扣",
"estimatedMax": "预估最高赔",
"backEdit": "返回修改",
"submitting": "提交中...",
"confirmSubmit": "确认提交",
"warningsTitle": "赔付池预警",
"warningsDescription": "以下号码本期赔付池占用较高,仍允许下注;若实际占用不足将售罄拒单。"
},
"amountInput": {
"limit": "限额 {{min}} - {{max}}",
"placeholder": "例如 100.00"
},
"numberInput": {
"rollPlaceholder": "如 12R4",
"digitPlaceholder": "0-9"
},
"playSwitcher": {
"empty": "当前币种下没有可下注的开放玩法。",
"label": "玩法"
},
"playCatalog": {
"notReady": "玩法配置尚未初始化。请在 Laravel 执行含 OperationalConfigV1Seeder 的 seed。",
"loadFailed": "加载玩法配置失败,请稍后重试。",
"loading": "加载玩法与赔率...",
"meta": "币种 {{currency}} · 配置版本 play#{{playVersion}} / odds#{{oddsVersion}} · 限额单位为最小货币单位(与钱包一致)。",
"play": "玩法",
"status": "状态",
"limit": "下注限额",
"odds": "赔率×",
"description": "说明",
"open": "开放",
"closed": "关闭",
"riskTitle": "风控封顶(示例号码)",
"number": "号码",
"capAmount": "封顶额",
"type": "类型",
"title": "玩法与赔率",
"descriptionText": "数据来自 GET /api/v1/play/effective后台修改并发布后最长约 {{seconds}}s 内自动刷新,也可手动刷新。",
"refresh": "刷新配置"
},
"ticketError": {
"4001": "该号码本期赔付池不足,已售罄。请更换号码、金额或玩法后重试。",
"1001": "余额不足,请先转入后再下注。",
"2001": "本期已封盘,无法继续下注。",
"2002": "该玩法已关闭,请选择其他玩法。",
"2004": "号码格式或长度不符合该玩法要求。",
"2005": "玩法参数不完整(如单双大小需选择位数与维度)。",
"2006": "当前期号不可下注。",
"2007": "该玩法暂不支持或缺少赔率配置。",
"2008": "赔率或玩法配置已更新,请关闭预览后重新操作。",
"1003": "下注金额超出该玩法允许范围。",
"fallback": "下注失败,请稍后重试。"
},
"amountHint": {
"iboxRoll": "本玩法金额为单注金额,系统按展开组合数计算总下注与实扣。",
"mbox": "本玩法金额为总输入金额,将均摊到各排列组合(向下取整到最小单位)。",
"default": "金额为该笔注单的下注额(最小货币单位整数,与钱包一致)。"
}
},
"wallet": {
"title": "钱包",
"subtitle": "余额与划转记录",
"balance": "钱包余额",
"available": "可用 {{amount}}",
"transferIn": "转入",
"transferOut": "转出",
"inPage": "转入页",
"outPage": "转出页",
"logs": "流水",
"logsTitle": "钱包流水",
"logsSubtitle": "划转与下注记录",
"typeFilter": "类型筛选",
"transferInTitle": "转入资金",
"transferOutTitle": "转出资金",
"transferInSubtitle": "转入彩票钱包({{currency}}",
"transferOutSubtitle": "转回主站钱包({{currency}}",
"transferInDescription": "从主站钱包划入彩票钱包,单笔限额以服务端校验为准。",
"transferOutDescription": "划回主站钱包;单笔限额以服务端校验为准。",
"dialogInDescription": "从主站钱包划入彩票钱包(最小单笔以服务端校验为准,默认约 1.00 {{currency}})。",
"dialogOutDescription": "划回主站钱包;单笔限额以服务端校验为准。",
"mainBalance": "主站钱包余额:",
"mainPending": "—(待接入主站)",
"lotteryBalance": "彩票钱包余额:",
"lotteryAvailable": "彩票钱包可用:",
"inAmount": "转入金额",
"outAmount": "转出金额",
"exampleIn": "例如 1000.00",
"exampleOut": "例如 500.00",
"afterInPreview": "转入后彩票余额(预览): {{amount}}",
"afterOutPreview": "转出后彩票余额(预览): {{amount}}",
"allOut": "全部转出 {{amount}}",
"confirmIn": "确认转入",
"confirmOut": "确认转出",
"successIn": "转入成功,彩票钱包余额已更新。",
"successOut": "转出成功,资金将返回主站钱包。",
"pendingShort": "转账处理中,请稍后刷新。",
"pendingToast": "处理中...",
"invalidAmount": "请输入有效金额。",
"outExceeds": "转出金额不能超过可用余额。",
"pendingTitle": "待对账",
"pendingDescription": "以下划转主站结果未最终确认;若长时间未到账请联系客服。",
"pendingStatus": "处理中",
"flowsTitle": "资金流水",
"totalRecords": "共 {{total}} 条记录",
"emptyLogs": "暂无流水",
"flow": {
"all": "全部",
"transfer_in": "转入",
"transfer_out": "转出",
"bet": "下注扣款",
"prize": "派彩",
"refund": "退本",
"reversal": "冲正"
},
"txnStatus": {
"posted": "成功",
"pending_reconcile": "待对账",
"reversed": "已冲正",
"manually_processed": "已人工处理"
},
"error": {
"401": "登录已失效,请返回重新进入。",
"409": "转账处理中,请稍后刷新;若长时间未到账请联系客服。",
"network": "网络异常,请检查连接后重试。",
"timeout": "请求超时,请稍后重试。",
"fallback": "请求失败,请稍后重试。",
"1001": "彩票钱包余额不足,请转入或减少转出金额。",
"1002": "转账处理中,请稍后在本页刷新余额;若长时间未到账请联系客服。",
"1003": "金额超出单笔或每日限额,请调整金额。",
"1004": "当前已暂停转入,请稍后再试或联系客服。",
"1005": "币种无效或未开通。",
"1006": "当前已暂停转出,请稍后再试或联系客服。",
"1007": "彩票钱包已冻结,暂无法划转。",
"1008": "金额格式不正确。",
"1009": "主站未能完成本次划转,请稍后重试。",
"1010": "请勿用同一幂等键发起不同金额的转账。"
}
},
"orders": {
"title": "我的注单",
"subtitle": "最近下注记录",
"betDetail": "注单详情",
"filteredIssue": "已筛选期号",
"totalRecords": "总记录数",
"betNow": "立即下注",
"empty": "暂无下注记录。",
"submitBet": "提交下注",
"stake": "下注",
"deduction": "实扣",
"win": "中奖 {{amount}}",
"detailTitle": "注单详情",
"ticketNo": "注单号 {{ticketNo}}",
"orderNo": "订单 {{orderNo}}",
"drawNo": "期号",
"placedAt": "下单时间",
"number": "号码",
"play": "玩法",
"amount": "下注金额",
"rebateRate": "回水率",
"actualDeduct": "实扣金额",
"oddsSnapshot": "赔率快照",
"drawNumbers": "开奖号码(本期)",
"firstPrize": "头奖",
"hit": "命中",
"notPublished": "本期开奖号码尚未发布或不可展示。",
"matchWin": "匹配结果:命中 {{tier}}",
"winAmount": "中奖金额 {{amount}}",
"jackpotAmount": "Jackpot {{amount}}",
"payoutTotal": "派彩合计 {{amount}}",
"matchLose": "匹配结果:未中奖",
"settledAt": "结算时间 {{time}}",
"viewDraw": "查看本期开奖",
"backToOrders": "返回我的注单",
"notFound": "注单不存在或无权查看",
"noData": "无数据",
"loadFailed": "加载失败"
},
"results": {
"title": "开奖结果",
"subtitle": "最新开奖历史",
"detailTitle": "开奖详情",
"businessDate": "业务日期",
"empty": "暂无开奖结果。",
"detail": "详情",
"loadFailed": "加载失败",
"unavailable": "该期开奖结果不可用或不存在",
"noData": "无数据",
"previous": " 上一期",
"next": "下一期 ",
"drawTime": "开奖时间: {{time}}",
"myPayout": "本期我的派彩",
"regular": "常规:{{amount}}",
"jackpot": "Jackpot{{amount}}",
"hitPending": "您的注单已命中本期开奖号码中的格子;派彩完成后将显示金额汇总。",
"hitHint": "如果您中奖,与注单匹配的号码将以金色高亮显示(需登录)。",
"viewMyWinning": "查看我的中奖情况",
"jackpotLabel": "Jackpot",
"tier": {
"first": "头奖",
"second": "二奖",
"third": "三奖",
"starter": "特别奖",
"consolation": "安慰奖"
},
"grid": {
"first": "头奖",
"second": "二奖",
"third": "三奖",
"starter": "特别奖",
"consolation": "安慰奖"
}
},
"ticketStatus": {
"success": "待开奖",
"settled_win": "已派彩",
"settled_lose": "未中奖",
"unknown": "{{status}}"
},
"prizeTier": {
"first": "头奖",
"second": "二奖",
"third": "三奖",
"starter": "特别奖",
"consolation": "安慰奖"
},
"playLabels": {
"big": "大",
"small": "小",
"pos_4a": "4A",
"pos_4b": "4B",
"pos_4c": "4C",
"pos_4d": "4D",
"pos_4e": "4E",
"pos_3a": "3A",
"pos_3b": "3B",
"pos_3c": "3C",
"pos_3abc": "3ABC",
"pos_2a": "2A",
"pos_2b": "2B",
"pos_2c": "2C",
"pos_2abc": "2ABC",
"straight": "Straight",
"box": "Box",
"ibox": "iBox",
"mbox": "mBox",
"roll": "Roll",
"half_box": "Half Box",
"head": "头",
"tail": "尾",
"odd": "单",
"even": "双",
"digit_big": "位数大",
"digit_small": "位数小"
}
}