Files
photo-live/apps/viewer/src/api/errors.ts
T
浅念 7385785504 feat(i18n): T15 full-stack language audit with coverage assertions
- viewer/admin 错误码→文案映射按契约 ErrorCodes 枚举全集登记(机器守护
  spec 遍历枚举断言无缺漏 + 映射键在 zh/en 词条均存在 + locale 键集
  递归相等);mobile 镜像补齐 DOWNLOAD_DISABLED(P4a 增补漏登)
- 漏译修复:viewer.photoRemoved en 侧缺失(审计测试捕获);
  DOWNLOAD_DISABLED 观众侧专属文案 + useDownload 专属提示接线;
  admin apiMsg 增 RATE_LIMITED/ALBUM_NOT_PUBLIC/DOWNLOAD_DISABLED/
  SYNC_AUTH_FAILED 四码词条
- 运行时抽查:admin 主旅程 en 版 e2e(登录→相册管理全英文 + 偏好
  持久);embed iframe lang=en 渲染与深链跟随 e2e(zh 侧既有用例覆盖)
- contracts 新增 ./errors 浏览器安全子路径(errors.ts 纯 TS);
  admin 增 @photo/contracts devDep(仅测试消费)

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-20 23:44:27 +08:00

45 lines
2.1 KiB
TypeScript

import { NETWORK_ERROR_CODE } from './client';
// 错误码 → i18n 文案键映射表:401/404 等观众可认知的码给出确定性文案,
// 未登记码统一走 errors.unknown(原始 message 仅用于日志/排查)。
//
// T15 全端语言验收(P4b Task 6):本表按契约枚举全集登记(机器守护见
// __tests__/error-coverage.spec.ts,遍历 @photo/contracts ErrorCodes 断言
// 无缺漏)。viewer 可达码给专属文案;管理/上传/内部域码(登录凭据、成员
// 冲突、上传校验、服务间鉴权——viewer 无对应界面)按移动端先例防御性
// 注册到通用文案,杜绝未来路由扩展时静默漏译。
export const errorCodeI18nKeys: Readonly<Record<string, string>> = {
// 客户端合成码
[NETWORK_ERROR_CODE]: 'errors.network',
// 401 域
AUTH_TOKEN_EXPIRED: 'errors.authExpired',
// 登录凭据错误:viewer 无登录面(App/admin 域),防御性注册。
AUTH_INVALID_CREDENTIALS: 'errors.unknown',
AUTH_RATE_LIMITED: 'errors.rateLimited',
// P2 公开互动(likes/visits)匿名限速 429——viewer 直面。
RATE_LIMITED: 'errors.rateLimited',
AUTH_FORBIDDEN: 'errors.forbidden',
// 404 域
NOT_FOUND: 'errors.notFound',
ALBUM_NOT_FOUND: 'errors.albumNotFound',
ALBUM_NOT_PUBLIC: 'errors.albumNotAvailable',
PHOTO_NOT_FOUND: 'errors.photoNotFound',
PHOTO_NOT_PUBLIC: 'errors.photoNotFound',
// P4a 下载两级开关(A18):相册可见但禁止下载——下载入口与文案直达。
DOWNLOAD_DISABLED: 'errors.downloadDisabled',
// 上传/成员域(admin 与 App 上传链路):viewer 不可达,防御性注册。
ALBUM_UPLOAD_DISABLED: 'errors.unknown',
MEMBER_CONFLICT: 'errors.unknown',
UPLOAD_SESSION_CONFLICT: 'errors.unknown',
UPLOAD_VERIFY_FAILED: 'errors.unknown',
// 服务间内部同步鉴权(/internal/**):外部客户端不可达,防御性注册。
SYNC_AUTH_FAILED: 'errors.unknown',
// 其余
VALIDATION_FAILED: 'errors.validationFailed',
INTERNAL_ERROR: 'errors.internal',
};
export function errorMessageKey(code: string): string {
return errorCodeI18nKeys[code] ?? 'errors.unknown';
}