来源:#793(quotes.zh-Hant 的 `expired` 状态名对齐)实施过程中的顺带发现,均在 #793 划定的文件面(仅 `quotes.zh-Hant.mdx`)之外,故未在 PR #803 里修。基线 `origin/main` = 131daf93。 两处互不相同,但同属一类:**文档里的词与 `src/translations/zh-CN.ts` 不符**。 ## 甲、`sales/index.zh-Hant.mdx:44` —— 与 #793 一字不差的同一个错 ``` - **報價到期**——超過有效期的報價每晚會被自動標記為已到期。 ``` `crm_quote.status.options.expired`(`zh-CN.ts:471-472`)是「已过期」,繁体作「已過期」。**这就是 #793 修的那个词,只是在另一页上**,句式也和刚修好的 `quotes.zh-Hant.mdx:70`(「標記為**已過期**」)一模一样。 zh-Hans 的同一行 `index.zh-Hans.mdx:44` 写的是「已过期」,**是对的**——又一次只有 zh-Hant 错。 行内「**報價到期**」是这条 bullet 的机制名(动词用法),按 #794 / #793 的判断标准**保留**,只改句末的状态名。 > 这一处说明的问题比它本身大:#793 的文件面按「哪一页有这个错」划定,而状态名是**跨页消费**的——`os validate` / `pnpm lint` 不读 `content/docs/`,按页扫描的人也看不见隔壁页。#794 修 `presented` 时全仓扫过(现在全仓 grep `已呈现|已呈現` 零命中,是干净的),`expired` 这一轮没扫到 index 页。 ## 乙、`quotes.zh-Hans.mdx` 把 `expiration_date` 叫作「过期日期」×4 `zh-CN.ts:477` 声明的是: ``` expiration_date: { label: '到期日期' }, ``` 而 `content/docs/sales/quotes.zh-Hans.mdx` 有 4 处写作「过期日期」: | 行 | 原文(节选) | | --- | --- | | `:31` | 条款与有效期 \| 报价日期、**过期日期**、付款条款、运输条款 | | `:65` | **过期日期**必须晚于报价日期——不能创建即过期的报价 | | `:70` | 系统会将任何**过期日期**已过的报价标记为已过期 | | `:127` | 检查有效期(**过期日期**)是否与你的业务周期相匹配 | 同一页另有 3 处(`:112` / `:114` / `:119`)写作**「到期日期」**,与语言包一致。所以这一页自己就有两种叫法,而读者在界面上只找得到「到期日期」那一个。 全仓 grep:「过期日期」只在这一页出现(就是上面 4 行);zh-Hant 页 7 处全部写作「到期日期」,是对的。 注意 `:65` 一行里两种用法都有:句首的「过期日期」是字段名(要改),句尾的「即过期的报价」是动词(保留)。`:3` 的「自动过期」与 `:70` 的「每日过期扫描」是机制名,也保留。 ## 两页正好互为镜像 - **quotes.zh-Hant**:状态名错(已到期,PR #803 已修),字段标签 7 处全对。 - **quotes.zh-Hans**:状态名对,字段标签 4 处错。 #793 立单时按状态名判定「zh-Hans 页是对的」,漏掉的正是它的字段标签——**任何一页都不能拿来当另一页的校对基准**。 ## 文件面 - `content/docs/sales/index.zh-Hant.mdx` 一处(`:44` 句末)。 - `content/docs/sales/quotes.zh-Hans.mdx` 四处(`:31` / `:65` / `:70` / `:127`)。 判断标准同 #793 / #794:**「到期」「过期」作动词或机制名的用法保留**,只有指代**状态名**或 **`expiration_date` 字段**的地方跟语言包。 ⛔ 不要改 `src/**`:以语言包为准,文档跟语言包(contract-first)。 这一类为什么反复发生、以及要不要为它加闸(以及加闸前必须先答的两个问题),记在 #802。 Refs #793, #794, #802
Activity
[-]quotes.zh-Hans.mdx 把 expiration_date 的标签写作「过期日期」×4,语言包是「到期日期」——同页另有 3 处写对了[/-][+]#793 的同一缺陷类在其文件面之外还剩两处:sales/index.zh-Hant 的「已到期」,与 quotes.zh-Hans 的「过期日期」×4[/+]yinlianghui commentedon Aug 5, 2026
同一缺陷类在 quotes 之外还有一片——记在这里而不另开单,免得与本单撞面。来源:#792 / #796(PR #804)实施时,为了把 leads / contacts 的字段区块表按语言包写,逐格对了一遍
zh-CN.ts,顺手撞见的。基线origin/main= 131daf9(PR #804 只改了区块表与欢迎提醒那几行,下列各处都不在它的改动面上)。注意:本单标题说的「还剩两处」偏乐观。 下面是同一类的另外三组,
crm_lead的状态名那组量最大:1. leads zh 三处状态名与
crm_lead的包不一致(zh-CN.ts:345-346)包里是
qualified: '已确认'、unqualified: '未通过'、converted: '已转化',页面写的是「已审核 / 不合格 / 已转换」:leads.zh-Hans.mdx::30「已审核」、:31「不合格」、:32「已转换」,以及散文里的:34、:110、:122、:156;leads.zh-Hant.mdx::30、:31、:32,散文:34、:106、:110、:122、:156。与 #793 的
presented是同一型(状态表 + 每一句用到该状态名的散文都要跟着改,#794 对presented的先例)。另外同页把 convert 一律叫「转换」,而包里convert_lead是「转化线索」、is_converted是「已转化」——是同一处用词分歧的动词面。2. contacts zh 的
reports_to叫「汇报对象」,包里是「直属上级」(zh-CN.ts:161)contacts.zh-Hans.mdx:37、:96;contacts.zh-Hant.mdx:37、:96。(PR #804 已把区块表那一格改成「直属上级」,散文两处仍是旧叫法,正好留在同一页上自相矛盾,宜与本类一起扫。)3. 区块名与
_sections不一致(字段标签之外的第三种面)_sections就是 fieldGroups 的译名(zh-CN.ts:202-208、:427-437),是 zh 界面上分区标题实际显示的字。文档里的区块名是另译:(三语页的表头列都在,逐页各一处。)
这三组的修法与本单完全一致——各页按各自对象的包写,不跨对象统一(
crm_lead.email_opt_out是「拒收邮件」而crm_contact.email_opt_out是「拒绝邮件」,#793 追评已定调)。要不要并进本单的文件面,还是拆一单,请 PM 定;#802 记的正是「这类不一致没有守卫、全靠人眼撞见」,本条又是一次人眼撞见。Refs #793 #802 #792 #796
Generated by Claude Code
yinlianghui commentedon Aug 5, 2026
🔒 认领(修复线 PM 派单):session_01VHrPAGEgFDoHjphqYG4BMa,分支
claude/issue-801-zh-drift-sweep,worktreehotcrm-issue-801。文件面(本 thread 两条追评的全部在案缺口):content/docs/sales/index.zh-Hant.mdx(:44 状态名)、quotes.zh-Hans.mdx(expiration_date 字段标签 ×4 对齐「到期日期」)、leads.zh-Hans/zh-Hant.mdx(状态名三组:已确认/未通过/已转化;reports_to 散文「汇报对象」→「直属上级」;区块名与 _sections 译名不一致处)、contactszh 两页(reports_to 散文两处)、changeset。裁定:contract-first,一切以⚠️ leads/contacts zh 页今天被 #804 重写过字段表,基线取最新 main 逐条重核(表格格内可能已对,散文残留才是本单主体)。⛔ 不动语言包本身(那是 #810 的地盘——若两单对同一处有依赖,以 zh-CN.ts 当前值为准,#810 改的是 campaign_member,与本单文件面无交集)。
zh-CN.ts为准;#803/#794 的先例(状态名全页扫、动词/机制名保留、两对象同名字段各按各的包)照搬;Generated by Claude Code
yinlianghui commentedon Aug 5, 2026
实施完毕:draft PR #825(分支
claude/issue-801-zh-drift-sweep)。正文两处 + 追评三组,按最新 main(6f6ed9ae,含 #804 的字段表重写)逐条重核后一次扫完。基线重核的结果(追评行号有出入的地方):
:110/:122/:156全部属实;但:106「把线索置为未通过」在基线上已经是对的,未动 —— 而 zh-Hant 的同一句仍写「不合格」,已改。两页此处原本不一致。reports_to:docs(sales): 按 fieldGroups 与 contact_welcome 流程重写线索/联系人的字段区块表与欢迎提醒 (#792, #796) #804 确实只改了区块表那一格,散文:37/:96两处残留属实,已改。已到期只有 index.zh-Hant:44 一处;过期日期只有 quotes.zh-Hans 那 4 行)。一处超出追评枚举、请复核: 追评的区块名清单是人眼列的(该评论自己也说标题「还剩两处」偏乐观)。按「区块名对齐
_sections」这条判据逐格重核后,leads 两页还有三格同表同类的漂移没被枚举到 ——身份 → 身份信息、联系信息 → 联系方式(两页)、以及 zh-Hant 的指派 → 分配。同一张表、同一份契约,只改被点名的两格会留下本单正文批评的那种半对半错,所以一并改了;未越出文件面,未新增缺陷类。若判定应当拆单,回退这三格即可。越界发现已另立 #829(未认领、未打标签):
crm_opportunity.stage七个阶段名有四个与包不符(开发期/资格审核/赢单/输单),且该动哪边未定 —— 「赢单/输单」比包里的「成交/失败」更像销售语境的说法,可能是包该改而不是文档该改,所以那单先要维护者定方向。leads.zh-Han*.mdx:121的「开发期」虽在本单文件面上,但属于那一族的 8 处之一,只改 2 处会造成新的半对半错,故留给 #829 一次扫完。另附sales-copilot.zh-Hans.mdx:63把convert_lead动作叫「转换线索」(包里是「转化线索」),那一处是确定的。⛔ 未加守卫(挂 #802);⛔ 未动语言包(#810 的地盘,且本单文件面与 campaign_member 无交集);⛔ 未动 en 页、未动 releases/。
Generated by Claude Code
yinlianghui commentedon Aug 5, 2026
✅ 验收通过 — PR #825 已转 ready 并挂 auto-merge(CI 8/8 绿)。
判定要点:
_sections契约逐格重derive,同表同类,只改枚举格会留下半对半错——裁定采纳(若维护者异议,回退三格即可,PR 已标注)。#829 分诊(两组):甲组(七个商机阶段名四个不符,跨 6 页、该动哪边未定)→ 裁定方向 A:docs 跟包(contract-first 默认——读者要能对上 UI 上实际显示的字;此裁定不预决包的措辞质量,若维护者认为「赢单/输单」优于包里的「成交/失败」,那是单独的包改名决策,可在本单 veto 窗口内留言翻案,届时改为包+docs 同批动);乙组(convert 动词面五处残留)机械跟包,同单交付。入队。#801 随本 PR 关闭。
Generated by Claude Code
docs(sales): align zh lead statuses, quote expiry date, reports-to an…
docs(i18n): spell the lead convert verb 转化 on every Chinese page (obj…
docs(analytics): 两页 zh-Hant 的「轉換率」跟简体侧改写为「轉化率」(objectstack-ai#905) (o…