adventure-table

M02 — 測試指南

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.mdM02-D_CLOSEOUT.mdM02-E_CLOSEOUT.mdM02-F_CLOSEOUT.mdM02-G_CLOSEOUT.mdM02-H_CLOSEOUT.md

最後更新:2026-08-31


1. 測試總則

M02 的測試不能只驗「畫面上有中文」;必須同時驗:

  1. 語言切換 runtime 行為正確。
  2. locale 不污染 Draft / Character / Current State。
  3. UI copy 與目前 user-visible rules content 都能完整切換。
  4. StableKey / persisted identity 不因語言改變。
  5. user-authored text 不被翻譯。
  6. search / sort / error presentation 使用目前 locale。
  7. localizable field policy 能明確決定 required translation scope。
  8. 缺 required translation 會被自動化 gate 擋住。
  9. M02 closeout 時 srd5.1 / phb2014 / scag / gos 的 policy-required fields 具有完整雙語 coverage。
  10. 尚未 user-visible 的 field 不會因 category 存在被誤列為 M02 blocker;未來首次 expose 時有 regression guard 承接。

所有 Subphase 完成時都必須保持既有 backend pytest、frontend build / Vitest、Playwright 與 relevant regression 綠燈。


2. 共通測試資料與觀察值

2.1 Locale

正式測試 locale:

zh-TW
en

2.2 必須觀察的不變 identity

切換 locale 前後至少比較:

2.3 必須觀察的 presentation

至少涵蓋目前可達 surface 的:

2.4 Policy-driven fixture

測試 fixture 必須能同時包含:

用來證明 completeness checker 是按 field policy,而不是「entry/category 有字串就全部要求翻譯」。


3. M02 Subphase 順序

三份 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

M02-A — Locale Foundation & Runtime Switch

A.1 Unit / component tests

驗證:

A.2 No mutation test

在有既存 Builder Draft 的頁面:

  1. 讀取 Draft revision。
  2. 切換 zh-TW → en → zh-TW
  3. 再次讀取 Draft。

必須:

可用 frontend request spy 或 real backend request log 驗證。

A.3 Browser persistence E2E

  1. 開啟網站,切 English。
  2. reload。
  3. 仍為 English。
  4. 離開頁面再重新開啟。
  5. 仍為 English。
  6. 切回繁中,reload。
  7. 仍為繁中。

A.4 No reload E2E

在 Character Builder 中保留可觀察 local UI state,切換 locale。

必須:


M02-B — Full UI Copy Localization

B.1 Static UI coverage

建立可維護的 UI copy inventory 或等價檢查,至少涵蓋:

不要再寫「steps 01~06 / 01~07」作驗收依據;step 名稱才是較穩定的 surface identity。

每個 surface 在 zh-TW / en 都有對應 copy。

B.2 Hardcoded visible text regression

對 frontend source 做 targeted lint / test / review,避免新增明顯 user-visible hardcoded English / Chinese literal。

不是要求禁止任何 string literal;測試只針對 presentation surface,避免誤傷 enum、code、StableKey、test fixture。

B.3 Accessibility

兩種 locale 都驗:

語言切換後 accessible name 同步更新。

B.4 Mixed-language smoke

在純繁中與純英文模式巡覽主要頁面,記錄任何可避免的 system UI 混語;Blocker / Major 必須在 B closeout 前清掉。


M02-C — Localized Content Model & Terminology Contract

C.1 StableKey invariant

使用同一 content entry,例如:

srd5.1:spell:fireball

分別 resolve zh-TW / en

驗證:

C.2 Resolver fixture

至少用數種不同 kind 測試:

每種 required field 都能正確取得兩語 presentation。

C.3 Field policy tests

建立 machine-verifiable localizable field policy tests,至少驗證:

至少加入現況型案例:

magic item name = required(目前 Inventory selector 可見)
magic item long description = 若目前無 surface,not required yet

實際斷言仍以 M02-C 定稿 policy 為準,不把測試範例硬編成永久 category 規則。

C.4 Missing translation behavior

故意建立缺一個 required locale / field 的 fixture:

另建立缺少 not-required field 的 fixture,確認不會誤判為 blocker。

C.5 DTO identity test

Builder / Character rules presentation path 中,驗證 rules item 有足夠 StableKey / structured identity 支援 locale switch。

禁止只有 raw English label 而無法追溯 identity 的 user-visible rules entity 成為新 contract。

C.6 Roleplay suggestion identity

測試 system-provided suggestion:

  1. 同一 suggestion 在 English 顯示英文。
  2. 切繁中後顯示繁中。
  3. persisted selection / identity 不因 locale 改變。

另測 user manually typed roleplay text:切 locale 後原文不變。

C.7 Glossary review gate

建立 glossary consistency fixture / review checklist:


M02-D — SRD 5.1 Names & Structured Text

D.1 Policy-driven dataset coverage

srd5.1 執行:

