transx-cli:文件转换与 Key 的落盘细节
Office/PDF 的 XML 与文本转换、Key 的 0600 原子写入、输出冲突与 JSON 确认边界。
transx-cli 的请求只负责把文本或文件发给 DLX 兼容端点;主要代码在文件转换和 Key 管理。
Key
src/config.ts 写 ~/.transx/credentials.json,目录 0700、文件 0600,temp+rename 原子替换;优先级 DLX_API_KEY 环境变量 > 文件;transx init --key-stdin、config set-key --stdin 给无交互环境用;Python skill 里也读同一个路径。Windows 没有 POSIX chmod 对应的 ACL 收紧;Key 在写入时不校验。
Office
Office 转换直接处理 ZIP/XML,不调用 Office:
- docx 改
word/document.xml、header/footer、footnotes、endnotes、comments; - pptx 只改
ppt/slides/slideN.xml,notes/master/layout 不翻译; - xlsx 只改
sharedStrings.xml和sheetN.xml里的 inlineis字符串。
按完全相同的 <w:rPr>/<a:rPr> 分组,遇到 w:hyperlink/w:fldSimple/tab/break 就 flush;译文写进第一个 <w:t>,其余清空,所以一句话里跨样式 run 的格式不会保留。限制:输入 20MB(FILE_MAX_BYTES)、解压 200MB(OFFICE_ARCHIVE_MAX_BYTES)、500 个 unit、100,000 字符、单 unit 1,500 字符(900 字符后在标点切);CSV 只翻非空字段;Markdown 跳过 fenced/缩进代码,保护 inline code/URL/HTML/强调标记。
PDF 只出文字:unpdf extractText → 每行一个段落 → 生成最小 docx(A4 11906×16838 twips、分页),没有图片、表格、字体、标题;扫描版直接 FILE_TEXT_EMPTY,--file 没有 OCR 兜底,只有 --image 有。
输出
默认 <dir>/<name>_<LANG><ext>,LANG 只留 [a-z0-9-] 转大写,冲突 .1–.999,写入用 wx;任何带 code 的 fs 错误都 fallback 成文本/JSON,不让命令失败。OCR 中间文件是 <name>_OCR.md,失败则 FILE_WRITE_ERROR。
非 TTY 的 --json 图片流程返回 awaiting_confirmation、translation_sent=false;TTY 才 y/n;--image 和 --file/文本互斥;--timeout 只作用于单次 HTTP 请求。重试 20s、2 次、300·2^attempt,只重试网络和 5xx,429 立即失败;文件路径 5 个并发 worker、200ms 间隔、最多 500 请求,没有总 deadline。
history 在 ~/.transx/history/YYYY-MM-DD.json + index.json,+8 时区,wx 0600 锁、5s 获取、30s stale rename;只警告 30 天/100MB,不自动清理。