diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b9d0354..f803b73 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -66,10 +66,10 @@ npm run check:browser-first ## Internationalization English is the source dictionary. Every key must exist in English, Simplified -Chinese, and Japanese with matching placeholders. +Chinese, Traditional Chinese, and Japanese with matching placeholders. 1. Add the English key to `src/i18n/locales/en.ts`. -2. Add translations to `zh-CN.ts` and `ja.ts`. +2. Add translations to `zh-CN.ts`, `zh-TW.ts`, and `ja.ts`. 3. Use `t("key")` in components; do not add user-facing hard-coded strings. 4. Run `npm run check:i18n`. @@ -107,7 +107,7 @@ npm run check:mcp:live For UI changes, verify: - desktop, tablet, and phone layouts; -- English, Simplified Chinese, and Japanese; +- English, Simplified Chinese, Traditional Chinese, and Japanese; - keyboard focus and Escape behavior for dialogs; - reduced-motion behavior; - the actual live app, not only static markup. diff --git a/README.md b/README.md index d749424..0de2e27 100644 --- a/README.md +++ b/README.md @@ -576,8 +576,8 @@ Codex should: For an explicitly unattended or headless job, say so. Only then should Codex use the one-call `create_deck` / `create` fast path. -A localized visual tutorial with copy-ready prompts in English, Simplified Chinese, and -Japanese is linked from the home page beneath the composer, and is also reachable directly +A localized visual tutorial with copy-ready prompts in English, Simplified Chinese, +Traditional Chinese, and Japanese is linked from the home page beneath the composer, and is also reachable directly once the local app is running: ```text @@ -676,7 +676,7 @@ Play mode, then export PPTX and PDF. - **Play mode** — full-screen, dual-window presentation with keyboard navigation and speaker notes. - **PDF and PPTX export** — export after visual review. -- **English, Simplified Chinese, and Japanese UI** with strict key parity. +- **English, Simplified Chinese, Traditional Chinese, and Japanese UI** with strict key parity. - **Portable Skill and typed MCP server** — the complete workflow remains available when one transport is unavailable. diff --git a/mcp/server.mjs b/mcp/server.mjs index 4a9416b..8ec11c0 100644 --- a/mcp/server.mjs +++ b/mcp/server.mjs @@ -528,7 +528,7 @@ register( inputSchema: { topic: z.string().min(1), scenarioId: z.string().optional().describe("Scenario id from list_scenarios."), - uiLocale: z.enum(["zh-CN", "en", "ja"]).optional(), + uiLocale: z.enum(["zh-CN", "zh-TW", "en", "ja"]).optional(), }, annotations: { readOnlyHint: true, openWorldHint: true }, }, @@ -702,7 +702,7 @@ register( kind: z.enum(["chat", "outline", "render"]), instruction: z.string().min(1).optional().describe("Required for chat and outline runs."), conversationId: z.string().optional(), - locale: z.enum(["zh-CN", "en", "ja"]).optional(), + locale: z.enum(["zh-CN", "zh-TW", "en", "ja"]).optional(), slideIndex: z.number().int().min(1).optional(), materialIds: z.array(z.string()).max(8).optional(), designFilePaths: z.array(z.string()).max(12).optional(), @@ -1196,7 +1196,7 @@ register( group: z.enum(["create", "transform", "data", "research", "optimize", "delivery"]).optional(), query: z.string().optional(), featured: z.boolean().optional(), - locale: z.enum(["zh-CN", "en", "ja"]).optional(), + locale: z.enum(["zh-CN", "zh-TW", "en", "ja"]).optional(), scenarioId: z.string().optional().describe("Preselect this scenario in the returned Browser link."), }, annotations: { readOnlyHint: true, openWorldHint: false }, diff --git a/src/components/GlobalSettings.tsx b/src/components/GlobalSettings.tsx index 3f83d0d..b656ce3 100644 --- a/src/components/GlobalSettings.tsx +++ b/src/components/GlobalSettings.tsx @@ -84,7 +84,7 @@ export default function GlobalSettings() { onClick={() => setLocale(value)} > - {value === "zh-CN" ? "文" : value === "ja" ? "日" : value.slice(0, 2).toUpperCase()} + {value === "zh-CN" ? "简" : value === "zh-TW" ? "繁" : value === "ja" ? "日" : value.slice(0, 2).toUpperCase()} {LOCALE_LABEL[value]} {locale === value &&