all entries
× M02-C required name / label / structured fields
× zh-TW / en

任何 required field 缺 locale 即 fail。

不得另外維護「所有 categories 都必翻全部欄位」的手工清單。

D.2 Current-surface representative coverage

至少抽查目前實際可見的:

切 locale 後 option display 全部更新,selected persisted value 仍是同一 StableKey。

D.3 Character Sheet presentation

建立含多種 SRD refs 的 Character,驗目前 Sheet 可見的:

兩語 render 正確;只有 policy-required field 才納入完整性 blocker。

D.4 No identity drift

比較兩語下 Review / Confirm candidate:

D.5 Batch evidence

每個翻譯 batch 保存:

允許 category 分批 commit,但 D 所有 required scope 未完成前不得 closeout。


M02-E — SRD 5.1 User-Visible Descriptions

E.1 Long-text completeness

只對 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。

E.2 Rules fidelity automated checks

能可靠抽取時,比較 canonical English 與 zh-TW translation 中的:

不得因翻譯遺失或改變 mechanics-sensitive token。

自動檢查不能取代人工語意 review。

E.3 Human spot 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 不可只修抽中的幾筆。

E.4 Structured rendering

若 required description 有 list / paragraph 結構,兩種 locale 都需:

E.5 Batch evidence

同 D.5;E 所有 required scope 未完成前不得 closeout。


M02-F — PHB / SCAG / GoS Localization

F.1 Pack + policy completeness

對:

phb2014
scag
gos

執行 localizable field policy × supported locales completeness。

不是要求每個 canonical string 都翻,而是所有目前 user-visible required field 全綠。

F.2 Existing reference comparison

針對本次會出現在 runtime 的 PHB / SCAG / GoS zh-TW names / terminology:

F.3 PHB flow

至少一條完整 E2E:

PHB race/subrace or Variant Human
+ PHB background
+ SRD class

在 Builder 中:

F.4 SCAG background flow

至少一個 reuse PHB roleplay suggestion table 的 SCAG Background:

F.5 GoS flavor flow

至少一個帶 optional flavor table / suggestion 的 GoS Background:

F.6 Variant / source collision

同名或近似名稱跨來源同時存在時:

F.7 Batch evidence

每批保存 translation / review / lint evidence;F 完整 policy scope 未完成前不得 closeout。


M02-G — Localized Search, Errors & Completeness Gates

繁中模式:

English mode 反向驗證。

G.2 Locale-aware sort

準備名稱排序會與 StableKey/index 順序不同的 fixture,驗證:

G.3 Validation errors

觸發至少:

驗證:

G.4 Completeness CI

CI 自動掃描:

supported locales
× enabled packs
× M02-C required localizable fields

M02 closeout packs:

srd5.1
phb2014
scag
gos

任何 required field 缺:

pack
StableKey
field
locale

即失敗並輸出可定位資訊。

G.5 Orphan / duplicate checks

至少測:

G.6 Future visibility guard

建立 fixture:

  1. 某 canonical field 初始 policy = not user-visible,只有 English,不阻擋。
  2. 模擬新 product surface 將該 field 改成 required。
  3. 只有 English 時 completeness 必須 fail。
  4. zh-TW 後才通過。

這證明 M02 closeout 後「首次 expose 舊 content」也不會無聲加入單語 UI。


M02-H — Full M02 Integration & Closeout

H.1 Full regression

至少包含:

H.2 Full bilingual Create Character E2E

至少完成兩條:

Flow 1 — 繁中開始

zh-TW
→ Create Draft
→ Origin
→ Abilities
→ Class
→ Spellcasting(若 caster)
→ Equipment
→ Review
→ Confirm
→ Character Sheet
→ switch en
→ verify same Character / Build / State, English presentation
→ reload

Flow 2 — English 開始

反向完成一條 create flow,再切 zh-TW 驗證。

H.3 Draft safety stress

建立有多個 selection 的 Draft:

連續切:

zh-TW → en → zh-TW → en

驗證:

H.4 Character State safety

在 Character Sheet 先建立可觀察 live state:

切換 locale 多次並 reload,所有 live state 不變。

H.5 Pure-language human browser gate

人工逐頁巡覽:

分別以 zh-TW / en 進行。

Blocker:

Major:

Blocker / Major 必須在 M02 closeout 前清零。

H.6 Completeness final gate

最終 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。

H.7 Resume gate

M02 closeout 後,才可 resume:

M01-D — VGM Race Expansion

從 M01-D 起,每個新增/修改/首次 expose user-visible system / rules content 的測試都必須同時驗 zh-TW / en coverage;缺任一 locale 視為該 Subphase regression failure。

H.8 Documentation closeout

M02 closeout 測試/人工 checklist 必須確認:

H.9 Translation evidence closeout

彙整 M02-D / E / F batch evidence,至少能回答:

Required missing translation 不得列成 accepted exception。