Repository navigation
docs(sales): name the seven opportunity stages the way the locale pack ships them (#829) - #842
Merged
Conversation
…k ships them (#829) `src/translations/zh-CN.ts` is what a Chinese reader sees on screen. Four of the seven `crm_opportunity.stage` option labels had drifted, and unlike the earlier term fixes this was not one page getting a word wrong — every Chinese page consistently used a second vocabulary the product never displays: prospecting 寻找客户 (docs: 开发期), qualification 资格审查 (资格审核), closed_won 成交 (赢单), closed_lost 失败 (输单). needs_analysis / proposal / negotiation already matched and are untouched. Both stage tables (Opportunities and Pipeline Management, zh-Hans and zh-Hant) now carry the shipped labels, and so does every sentence that names a stage: the drag-to-advance example, the close-reason table, the $100K alert, the approval outcome, the quote-accepted advance, the lead-conversion step that creates an opportunity, and the glossary's closed-won/lost entry. The rule applied: a word the pack ships nowhere is drift wherever it appears; a word the pack does ship is drift only where it names the stage. 开发期, 资格审核 and 输单 appear nowhere in the pack and are gone from the Chinese docs entirely — except 开发期 on the integrations pages, where it means the development environment, not the prospecting stage. 赢单 and 丢单 are the pack's own outcome vocabulary (赢单原因, 丢单原因, 赢/丢单详情, 赢单数, 丢单数, 赢单概率), so they stay wherever they name a reason, a metric or an outcome. Where the docs paired 赢单 with the non-pack 输单 to name the two reason fields rather than the stages — the state-machine close requirement, the cube dimension, the Win/Loss report — the pack's counterpart is 丢单, not 失败. Two same-named terms stay separate, as the pack intends: crm_opportunity.stage.qualification is 资格审查 and crm_lead._sections.qualification is 资格评估. The Leads pages' 通过资格审核 is a thing a person does, not either label, and is untouched. Convert verb face: convert_lead ships the label 转化线索, but the Sales Copilot page named that very button 转换线索. That page now uses the shipped label, and the traditional-Chinese residuals left when the simplified twins were corrected — Accounts, Quick Tour, Introduction, Testing and CI, and the Traditional Sales Copilot page, which named the action 轉換潛在客戶 — now read 转化 / 轉化 too. Documentation only: the locale pack is the contract, so nothing under src/ changed. Fixes #829 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VHrPAGEgFDoHjphqYG4BMa
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
This was referenced Aug 5, 2026
yinlianghui
marked this pull request as ready for review
August 5, 2026 23:29
This was referenced Aug 5, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #829
按 PM 已 record 的裁定执行 方向 A:docs 跟包。唯一事实来源是
src/translations/zh-CN.ts的crm_opportunity.stage,语言包一字未动,src/**、en 页、content/docs/releases/均未触碰。也没有加守卫——那条闸挂在 #802 名下,其正文写明在「zh-Hant 无语言包」与「动词/机制名豁免判据」两个问题定下来之前不宜动手。甲、七个阶段名
prospectingqualificationneeds_analysisproposalnegotiationclosed_wonclosed_lost锚点两页的阶段表(opportunities / pipeline-management × zh-Hans + zh-Hant)先对齐,随后逐句扫全部散文波及页:拖拽推进示例、关单原因表、$100K 大单提醒、审批终态、报价被接受时的推进、线索转化时创建商机的那一步、词汇表的 closed won/lost 条目。
判据:包里有没有这个词
这一单的散文面比 #794/#825 大一个量级,所以先立判据再动手:
开发期、资格审核、输单在zh-CN.ts中零命中,已从 zh 文档中清除。唯一放过的是guides/integrations.zh-Han*.mdx:132的「开发期」——那里指开发环境而非prospecting阶段,issue 正文已点名要放过。赢单/丢单是语言包自己的成败词汇(赢单原因、丢单原因、赢/丢单详情、赢单数、丢单数、赢单概率),所以它们在指代原因、指标、成败结果时一律保留:「未赢单、未丢单的交易」「赢单率」「赢单原因」「赢单/丢单复盘」照旧;只有读者会拿它去界面上找阶段值的地方才改,例如「阶段会被自动设为赢单」→ 成交。由此派生出一处值得单独说明的取舍:文档把
赢单与非包词输单配对来指代两个原因字段(而非两个阶段)时——状态机的关单必填、cube 维度、Win/Loss 报表——包里的对应词是丢单而不是失败,故这几处写作「赢单/丢单原因」。crm_opportunity.stage.qualification是「资格审查」,crm_lead._sections.qualification是「资格评估」,两者在包里是有意分开的(#793 追评、#825 定调)。本 PR 只把商机侧阶段表的「资格审核」改成「资格审查」;leads 三处与 sales/index 一处的「通过资格审核 / 应用 BANT 资格审核」是人做的动作、不是任一标签,#825 已明确保留,本次同样未动。leads 页的「资格评估」区块名也原样保留。乙、convert 动词面
convert_lead的 label 是「转化线索」,而sales-copilot.zh-Hans.mdx:63白纸黑字把这个按钮叫「转换线索」,已改为包里的写法。另按「行号按最新 main 重核」的要求复核了 issue 列出的其余四处,并顺带修正了 issue 正文的一处事实偏差:这四处的共同形状是简繁不同步:
quick-tour.zh-Hans:54,64、introduction.zh-Hans:23、testing-and-ci.zh-Hans:266早已是「转化」,只有繁体孪生页还停在「轉換」;accounts则相反,简繁两侧都还是「转换」。本次把繁体侧补齐(quick-tour 同页:60属同一条线索转化链,一并处理),并按语言对偶补上accounts.zh-Hant:62——#803 只修 quotes 页、留下 index 页给 #825 的教训就在这里。文件面(25 个 zh 页 + changeset,62 行)
sales/opportunities.zh-Han{s,t}.mdx、sales/pipeline-management.zh-Han{s,t}.mdxsales/leads.zh-Han{s,t}.mdx、sales/index.zh-Han{s,t}.mdx、sales/quotes.zh-Han{s,t}.mdx、administration/state-machines.zh-Han{s,t}.mdx、reference/glossary.zh-Han{s,t}.mdx、analytics/cubes.zh-Han{s,t}.mdx、analytics/reports.zh-Han{s,t}.mdxai-copilot/sales-copilot.zh-Han{s,t}.mdx、sales/accounts.zh-Han{s,t}.mdx、getting-started/quick-tour.zh-Hant.mdx、getting-started/introduction.zh-Hant.mdx、customization/testing-and-ci.zh-Hant.mdx.changeset/zh-docs-opportunity-stage-names.md一处同句连带,明确披露:
pipeline-management.zh-Han{s,t}.mdx:87原文是「归档输单交易并附上失单原因」。失单原因严格说属于字段标签漂移(包里是「丢单原因」)而非阶段名族,但它与被改写的输单同在一个分句,且失单同样是包里零命中的词——留着会让这一行在改写后当场自相矛盾,故一并改为「归档失败的交易并附上丢单原因」。除此之外未越界改任何字段标签。验证
一次性对照脚本(照 #825 先例,不入库),阶段名从
zh-CN.ts现读、不硬编码,双向跑:基线恰好点出每页 4 个(而非 7 个)阶段名缺失,与 issue 正文的四行 ❌ 完全吻合,
needs_analysis/提案/谈判三个未报——这是对 issue 前提的独立复核。全量四件套(
flock /tmp/os-heavy-verify.lock,NODE_OPTIONS=--max-old-space-size=4096,vitest--maxWorkers=2):测试输出中的
✗ source hygiene failed: ...数行来自test/source-hygiene-scan-surface.test.ts——它故意用埋雷夹具跑 hygiene 脚本并断言其大声失败,是该元测试的预期 stderr,不是真失败。控制字符自扫(越过 gate 的盲区,26 个改动文件 + 脚本本身):
grep -naP扫 C0 控制字节(不含 tab/LF/CR)零命中。与
origin/main最新的 aacc75a(#841 改了sales/accounts.zh-Han{s,t}.mdx)实测可干净合并:其改动落在同文件:66一带,本 PR 落在:62。越界发现(已去重后另立 issue,本 PR 一处不修)
state-machines页的「状态转换」是机制名不能动。forecast_category.best_case在 zh 文档有三种写法(包里「最佳情况」,opportunities.zh-Han{s,t}:128,134写「最佳可能」,automation.zh-Han{s,t}:91写「最好情况」)。其中 4 处就在本 PR 已经在改的锚点页上,但属forecast_category而非stage,越界未动,故明确挂账。finding)—— 语言包内部自相矛盾:zh-CN.ts的 4 个 help 串用了自己 label 不用的词(name_normalized/company_normalized说「线索转换」而 label 是「转化线索」;win_reason/loss_reason的 help 引号点名「赢单」/「丢单」两个阶段值,而阶段 label 是「成交」/「失败」)。这是 zh 文档里 crm_opportunity 的 7 个阶段名有 4 个与语言包不符(开发期/资格审核/赢单/输单),且这一组该动哪边未定 #829 当初 A/B/C 之争里方向 B 唯一没被摆上台面的证据;建议 B1(help 跟 label),不产生文档返工。