---
date: 2026-05-03
topic: 审批中心遗留的硬编码中文（pre-existing，非本批引入）
tags: [i18n, approval, technical-debt]
---

# 现象

切换到英文环境，审批中心 (`/approval-center`) 多处仍渲染中文：

1. **`Submitted：` 全角冒号** —— 列表卡 label，应该是 `Submitted: ` 半角冒号 + 空格
2. **时间线 action 字符串** —— `IT Administrator 提交申请2026/5/1 ...`
   - "提交申请" / "审批通过" / "审批拒绝" / "撤销审批" / "转交给" / "委托给" / "重新分配给" / "代...审批通过/拒绝" / "强制终止流程" / "升级至" / "加签" / "系统自动通过/拒绝" / "系统执行任务" 等 14 处硬编码
3. **`Last edited:L2 全字段...`** —— 表单管理首页"最近编辑"label 与值之间缺空格

# 定位

- 列表卡："Submitted：" 来源 `frontend/src/app/(modules)/approval-center/page.tsx`，搜 `提交时间：`
- 时间线："提交申请" 等来源 `frontend/src/features/approval/designer/LarkProcessPreview.tsx:113-158` `formatOperatorString` 函数
- "Last edited"：`frontend/src/app/(modules)/forms/page.tsx`（最近编辑 heading 拼接）

# 不属于本 batch1 PR 的范围

`git blame` 确认：
- `formatOperatorString` 14 个 case 在 `133e4502 fix(approval): 修复审批流程多操作显示和管理员操作显示问题` 引入（远早于本批分支）
- "Submitted：" 全角冒号同样是历史 commit
- "Last edited" 拼接同上

本 batch1 已修的 6 处（admin actions UI 按钮）属于 `8c8dbe78 挂起流程恢复 admin UI` 在该区域附近 polish 时本应顺手做的，scope 紧贴本批改动，保留修复。

# 推荐处理方式（下个 PR）

1. `formatOperatorString(action, t)` 已经接 `t` 参数，直接复用 `locale = t?.locale || 'zh'` + `i18n.actions.{action}` keys 全部走 t 字典。需要在 `frontend/src/locales/approvals/{zh,en}.ts` 加 `actionLabels` 段（或复用已存在的 `actionTypeLabels` 段）。
2. "Submitted：" / "Last edited:" 这种 label：直接 `locale === 'zh' ? '提交时间：' : 'Submitted: '` 模式（与该文件其他 toast 一致）。
3. 双语回归：跑一遍 zh ↔ en 切换，重点过审批中心列表 + 详情时间线 + 表单管理首页"最近编辑"。

# 教训

PR 合并前的 i18n 双语回归不能只看新加的 UI 区域 —— 周边历史区域的硬编码也会在英文环境下露馅。MCP 切语言后用 `body.innerText` 扫硬编码 zh/全角冒号是低成本的快速筛查手段：

```js
// 在 EN locale 下跑
const t = document.body.innerText;
const zhRegex = /[一-龥]/;        // 出现汉字
const fullwidthColon = /[：，。！？；]/;  // 出现中文标点
```
