Phase:M02 — Traditional Chinese / English Localization
類型:M Phase(Modification / Maintenance Phase)
插入時點:M01-C — SCAG / GoS Background Expansion closeout 後,暫停 M01;M02 closeout 後回到 M01-D。
本文件定義 M02-A~M02-H 的自動化與人工驗收流程。完成條件以實作規格.md為準,具體接線、localizable field policy 與 translation authoring pipeline 以開發設計方針.md為準。
狀態:M02 已 closeout(2026-08-31)。M02-A~M02-H 全部完成,下一步為 M01-D。 Closeout evidence:
M02-C_CLOSEOUT.md、M02-D_CLOSEOUT.md、M02-E_CLOSEOUT.md、M02-F_CLOSEOUT.md、M02-G_CLOSEOUT.md、M02-H_CLOSEOUT.md。
最後更新:2026-08-31
M02 的測試不能只驗「畫面上有中文」;必須同時驗:
srd5.1 / phb2014 / scag / gos 的 policy-required fields 具有完整雙語 coverage。所有 Subphase 完成時都必須保持既有 backend pytest、frontend build / Vitest、Playwright 與 relevant regression 綠燈。
正式測試 locale:
zh-TW
en
切換 locale 前後至少比較:
至少涵蓋目前可達 surface 的:
測試 fixture 必須能同時包含:
required field。not user-visible yet field。用來證明 completeness checker 是按 field policy,而不是「entry/category 有字串就全部要求翻譯」。
三份 M02 文件固定:
M02-A — Locale Foundation & Runtime Switch
M02-B — Full UI Copy Localization
M02-C — Localized Content Model & Terminology Contract
M02-D — SRD 5.1 Names & Structured Text
M02-E — SRD 5.1 User-Visible Descriptions
M02-F — PHB / SCAG / GoS Localization
M02-G — Localized Search, Errors & Completeness Gates
M02-H — Full M02 Integration & Closeout
驗證:
zh-TW。en 時初始化為 en。html lang 同步。在有既存 Builder Draft 的頁面:
zh-TW → en → zh-TW。必須:
可用 frontend request spy 或 real backend request log 驗證。
在 Character Builder 中保留可觀察 local UI state,切換 locale。
必須:
建立可維護的 UI copy inventory 或等價檢查,至少涵蓋:
不要再寫「steps 01~06 / 01~07」作驗收依據;step 名稱才是較穩定的 surface identity。
每個 surface 在 zh-TW / en 都有對應 copy。
對 frontend source 做 targeted lint / test / review,避免新增明顯 user-visible hardcoded English / Chinese literal。
不是要求禁止任何 string literal;測試只針對 presentation surface,避免誤傷 enum、code、StableKey、test fixture。
兩種 locale 都驗:
語言切換後 accessible name 同步更新。
在純繁中與純英文模式巡覽主要頁面,記錄任何可避免的 system UI 混語;Blocker / Major 必須在 B closeout 前清掉。
使用同一 content entry,例如:
srd5.1:spell:fireball
分別 resolve zh-TW / en。
驗證:
至少用數種不同 kind 測試:
每種 required field 都能正確取得兩語 presentation。
建立 machine-verifiable localizable field policy tests,至少驗證:
至少加入現況型案例:
magic item name = required(目前 Inventory selector 可見)
magic item long description = 若目前無 surface,not required yet
實際斷言仍以 M02-C 定稿 policy 為準,不把測試範例硬編成永久 category 規則。
故意建立缺一個 required locale / field 的 fixture:
另建立缺少 not-required field 的 fixture,確認不會誤判為 blocker。
Builder / Character rules presentation path 中,驗證 rules item 有足夠 StableKey / structured identity 支援 locale switch。
禁止只有 raw English label 而無法追溯 identity 的 user-visible rules entity 成為新 contract。
測試 system-provided suggestion:
另測 user manually typed roleplay text:切 locale 後原文不變。
建立 glossary consistency fixture / review checklist:
docs/暫用規則資訊/ 本次用到的既有繁中名稱。對 srd5.1 執行:
all entries
× M02-C required name / label / structured fields
× zh-TW / en
任何 required field 缺 locale 即 fail。
不得另外維護「所有 categories 都必翻全部欄位」的手工清單。
至少抽查目前實際可見的:
切 locale 後 option display 全部更新,selected persisted value 仍是同一 StableKey。
建立含多種 SRD refs 的 Character,驗目前 Sheet 可見的:
兩語 render 正確;只有 policy-required field 才納入完整性 blocker。
比較兩語下 Review / Confirm candidate:
每個翻譯 batch 保存:
允許 category 分批 commit,但 D 所有 required scope 未完成前不得 closeout。
只對 M02-C policy 標為 currently user-visible / required 的 SRD long-form fields 執行 coverage scan。
缺任一 supported locale 即 fail。
canonical dataset 中目前無 product surface 的 long text 不納入 M02-E completeness。
能可靠抽取時,比較 canonical English 與 zh-TW translation 中的:
不得因翻譯遺失或改變 mechanics-sensitive token。
自動檢查不能取代人工語意 review。
每個 long-form category / batch 至少人工抽審:
max(10 entries, 10% of batch)
batch <= 10 時全審。
抽審優先涵蓋實際在 policy 中 required 且 rules-sensitive 的:
若 policy 當下沒有 magic item long description surface,就不因 items category 存在而硬抽 magic item description。
發現系統性錯譯時要擴大 review,同類 batch 不可只修抽中的幾筆。
若 required description 有 list / paragraph 結構,兩種 locale 都需:
同 D.5;E 所有 required scope 未完成前不得 closeout。
對:
phb2014
scag
gos
執行 localizable field policy × supported locales completeness。
不是要求每個 canonical string 都翻,而是所有目前 user-visible required field 全綠。
針對本次會出現在 runtime 的 PHB / SCAG / GoS zh-TW names / terminology:
docs/暫用規則資訊/。至少一條完整 E2E:
PHB race/subrace or Variant Human
+ PHB background
+ SRD class
在 Builder 中:
至少一個 reuse PHB roleplay suggestion table 的 SCAG Background:
至少一個帶 optional flavor table / suggestion 的 GoS Background:
同名或近似名稱跨來源同時存在時:
每批保存 translation / review / lint evidence;F 完整 policy scope 未完成前不得 closeout。
繁中模式:
English mode 反向驗證。
準備名稱排序會與 StableKey/index 順序不同的 fixture,驗證:
zh-TW 依繁中 display presentation 排序。en 依英文 display presentation 排序。觸發至少:
驗證:
CI 自動掃描:
supported locales
× enabled packs
× M02-C required localizable fields
M02 closeout packs:
srd5.1
phb2014
scag
gos
任何 required field 缺:
pack
StableKey
field
locale
即失敗並輸出可定位資訊。
至少測:
建立 fixture:
zh-TW 後才通過。這證明 M02 closeout 後「首次 expose 舊 content」也不會無聲加入單語 UI。
至少包含:
至少完成兩條:
zh-TW
→ Create Draft
→ Origin
→ Abilities
→ Class
→ Spellcasting(若 caster)
→ Equipment
→ Review
→ Confirm
→ Character Sheet
→ switch en
→ verify same Character / Build / State, English presentation
→ reload
反向完成一條 create flow,再切 zh-TW 驗證。
建立有多個 selection 的 Draft:
連續切:
zh-TW → en → zh-TW → en
驗證:
在 Character Sheet 先建立可觀察 live state:
切換 locale 多次並 reload,所有 live state 不變。
人工逐頁巡覽:
分別以 zh-TW / en 進行。
Blocker:
Major:
Blocker / Major 必須在 M02 closeout 前清零。
最終 gate 必須證明:
M02-C localizable field policy valid ✓
srd5.1 required fields zh-TW ✓ en ✓
phb2014 required fields zh-TW ✓ en ✓
scag required fields zh-TW ✓ en ✓
gos required fields zh-TW ✓ en ✓
UI copy zh-TW ✓ en ✓
errors zh-TW ✓ en ✓
並證明 not-yet-user-visible fields 不會被錯誤納入當期 blocker。
M02 closeout 後,才可 resume:
M01-D — VGM Race Expansion
從 M01-D 起,每個新增/修改/首次 expose user-visible system / rules content 的測試都必須同時驗 zh-TW / en coverage;缺任一 locale 視為該 Subphase regression failure。
M02 closeout 測試/人工 checklist 必須確認:
AGENTS.md:目前階段已切回 M01-D,且永久 supported-locale engineering rule 已加入。PROJECT_BRIEF.md:M02-A~H 全部 ✅,下一個 coding step = M01-D。規格企劃.md:產品層語言行為與實際 M02 一致;若原本無對應產品規格則補入,不寫 implementation detail。data/srd5.1/NOTICE.md:已標示本專案提供 SRD 5.1 實際翻譯之 user-visible presentation text 的繁中 translation / adaptation,並明確說明已修改;不得誇大成整份 SRD 全譯。彙整 M02-D / E / F batch evidence,至少能回答:
Required missing translation 不得列成 accepted exception。