const messages: Record = { not_found: '内容不存在或已过期。', gone: '内容已删除、下载次数已用完或续传已失效。', seats_full: '空间成员人数已满,请联系所有者。', not_joined: '你已被移出此空间。', visitors_full: '分享的访客名额已满。', unauthorized: '链接权限无效,请使用完整链接重新打开。', forbidden: '此链接没有执行此操作的权限。', sealed: '分享已封存,无法再修改。', too_large: '内容超过服务端容量或条目数量限制。', rate_limited: '请求过于频繁,请稍后重试。', captcha_required: '验证码未通过或已失效,请重新创建。', captcha_unavailable: '验证码服务暂时不可用,请稍后重试。', api_contract_mismatch: '服务端 API 有破坏性更新,请刷新或更新前端后再试。', mode_mismatch: '空间加密模式与链接不符,已拒绝访问。', conflict: '上传内容发生冲突,已停止发送。', username_unavailable: '这个用户名已被使用。', vault_conflict: '账号资源在其他设备上刚刚更新,请再次同步。', account_invalid: '用户名或密码错误,或登录已过期。', account_required: '请先登录账号。', invitation_required: '该空间仅允许受邀账号加入,请登录受邀账号或联系空间主。', channel_password_required: '请输入空间加入密码。', channel_password_invalid: '空间加入密码不正确。', space_name_required: '请填写空间名称。', }; export function errorMessage(error: unknown): string { if (!(error instanceof Error)) return '操作失败,请重试。'; const mapped = messages[error.message]; if (mapped) return mapped; // 不回显来自服务端或解析器的原始错误,它们可能包含密钥或明文。 return /[\u4e00-\u9fff]/.test(error.message) && error.message.length < 100 ? error.message : '操作失败,请重试。'; }