Skip to content

docs(analytics): 两页 zh-Hant 的「轉換率」跟简体侧改写为「轉化率」(#905) - #923

Merged
yinlianghui merged 1 commit into
mainfrom
claude/issue-905-zhhant-conversion-rate
Aug 6, 2026
Merged

yinlianghui merged 1 commit into
mainfrom
claude/issue-905-zhhant-conversion-rate

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes #905

采纳 issue 的读法 A:zh-Hant 跟简繁一致、跟 convert 动词面契约,两处改「轉化率」。

页 行 改前 改后 zh-Hans 孪生行(未动)
content/docs/analytics/cubes.zh-Hant.mdx :124 按人物誌的轉換率。 按人物誌的轉化率。 :124 按人物画像的转化率。
content/docs/analytics/reports.zh-Hant.mdx :32 按來源的數量、轉換率和收入 按來源的數量、轉化率和收入 :32 按来源的数量、转化率和收入

行号在 fresh main(6014b2cf)上复核后未发生偏移,与 issue 正文一致。

裁定依据

#844 的「不属于本条的」清单以义项(指标名 ≠ convert 动词面)为由排除了这两处。按基线实测,这条理由的事实前提不成立:

  1. 全仓 zh-Hans 没有任何一处「转换率」。 两处简体孪生行本来就写「转化率」,所以那次排除并没有保住任何「指标名词面」,只是把繁体侧单独留在了原地。
  2. 这个短语没有语言包 label 面,拿不到独立于动词面的词面契约。 grep -rn "转化率\|转换率" src/ 零命中——它是各页自译的散文。语言包能给的最近的锚反而同向跟「转化」:crm_forecast.num_converted_leads.label 是「已转化线索数」、dashboard open_leads.title 是「未转化线索」(src/translations/zh-CN.ts)。
  3. 排除的实际效果是两页各自内部自相矛盾。 cubes.zh-Hant 在 :108 写「轉化數量」、十六行后的 :124 写「轉換率」;reports.zh-Hant 在 :32 写「轉換率」、:59 写「轉化」——后两处都是 convert 动词面:zh-Hant 侧整体没跟上简体侧,marketing/analytics/guides 等 20 余处仍写「轉換」而包里是「转化」 #844 已落地的那一半,正是 #793 的同一缺陷类在其文件面之外还剩两处:sales/index.zh-Hant 的「已到期」,与 quotes.zh-Hans 的「过期日期」×4 #801 正文批评的「半页对半页错」。

读法 B(指标名应有独立词面)本仓无先例支撑,且要动已稳定的简体页并与语言包反向,故不取。

边界:只判三字复合词,裸的 转换 / 轉換 一律不动

这条边界是 #844 划的,本次不移。裸的「转换 / 轉換」在 administration/state-machines 上命名状态机机制、在两份导入指南里是类型强制转换、在 revenue/contracts 上是合同激活——与已退休的 convert 译法同形而不同词。#844/#906 已落地的改动(cubes.zh-Hant:108 的「轉化數量」、reports.zh-Hant:59 的「轉化」)原样保留,未回退。

en 与 zh-Hans 零改动,src/ 零改动,@objectstack/* 版本与 content/docs/releases/ 未触碰。

全量重扫(issue 的复核口径)

grep -rn "转换率\|轉換率\|转化率\|轉化率" content/docs/ src/

改后四条命中,简繁逐行对齐,zh-Hant 侧「轉換率」归零、zh-Hans 侧无「转换率」:

content/docs/analytics/cubes.zh-Hans.mdx:124:- *"按人物画像的转化率。"*
content/docs/analytics/cubes.zh-Hant.mdx:124:- *"按人物誌的轉化率。"*
content/docs/analytics/reports.zh-Hans.mdx:32:| **Lead Source ROI** | 按来源的数量、转化率和收入 |
content/docs/analytics/reports.zh-Hant.mdx:32:| **Lead Source ROI** | 按來源的數量、轉化率和收入 |

未发现第三处同型。 另跑了一遍更宽的 grep -rn "转换\|轉換" content/docs/ src/ 复核:剩余命中全部是状态转换 / 类型强制转换 / 合同激活三类,且简繁成对出现,没有遗漏的 conversion-rate 义项。

补一道门:test/docs-conversion-rate-spelling.test.ts

这段散文此前是守卫盲区——os validate 与 pnpm lint 只走已声明的元数据,从不打开 content/docs,而这个短语又没有语言包键可供派生,所以检查只能落在主张所在的文本里(与 automation-docs-coverage 对 flow 行标签的做法同源)。新测试两条方向:

  • 全量扫描所有中文页(两种字体),拒绝三字复合词「转换率 / 轉換率」;
  • 独立断言两页仍然写着这个指标(CARRIERS)。纯否定断言在句子被整行删掉时会因为「什么都没产出」而变绿——配上正向断言后,删句和拼错一样红。

另有一条 scan-surface 断言(与 source-hygiene-scan-surface 同一精神),防止走空目录的检查静默通过。

反向双向核验——方向先判后跑,两次都如判:

施加的反向操作 预判 实测
还原两行为「轉換率」 扫描断言红并逐行点名;两条 carrier 断言同时红(每页仅有的「轉化率」正是被还原的那一行) Tests 3 failed / 1 passed,offender 列表为 content/docs/analytics/cubes.zh-Hant.mdx:124 — 轉換率 与 content/docs/analytics/reports.zh-Hant.mdx:32 — 轉換率
整行删除 cubes.zh-Hant:124 扫描断言绿(无可发现),carrier 断言红 Tests 1 failed / 3 passed,红的正是 'analytics/cubes' still states the metric in both scripts

第二行就是空断言陷阱的证否:如果只留否定断言,删句会得到一个「因为什么都没产出而通过」的绿。

验证

pnpm verify 六道门在共享验证锁内串行跑通,VERIFY_EXIT=0:

validate  ✓ Validation passed (2402ms)        typecheck  tsc --noEmit 无输出
lint      13 warning(s), 14 suggestion(s)     hygiene    ✓ source hygiene clean
build     ✓ Build complete                    test       Test Files 67 passed (67)
                                                         Tests 1601 passed | 1 skipped

测试数从基线的 66 文件 / 1597 通过增至 67 文件 / 1601 通过,增量即新测试的 4 条。lint/validate 的告警是 main 上既有的(审批组可能解析为空、crm_campaign_member 字段组被遮蔽),与本次改动无关。push 前对四个新增/改动文件做了控制字节自扫 grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f]',退出码 1(无命中);check-source-hygiene.mjs 的控制字节扫描面本就覆盖 content 与 .changeset。未起 dev server。

changeset:.changeset/zhhant-conversion-rate-analytics.md。


Generated by Claude Code

#844 的「不属于本条的」清单把 analytics 的 conversion rate 排除在 convert
动词面之外,理由是「指标名」。按基线实测这条理由的事实前提不成立,#905 是账单:

- 全仓 zh-Hans 没有任何一处「转换率」。两处简体孪生行本来就写「转化率」
  (analytics/cubes.zh-Hans:124、analytics/reports.zh-Hans:32),所以那次排除
  没有保住任何「指标名词面」,只是把繁体侧单独留在原地。
- 这个短语没有语言包 label 面可以立词面契约:全仓 src/ 零命中,它是各页自译的
  散文。语言包能给的最近的锚反而同向跟「转化」——
  crm_forecast.num_converted_leads.label 是「已转化线索数」,dashboard 的
  open_leads.title 是「未转化线索」(src/translations/zh-CN.ts)。
- 于是两页各自内部自相矛盾:analytics/cubes.zh-Hant 在 :108 写「轉化數量」,
  十六行后的 :124 写「轉換率」;analytics/reports.zh-Hant 在 :32 写「轉換率」,
  :59 写「轉化」——后两处都是 #844 已改的那一半。正是 #801 批评的半页对半错。

改动两行,都在繁体页。裸的 转换 / 轉換 一律不动,这条边界是 #844 划的,本次不移:
它在 administration/state-machines 上命名状态机机制、在导入指南里是类型强制转换、
在 revenue/contracts 上是合同激活——与已退休的 convert 译法同形而不同词。
en 与 zh-Hans 零改动,src/ 零改动。

test/docs-conversion-rate-spelling.test.ts 补上这段散文缺的那道门。这个短语没有
语言包键可派生,所以检查只能落在主张所在的文本里:一遍全量扫描所有中文页拒绝
「转换率 / 轉換率」,另一条独立断言两页仍然写着这个指标——纯否定断言在句子被删掉时
会因为「什么都没产出」而变绿,配上正向断言后,删句和拼错一样红。

反向双向核验(方向先判后跑,两次都如判):
- 还原两行 -> 4 条测试红 3 条,扫描断言逐行点名
  content/docs/analytics/cubes.zh-Hant.mdx:124 与
  content/docs/analytics/reports.zh-Hant.mdx:32,两条 carrier 断言同时红
  (每页仅有的「轉化率」正是被还原的那一行)。
- 整行删除 -> 扫描断言绿(无可发现),carrier 断言红。空断言陷阱证否。

Refs #801 #825 #829 #844 #802

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VHrPAGEgFDoHjphqYG4BMa
@vercel

vercel Bot commented Aug 6, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
hotcrm Ignored Ignored Aug 6, 2026 9:01am

Request Review

@github-actions github-actions Bot added the ci/cd CI plumbing and the verification pipeline label Aug 6, 2026
@yinlianghui
yinlianghui marked this pull request as ready for review August 6, 2026 09:05
@yinlianghui
yinlianghui added this pull request to the merge queue Aug 6, 2026
Merged via the queue into main with commit ff208da Aug 6, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci/cd CI plumbing and the verification pipeline

Projects

None yet

2 participants