Skip to content

docs(zh-Hans): call crm_campaign 营销活动 everywhere, not 市场活动 (#830) - #849

Merged
yinlianghui merged 1 commit into
mainfrom
claude/issue-830-campaign-zh-dual-name
Aug 5, 2026
Merged

yinlianghui merged 1 commit into
mainfrom
claude/issue-830-campaign-zh-dual-name

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes #830

crm_campaign 的 zh-Hans 译名统一到语言包与其余 14 个文件的写法「营销活动」。语言包一字未动(⛔),en 页、zh-Hant 页、src/**、content/docs/releases/ 均未触碰。基线取最新 origin/main = 3912845(#811/#828/#843 之后)。

前提复核:成立,但 issue 少数了一处

issue 记 sharing-and-security 有「4 处」,按行数是对的,按出现次数是 5 —— :40 一行上有两处:

| 营销活动成员 | 由父级控制(市场活动) | 成员关系是市场活动的一个属性 …… |
                        ↑ issue 点名了这个        ↑ 这个没点名

两处指的都是父对象 crm_campaign,故一并改。其余与 issue 一致:profiles 3 处、ledger 1 处。zh-Hant 侧实测 市場活動 零命中、行銷活動 覆盖 18 个文件,issue「zh-Hant 无此问题」的判断成立,本 PR 未动繁体。

改动面(9 处文档 + 1 处 ledger)

文件 处数 性质
administration/sharing-and-security.zh-Hans.mdx 5 OWD 表行首 1 + 「由父级控制」行的父对象名 2 + 内置共享规则表对象列 2
administration/profiles.zh-Hans.mdx 3 Sales Manager / Sales Representative / Marketing User 三处授权清单里的对象名
index.zh-Hans.mdx:36 1 首页卡片标题(判据见下)
test/sharing-coverage.test.ts 1 ROW_LABEL['crm_campaign']['zh-Hans']

改前 OWD 表把主从两个对象排在相邻两行、各叫各的名字:管理员既分不清「市场活动」与「营销活动成员」是不是同一族,拿任一个词去 Setup 里也找不到 —— 那里列的是「营销活动」。

反向验证:方向预先声明,实测吻合

先声明再跑:只改文档、ROW_LABEL 故意留旧 → 预测 sharing-and-security.zh-Hans.mdx 一页红两条(缺行 + 幽灵行),en 页块 / zh-Hant 页块 / ledger 完整性 / 标签歧义四项保持绿。方向是常规的「红」而非翻转 —— 该守卫是 ledger 串与表格首格的精确相等连接,单改一侧会同时从两端断开。

阶段一(文档已改,ledger 未同步):

❯ test/sharing-coverage.test.ts (36 tests | 2 failed)
  × every registered object has exactly one row, stating the OWD it ships
  × no row names an object this app does not register

FAIL … > sharing-and-security.zh-Hans.mdx > every registered object has exactly one row …
  crm_campaign: content/docs/administration/sharing-and-security.zh-Hans.mdx (zh-Hans) has no "市场活动" row

FAIL … > sharing-and-security.zh-Hans.mdx > no row names an object this app does not register
  content/docs/administration/sharing-and-security.zh-Hans.mdx (zh-Hans): row "营销活动" names no object this app registers

Tests  2 failed | 34 passed (36)

两条失败点名精确、且只落在 zh-Hans 一页;34 passed 说明预测为绿的四项确实绿。阶段二(同步 ledger):Tests 36 passed (36)。

ROW_LABEL 是 authored ledger 而非从 stack 派生(该文件注释写明「the zh-Hans doc translates independently of the one it does ship」),所以它必须与页面同批移动 —— 这正是 issue 预告的方向。

index.zh-Hans.mdx:36「开展市场活动」:判成对象名引用,已改

派单写的是 sales/index.zh-Hans.mdx:36,实际文件是 issue 正文里的 content/docs/index.zh-Hans.mdx:36;sales/index.zh-Hans.mdx 全页无此词。

按 #842 的判据。#842 立的是两条:(一)包里零 label 的词,出现在哪里都是漂移(唯一豁免是跨域同形词,如 integrations:132 指开发环境的「开发期」);(二)包里活着的词,只在被当作 label 用时才算漂移。

「市场活动」在 zh-CN.ts 里是零-label 词 —— 全包唯一一次出现是一个 help 串(见下方越界发现),没有任何 label 用它。故适用第一条,除非这里是跨域同形词。三条证据表明它不是,而恰恰是动词 开展 的宾语位上的对象名:

  1. 英文原文是 Run marketing campaigns —— campaigns 就是 crm_campaign 的 pluralLabel,不是泛指名词。
  2. zh-Hant 孪生卡片同一位置写「开展行銷活動」(index.zh-Hant.mdx),把繁体对象 label 原样放进同一个「开展+宾语」槽位。两页此处逐词对齐,只有简体这一个词岔开 —— 而 docs(sales): name the seven opportunity stages the way the locale pack ships them (#829) #842 的乙组正是把「简繁不同步」当缺陷收口的。
  3. 卡片的 href 与正文就是 crm_campaign 的功能面:/zh-Hans/docs/marketing,「规划活动、纳入线索与联系人、追踪响应与 ROI」。

所以动词是「开展」,漂的是它的宾语名词。#842 的动词豁免保护的是动作本身(如「通过资格审核」——「资格审核」是人做的动作、且不是任一 label),它不保护一个恰好坐在动词后面的对象 label。判定:改,「开展营销活动」。

一处诚实披露:同一卡片网格里「处理客户工单」的「工单」并不是包里的 label(包是「服务案例」),所以不能拿「本网格一律用包 label」来论证 —— 那本身是 #837 已记的另一条分歧。上面第 2、3 条证据不依赖这个前提。

全仓复扫

改后 市场活动 在 content/ 零命中;全仓仅剩两处,一处是下方越界发现,另一处是我在 ledger 注释里为说明历史而引用的旧写法。无第三处残留。

越界发现(未修,已去重后挂到既有单)

验证(全量四件套,flock /tmp/os-heavy-verify.lock,NODE_OPTIONS=--max-old-space-size=4096,vitest --maxWorkers=2)

pnpm validate  ✓ Validation passed — 5 author-time warning(s)(均为既有:审批组可能解析为空 ×4、campaign_member 字段组 ×1)
pnpm typecheck ✓ tsc --noEmit,无输出
pnpm build     ✓ Build complete — 17 Objects / 24 Flows / dist 1921.3 KB
pnpm test      ✓ Test Files 66 passed (66) · Tests 1587 passed | 1 skipped (1588)
pnpm lint      ✓ 13 warning(s), 14 suggestion(s)(均为既有)
pnpm hygiene   ✓ source hygiene clean — 245 files under src/test/e2e/scripts,控制字节扫描面另含 content/、.changeset/ 共 385 个

测试输出里的 ✗ source hygiene failed: … 数行来自 test/source-hygiene-scan-surface.test.ts —— 它故意用埋雷夹具跑 hygiene 脚本并断言其大声失败,是该元测试的预期 stderr,不是真失败。

控制字符自扫(越过 gate 盲区,5 个改动文件):grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f]' 零命中。注:本仓没有 scripts/check-nul-bytes.mjs(那是 objectstack 仓的脚本),等价闸是 pnpm hygiene 的 scripts/check-source-hygiene.mjs,其扫描面已覆盖 content/ 与 .changeset/,上面已绿 —— 照实报,不冒充跑过不存在的脚本。


Generated by Claude Code

The locale pack ships crm_campaign as 营销活动 and fourteen zh-Hans pages
already used that word, but administration/sharing-and-security and
administration/profiles called it 市场活动. On the OWD table that put the
master and its detail on adjacent rows under different names:

  | 市场活动     | 公共只读             | ... |
  | 营销活动成员 | 由父级控制(市场活动) | ... |

Sweep the two administration pages (5 + 3 occurrences), the marketing card
on the docs home page, and ROW_LABEL['crm_campaign']['zh-Hans'] in
test/sharing-coverage.test.ts — the authored ledger the OWD guard joins the
table against, which has to move in the same commit or the guard reports a
missing row and a ghost row.

The locale packs, the English pages and the zh-Hant pages (already 行銷活動
throughout) are untouched.

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

vercel Bot commented Aug 5, 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 5, 2026 11:44pm

Request Review

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

Development

Successfully merging this pull request may close these issues.

zh-Hans 文档里 crm_campaign 有两个译名:administration 两页写「市场活动」,语言包与其余 14 个文件写「营销活动」

2 participants