# ARR Web 中英泰国际化实现

## 结论

2026-07-31 用户确认执行后，ARR Web 展示层完成 `zh-CN`、`en`、`th` 三语切换基础实现。桌面 `/`、H5 `/h5` 和登录 `/login` 共用一个前端词典/runtime；默认中文，语言选择保存到 localStorage 与同源 cookie，并同步 `html.lang`。顶部品牌 `ARR Report`、XML/Excel/Booking/Finance/BI/C/O、字段名、公司/渠道/房型和报告文件/worksheet 等专有名词保持原样或仅翻译其周边说明。

## 实施范围

- 新增 `arr_web/static/i18n.js`：语义词典、稳定 API 错误码映射、动态 DOM/属性翻译、分页/任务文本模式、日期/整数/CNY/耗时格式化；泰文格式强制 Gregorian calendar 与 Latin digits，业务时区仍为 `Asia/Bangkok`。
- `arr_web/static/index.html`、`h5.html`、`login.html` 增加语言选择器和 runtime；`app.js`、`h5.js`、`login.js` 接入状态、Toast、确认/空态、错误、任务日志、无障碍属性及 locale-change 重绘。
- `styles.css`、`h5.css`、`login.css` 增加泰文字体回退和选择器样式；`arr_web/app.py` 将 i18n runtime 加入静态路由及匿名登录资源白名单。

## 边界与不变量

- 未触发上传、月报/公司报表生成、Booking 草稿删除/激活、下载或数据库写入；未修改认证、CSRF、轮询和业务状态判断。
- 业务状态值、API 结构和报表 Excel 文件名、sheet、表头、公式契约保持不变；语言只作用于用户展示层。API 错误继续通过 code 识别，前端按 locale 显示人类可见文案。
- 语言切换不把已翻译文本当作源文本；runtime 保存原始文案，因此可以从英文/泰文切回中文。

## 验证

- `node --check arr_web/static/i18n.js arr_web/static/app.js arr_web/static/h5.js arr_web/static/login.js`：通过。
- Node DOM/runtime smoke：中文 → English → ไทย → 中文恢复正常；`2026-07` 月份文案和 Thai/English locale 格式化通过；未知 API 错误在英文/泰文下回退到对应语言通用提示。
- `python3 -m unittest discover -s tests -p 'test_arr_web*.py'`：61/61 通过。
- 当前源码临时预览的 390px 登录页验证中文、English、ไทย切换；`ARR Report` 保持不变，泰文长文案无横向溢出。预览进程已关闭，未触碰共享 8766 服务或业务数据。
- 19:27:42 +08 按现有 Screen/Keychain launcher 重启共享 8766；旧进程因未重启仍重定向 `/assets/i18n.js`，重启后 loopback 与当前 LAN `192.168.3.103` 的 `/login`、`/healthz` 和 `/assets/i18n.js` 分别返回 200，匿名根路径返回登录重定向。原 `192.168.3.48` 已不在本机网卡上，未执行业务写操作。
- 完整 `python3 -m unittest discover -s tests`：298 个测试中 8 个环境错误，均为既有测试环境缺少 `httpx` 或 OSS client 映射为 unavailable；未出现与本次 Web 国际化改动相关的失败。
