fix(i18n): unify the Chinese product term for crm_case to 工单 - #1525
Merged
Conversation
Maintainer ruling 2026-08-31: 「crm_case 统一叫工单。」 crm_case answered to five Chinese names at once — 服务案例 in the language pack (so, on screen), 工单/工單 on 29+27 doc pages, 案例 on 14+15, 案件 in sharing-coverage's zh-Hant ledger, and 个案 in whats-new.zh-Hans. Three guarded ledgers named one object three different ways and all stayed green, because each only compared its own page to its own ledger. - zh-CN pack: label, pluralLabel, description, case_number, nav_case and knowledge_article.related_to_case now all read 工单. en/es-ES/ja-JP are untouched — they carry Case/Caso/ケース, not a Chinese term. - 33 Chinese doc pages (15 zh-Hans, 18 zh-Hant) move to 工单/工單. - The four authored test ledgers that pinned an older spelling follow. - New guard: test/docs-object-term-consistency.test.ts derives the term from the pack and fails on any retired spelling in the pages, the pack or a test ledger. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019hUuCQStzXGMFSX4dzww5t
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019hUuCQStzXGMFSX4dzww5t
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
os-sales
marked this pull request as ready for review
September 3, 2026 07:59
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 #837
Maintainer ruling, 2026-08-31 (verbatim, kept untranslated): 「crm_case 统一叫工单。」
What changed
src/translations/zh-CN.ts— 6 places naming the object*.zh-Hans.mdxpages*.zh-Hant.mdxpagestest/docs-object-term-consistency.test.tsen,es-ESandja-JPare untouched — they carryCase/Caso/ケース.Two premises in the card did not survive measurement
1. "The four locale packs'
crm_caselabel (currently 服务案例) changes to 工单."Only one pack carries a Chinese term. Measured on
e8a3ae9:en.tsCase,es-ES.tsCaso,ja-JP.tsケース,zh-CN.ts服务案例. Rewriting three ofthem to 工单 would put a Chinese word on the English, Spanish and Japanese UI. The
maintainer's words are about the Chinese term, so the change lands in
zh-CN.tsalone — and there it covers all six places the pack named the object, not just
label:pluralLabel,description,case_number, thenav_casesidebar entry(which read 服务案例 while its neighbour
nav_my_casesalready read 我的工单),and
crm_knowledge_article.related_to_case(来源案例, whose ownhelptext on thesame line already said 工单).
2. "zh-Hant 同形."
It is not, in three separate ways. 工单 is Simplified-only — the Traditional form
is 工單, so a Simplified grep cannot see that surface at all. Re-derived per
script:
The two scripts disagree on which pages as well as how many:
profilesandsharing-and-securityare 工单 in Simplified and 案件 in Traditional, andwhats-newis 个案 in Simplified and 案例 in Traditional. Socrm_caseansweredto five Chinese names, not three. Re-derived change surface: 33 doc pages,
against the 14 the card scoped.
Every hit was read; one was rejected
92 Chinese occurrences across the two scripts, each read before it was changed.
All 92 were this object — 案例 never appears here as "case study". One hit was
rejected as unrelated:
src/translations/ja-JP.ts:566, wherecrm_opportunity's description reads 「パイプライン上の商談・案件」 — a Japaneseword, about a different object. That is why the scan surface is the two Chinese
doc scripts plus the zh-CN pack, and not the tree.
The guard, and the proof it can fail
Ruled part 3, landing in the same stroke. It derives the Simplified term from
objects.crm_case.labelin the zh-CN pack — through the same stack the appresolves it from, so it can never disagree with the product UI — and fails on a
retired spelling reaching a zh-Hans page, a zh-Hant page, the pack itself, or a
string literal in any ledger under
test/. That last surface is the point:three guarded ledgers named this object three different ways and all stayed
green, because each compared only its own page to its own ledger.
Traditional is authored, not derived, with the reason stated in the file: the app
ships no Traditional locale (the console falls back to Simplified), so there is
no field to read it from.
Observed failing, five ablations, each mutation confirmed on disk before the
run and each restore confirmed against
HEADafter it (git diff HEADempty andthe guard's blob hash equal to its
HEADblob):content+src+testate8a3ae9)zh-CN.tsonlysharing-coverage.test.tsonlyautomation.zh-Hans.mdxonlyonly 0 zh-Hans page(s) name crm_case as 工单Leg E's first attempt was a no-op — a
perlsubstitution that matchednothing and exited 0, leaving the tree unmutated and the guard green. Recorded
rather than quietly re-run: read without checking that the mutation landed, that
green would have said "the vacuity rule cannot fail". The rerun replaced 557
occurrences across 39 files before the guard was asked anything.
Legs B and E also show the guard is not a one-way absence check: it fails if the
pack is renamed to a retired word, and it fails if the word is deleted instead
of unified.
Verification
pnpm verifygreen on the final commitca48e6f—objectstack validate,tsc --noEmit,objectstack lint, the i18n gate (0 i18n/missing-*), sourcehygiene, the token ratchet,
objectstack build, andvitest run(157 files, 3297 passed, 1 skipped). The token ratchet is unmoved by design:
src/translations/is outside its measured surface by ruling, and the new guardlives in
test/.The 49 pre-existing
objectstack lintwarnings are unchanged — this PR editslabel values, never keys.
Refs #827, #810.
🤖 Generated with Claude Code
https://claude.ai/code/session_019hUuCQStzXGMFSX4dzww5t
Generated by Claude Code