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 && }
diff --git a/src/i18n/locales/zh-TW.ts b/src/i18n/locales/zh-TW.ts
new file mode 100644
index 0000000..9365dfa
--- /dev/null
+++ b/src/i18n/locales/zh-TW.ts
@@ -0,0 +1,982 @@
+import { en, type Dict } from "./en";
+
+export const zhTW: Dict = {
+ ...en,
+ "settings.open": "開啟設定",
+ "settings.title": "設定",
+ "settings.language": "介面語言",
+ "settings.languageHelp": "應用於 Codex Slides 的所有介面文案",
+ "settings.zh": "中文",
+ "settings.en": "English",
+ "settings.ja": "日本語",
+ "settings.close": "關閉設定",
+ "settings.codex": "Codex 連接",
+ "settings.codexHelp": "識別本地 Codex,或在桌面端使用",
+ "codexSetup.title": "連接 Codex",
+ "codexSetup.subtitle": "由 Codex 撰寫文案並繪製每一頁投影片 —— 零配置。",
+ "codexSetup.close": "關閉",
+ "codexSetup.detecting": "正在識別本地 Codex…",
+ "codexSetup.redetect": "重新識別",
+ "codexSetup.readyTitle": "本地 Codex 已就緒",
+ "codexSetup.readyBody": "已偵測到你的 ChatGPT 登入,可以直接開始生成。",
+ "codexSetup.notReadyTitle": "尚未發現本地 Codex",
+ "codexSetup.notReadyBody": "在本機登入,或在 Codex 桌面端 App 中使用 Codex Slides。",
+ "codexSetup.tokenLabel": "ChatGPT 登入",
+ "codexSetup.tokenReady": "已登入",
+ "codexSetup.tokenMissing": "未登入",
+ "codexSetup.cliLabel": "Codex CLI",
+ "codexSetup.cliReady": "已在 PATH 中",
+ "codexSetup.cliMissing": "不在 PATH 中",
+ "codexSetup.optionLocalTitle": "使用本地 Codex",
+ "codexSetup.optionLocalBody": "用 Codex CLI 登入一次,即可在此生成。",
+ "codexSetup.optionLocalCta": "使用此 Codex",
+ "codexSetup.optionLocalStep": "在終端執行以下命令,然後重新識別:",
+ "codexSetup.optionDesktopTitle": "使用 Codex 桌面端",
+ "codexSetup.optionDesktopBody": "在 Codex 桌面端 App 中開啟 Codex Slides —— 自帶 Agent。",
+ "codexSetup.optionDesktopHere": "你正在 Codex 桌面端 App 中 —— 內置 Agent 已就緒。",
+ "codexSetup.optionDesktopBadge": "執行於桌面端",
+ "codexSetup.capabilitiesTitle": "Codex 在這裡提供的核心能力",
+ "codexSetup.capAgent": "Agent 編排",
+ "codexSetup.capAgentBody": "規劃大綱並撰寫每一頁文案。",
+ "codexSetup.capImage": "生圖",
+ "codexSetup.capImageBody": "將每一頁繪製為圖像 —— 每頁一次呼叫。",
+ "codexSetup.capResearch": "深度研究",
+ "codexSetup.capResearchBody": "抓取實時來源,讓內容有據可依。",
+ "codexSetup.capExport": "編輯與匯出",
+ "codexSetup.capExportBody": "用 Mark 精修,再匯出 PPTX 與 PDF。",
+ "codexSetup.skip": "暫時跳過",
+ "codexSetup.copy": "複製",
+ "codexSetup.copied": "已複製",
+ "codexSetup.openEntry": "Codex 設定",
+ "topbar.backProjects": "返回專案",
+ "topbar.moreActions": "更多",
+ "topbar.moreActionsHelp": "更多專案操作",
+ "home.badge": "✧ 零配置",
+ "home.tagline": "本地 Codex 負責撰寫文案並繪製投影片",
+ "home.title": "今天想做什麼簡報?",
+ "scenario.quickLabel": "選擇一個簡報場景開始",
+ "scenario.all": "全部場景",
+ "scenario.dialogTitle": "從一個場景開始",
+ "scenario.dialogSubtitle": "{{count}} 種簡報工作流,已配好任務上下文與推薦材料。",
+ "scenario.close": "關閉場景庫",
+ "scenario.search": "搜尋匯報、資料、研究、美化……",
+ "scenario.clearSearch": "清空搜尋",
+ "scenario.groupLabel": "場景分類",
+ "scenario.allGroup": "全部場景",
+ "scenario.resultCount": "{{count}} 個工作流",
+ "scenario.output": "產出",
+ "scenario.noResults": "沒有匹配的場景",
+ "scenario.noResultsHelp": "換一個任務、材料類型或產出試試。",
+ "scenario.context": "場景",
+ "scenario.expectedOutput": "預設產出",
+ "scenario.suggestedMaterial": "建議補充上下文",
+ "scenario.required": "必需",
+ "scenario.optional": "可選",
+ "scenario.added": "已新增",
+ "scenario.addMaterial": "新增{{name}}",
+ "scenario.missingMaterial": "請先補齊必需的上下文材料。",
+ "composer.placeholder": "描述你想製作的簡報",
+ "composer.addOptions": "新增材料或選項",
+ "composer.addFiles": "新增圖片或檔案",
+ "composer.dropFiles": "拖入檔案以新增上下文",
+ "composer.dropFilesHelp": "發送後會儲存到 Design Files",
+ "composer.dropIntoSlot": "拖入這個上下文槽位",
+ "composer.dropIntoSlotHelp": "Agent 會按這個角色使用檔案",
+ "composer.research": "深度研究",
+ "composer.fast": "快速模式",
+ "composer.fastValue": "並行生成",
+ "composer.fastOn": "所有頁面並行生成,超出的自動排隊",
+ "composer.fastOff": "並行生成所有頁面,更快看到初稿",
+ "composer.fastHelp": "同時繪製多個頁面,而不是逐頁生成",
+ "composer.outputType": "輸出類型",
+ "composer.slides": "投影片",
+ "composer.engine": "編排引擎",
+ "composer.unavailable": "不可用",
+ "composer.quality": "畫質",
+ "composer.aspect": "畫面比例",
+ "composer.auto": "自動",
+ "composer.high": "高",
+ "composer.medium": "中",
+ "composer.low": "低",
+ "composer.qualityTip.auto": "預設使用 2K,適合大多數簡報,兼顧清晰度與速度",
+ "composer.qualityTip.high": "4K,適合大屏展示、高清匯出和精細畫面,生成較慢",
+ "composer.qualityTip.medium": "2K,適合日常簡報,清晰度與生成速度均衡",
+ "composer.qualityTip.low": "1K,適合快速草稿和預覽,生成最快",
+ "composer.aspectTip.auto": "預設採用 16:9,適合絕大多數通用簡報場景",
+ "composer.aspectTip.16x9": "適合現代顯示器、電視和投影儀的寬螢幕簡報",
+ "composer.aspectTip.9x16": "適合手機、Stories 和短影片的直式內容",
+ "composer.aspectTip.4x3": "適合傳統投影儀、教室螢幕和舊版簡報",
+ "composer.aspectTip.3x4": "適合豎版報告、海報和文件式簡報",
+ "composer.aspectTip.1x1": "適合社群媒體方圖、卡片和跨平台視覺",
+ "composer.voiceSoon": "語音輸入(即將支援)",
+ "composer.generateHint": "生成(回車發送 · Shift+回車換行)",
+ "composer.design": "設計",
+ "community.title": "✦ 社區靈感",
+ "community.subtitle": "從成熟方向或社區風格開始",
+ "community.all": "全部",
+ "community.forYou": "為你推薦",
+ "community.group.businessReport": "商業與報告",
+ "community.group.infographic": "訊息圖",
+ "community.group.diagram": "圖解",
+ "community.group.dataMap": "資料與地圖",
+ "community.group.uiDashboard": "UI 與儀表板",
+ "community.group.posterAd": "海報與廣告",
+ "community.group.product": "產品",
+ "community.group.brandIdentity": "品牌與視覺識別",
+ "community.group.architectureSpace": "建築與空間",
+ "community.group.photoCinematic": "攝影與電影感",
+ "community.group.editorial": "編輯設計",
+ "community.group.illustration": "插畫",
+ "community.browseCount": "瀏覽全部 {{count}} 個",
+ "community.filter": "按風格分組篩選",
+ "community.scrollLeft": "向左捲動",
+ "community.scrollRight": "向右捲動",
+ "projects.title": "專案",
+ "projects.subtitle": "繼續上次的創作",
+ "projects.countOne": "{{count}} 個專案",
+ "projects.countMany": "{{count}} 個專案",
+ "projects.loading": "正在載入專案",
+ "projects.open": "開啟 {{title}}",
+ "projects.noPreview": "暫無預覽",
+ "projects.slides": "{{rendered}}/{{total}} 頁",
+ "projects.stageClarify": "需求確認中",
+ "projects.stageResearch": "正在深度調研",
+ "projects.stageOutlining": "正在生成大綱",
+ "projects.stageOutline": "大綱待繼續",
+ "projects.stageInspire": "待選擇視覺方向",
+ "projects.stageRendering": "{{rendered}}/{{total}} 頁 · 生成已暫停",
+ "projects.emptyTitle": "你的專案會顯示在這裡",
+ "projects.emptyBody": "在上方描述一個簡報主題,建立第一個專案。",
+ "projects.noSearchResults": "沒有匹配的專案。",
+ "library.title": "專案庫",
+ "library.searchProjects": "搜尋專案",
+ "library.clearSearch": "清空搜尋",
+ "projectTemplates.title": "範本",
+ "projectTemplates.context": "專案範本",
+ "projectTemplates.search": "搜尋範本",
+ "projectTemplates.none": "不使用範本",
+ "projectTemplates.noneHelp": "按目前需求與已選視覺風格開始",
+ "projectTemplates.pickerTitle": "專案範本",
+ "projectTemplates.pickerHelp": "複用已儲存專案的品牌、風格與視覺參考",
+ "projectTemplates.emptyPicker": "還沒有儲存過專案範本。",
+ "projectTemplates.emptyTitle": "把專案儲存為範本",
+ "projectTemplates.emptyBody": "開啟任意專案並選擇“儲存為範本”,其品牌體系、風格和視覺參考會出現在這裡。",
+ "projectTemplates.noMatch": "沒有匹配的範本。",
+ "projectTemplates.references": "{{count}} 張視覺參考",
+ "projectTemplates.fromProject": "來自 {{name}}",
+ "projectTemplates.selected": "已選擇",
+ "projectTemplates.use": "使用範本",
+ "projectTemplates.inUse": "使用中",
+ "projectTemplates.deleteNamed": "刪除 {{name}}",
+ "projectTemplates.deleteConfirm": "刪除範本“{{name}}”?已經使用它建立的專案不會受影響。",
+ "projectTemplates.deleteFailed": "範本刪除失敗。",
+ "projectTemplates.saveButton": "儲存為範本",
+ "projectTemplates.saveHelp": "把目前專案的品牌、風格與視覺參考儲存為可複用範本",
+ "projectTemplates.saveTitle": "把專案儲存為範本",
+ "projectTemplates.saveSubtitle": "之後可直接在首頁輸入框中選擇並複用。",
+ "projectTemplates.name": "範本名稱",
+ "projectTemplates.description": "使用說明",
+ "projectTemplates.descriptionPlaceholder": "這個視覺體系適合在什麼場景使用?",
+ "projectTemplates.savedContents": "會儲存品牌設計體系、基礎風格、畫面比例、品牌資產,以及最多 6 張已生成頁面作為視覺參考;不會複製原專案內容。",
+ "projectTemplates.save": "儲存範本",
+ "projectTemplates.saved": "範本已儲存",
+ "projectTemplates.saveFailed": "範本儲存失敗。",
+ "time.justNow": "剛剛",
+ "time.minutesAgo": "{{count}} 分鐘前",
+ "time.hoursAgo": "{{count}} 小時前",
+ "time.daysAgo": "{{count}} 天前",
+ "onboard.title": "✦ 快速確認幾個問題",
+ "onboard.customInput": "自定義輸入…",
+ "onboard.referenceImage": "參考圖",
+ "onboard.referenceImageHelp": "新增參考圖(用於生成)",
+ "onboard.uploading": "上傳中…",
+ "onboard.removeImage": "移除 {{name}}",
+ "onboard.imageCount": "📎 {{count}} 張參考圖",
+ "onboard.skip": "跳過",
+ "onboard.apply": "應用並生成簡報",
+ "onboard.confirmOutline": "確認,開始寫大綱 →",
+ "onboard.stageTitle": "先確認幾個問題",
+ "onboard.step": "第 1 步 · 明確需求",
+ "onboard.preparing": "正在根據你的主題準備問題…",
+ "chat.deckAgent": "簡報助手",
+ "chat.working": "處理中",
+ "chat.backgroundRunning": "後台執行",
+ "chat.backgroundStopping": "正在終止",
+ "chat.stopBackgroundRun": "終止後台任務",
+ "chat.expand": "展開對話面板",
+ "chat.collapse": "收起對話面板",
+ "chat.expandTitle": "展開對話",
+ "chat.collapseTitle": "收起對話",
+ "chat.queued": "已排隊",
+ "chat.queuedHelp": "已排隊,將在目前任務結束後執行",
+ "chat.queuePlaceholder": "繼續輸入要求;目前任務結束後會自動執行…",
+ "chat.queueRegion": "待執行佇列",
+ "chat.queueCount": "{{count}} 條已排隊",
+ "chat.queueToSend": "待發送",
+ "chat.queueReorder": "拖動調整順序",
+ "chat.queueEdit": "編輯排隊內容",
+ "chat.queuePrioritize": "下一條優先執行",
+ "chat.queueDelete": "刪除排隊內容",
+ "chat.queueEditing": "正在編輯排隊內容",
+ "chat.queueCancelEdit": "取消",
+ "chat.queueSaveEdit": "儲存排隊內容",
+ "chat.queueEditingPlaceholder": "可修改文字、圖片、檔案或頁面上下文,完成後儲存…",
+ "chat.queueImages": "{{count}} 張圖片",
+ "chat.queueFiles": "{{count}} 個檔案",
+ "chat.queueDesignFiles": "{{count}} 個 Design File",
+ "chat.queueSlide": "第 {{index}} 頁",
+ "chat.queueAttachmentOnly": "僅附件請求",
+ "chat.queueMore": "+{{count}} 條更多內容",
+ "chat.slidePlaceholder": "詢問第 {{index}} 頁,例如“在這頁後補一頁”",
+ "chat.defaultPlaceholder": "告訴簡報助手要新增、改寫、換風格或優化什麼…",
+ "chat.addFiles": "新增圖片或檔案",
+ "chat.queue": "加入佇列",
+ "chat.send": "發送",
+ "chat.scrollToBottom": "回到最新消息",
+ "chat.removeSlideContext": "移除第 {{index}} 頁上下文",
+ "chat.useAttachments": "請使用這些附件作為簡報的上下文。",
+ "chat.useDesignFiles": "請使用引用的 Design Files 作為簡報上下文。",
+ "chat.mentionDesignFile": "引用 Design File",
+ "chat.mentionPicker": "使用 @ 新增上下文",
+ "chat.contextSources": "上下文來源",
+ "chat.allContext": "全部",
+ "chat.designFilesSection": "Design Files",
+ "chat.filteredFileCount": "匹配 {{count}} 個",
+ "chat.contextSelected": "已選擇",
+ "chat.noMatchingDesignFiles": "沒有匹配的 Design Files",
+ "chat.mentionPickerHelp": "輸入篩選 · ↑↓ 選擇 · Enter 引用 · Esc 關閉",
+ "chat.referencedDesignFiles": "已引用的 Design Files",
+ "chat.openReferencedFile": "在 Design Files 中開啟 {{name}}",
+ "chat.removeReferencedFile": "從本輪移除 {{name}}",
+ "chat.openFile": "開啟檔案",
+ "chat.slide": "第 {{index}} 頁",
+ "chat.previewSlide": "預覽第 {{index}} 頁",
+ "chat.goToSlide": "定位到第 {{index}} 頁",
+ "chat.toolCalls": "工具呼叫",
+ "chat.stateWorking": "處理中",
+ "chat.stateDone": "完成",
+ "chat.stateStopped": "已停止",
+ "chat.toolRunning": "執行中",
+ "chat.toolDone": "完成",
+ "chat.toolFailed": "失敗",
+ "chat.toolWaiting": "等待中",
+ "chat.inspiration": "視覺參考靈感",
+ "chat.inspirationChosen": "已選:{{name}}",
+ "chat.customStyle": "自定義風格",
+ "chat.inspirationSkipped": "已跳過 · 使用預設風格",
+ "chat.inspirationMatches": "{{count}} 個風格 · 匹配「{{query}}」",
+ "chat.browse": "瀏覽",
+ "chat.skip": "跳過",
+ "chat.answerDone": "已完成",
+ "chat.tasks": "任務",
+ "chat.tasksProgress": "已完成 {{done}} / {{total}}",
+ "chat.estimatedCost": "服務商未返回費用,按可見回答估算",
+ "chat.reportedCost": "服務商返回的生成費用",
+ "chat.costEstimate": "{{cost}}",
+ "chat.estimatedTokens": "由於服務商未返回用量,按可見回答估算",
+ "chat.reportedTokens": "服務商返回的輸出 token",
+ "chat.outputTokens": "{{count}} 輸出 token",
+ "chat.totalTokens": "{{count}} 總 token",
+ "chat.reportedTotalTokens": "服務商返回的總 token",
+ "chat.answerCopied": "回答已複製",
+ "chat.copyAnswer": "複製回答",
+ "chat.copied": "已複製",
+ "chat.progress": "簡報進度",
+ "chat.progressStep": "第 {{current}} / {{total}} 步",
+ "chat.progressPages": "已完成 {{done}} / {{total}} 頁",
+ "chat.viewOutline": "查看大綱",
+ "chat.outlineLabel": "{{title}} 的大綱",
+ "chat.closeOutline": "關閉大綱預覽",
+ "chat.noPoints": "暫無要點",
+ "chat.previewAgain": "再次預覽",
+ "chat.currentInspiration": "目前簡報採用的視覺參考",
+ "chat.manageConversations": "管理會話",
+ "chat.conversations": "會話",
+ "chat.newConversation": "新建",
+ "chat.searchConversations": "搜尋會話",
+ "chat.conversationName": "會話名稱",
+ "chat.saveConversationName": "儲存會話名稱",
+ "chat.cancelRename": "取消重命名",
+ "chat.deleteConversationQuestion": "刪除這個會話?",
+ "chat.confirm": "確認",
+ "chat.cancel": "取消",
+ "chat.messageCount": "{{count}} 條消息",
+ "chat.manageNamed": "管理 {{name}}",
+ "chat.rename": "重命名",
+ "chat.delete": "刪除",
+ "chat.noConversationMatch": "沒有匹配的會話",
+ "chat.emptyTitle": "開始一個新會話",
+ "chat.emptyBody": "這條會話會獨立儲存,但仍能編輯目前簡報。",
+ "workflow.clarify": "明確需求",
+ "workflow.preparing": "正在根據主題準備問題…",
+ "workflow.questionsPending": "{{count}} 個問題待確認",
+ "workflow.waitingBrief": "等待補充需求",
+ "workflow.questionsConfirmed": "{{count}} 個問題已確認",
+ "workflow.briefConfirmed": "需求已確認",
+ "workflow.research": "深度研究",
+ "workflow.researchAfterBrief": "確認需求後開始聯網研究",
+ "workflow.researching": "第 {{round}} / {{total}} 輪 · 已檢索 {{searches}} 次",
+ "workflow.researchWriting": "第 {{round}} / {{total}} 輪 · 正在流式撰寫報告",
+ "workflow.researchComplete": "已檢索 {{searches}} 次 · 收錄 {{sources}} 個來源",
+ "workflow.researchFailed": "研究中斷 · 已保留可用過程",
+ "workflow.outline": "編輯大綱",
+ "workflow.afterBrief": "確認需求後開始",
+ "workflow.afterResearch": "深度研究完成後開始",
+ "workflow.generatingOutline": "正在生成大綱…",
+ "workflow.outlineEditable": "{{count}} 頁 · 可編輯並確認",
+ "workflow.outlineConfirmed": "{{count}} 頁大綱已確認 · 可回看",
+ "workflow.inspiration": "選擇靈感",
+ "workflow.afterOutline": "確認大綱後選擇",
+ "workflow.pickInspiration": "挑選視覺參考或使用預設風格",
+ "workflow.inspirationSkipped": "已跳過 · 使用預設風格",
+ "workflow.inspirationSelected": "{{name}} · 可再次預覽",
+ "workflow.selectedFallback": "已選視覺參考",
+ "workflow.render": "生成頁面",
+ "workflow.afterInspiration": "選定視覺方向後開始",
+ "workflow.rendering": "正在生成 {{done}} / {{total}} 頁",
+ "workflow.rendered": "{{done}} / {{total}} 頁已生成",
+ "flow.attachedRequirement": "請根據附件上下文建立一份簡報。",
+ "flow.clarifyIntro": "先在右側確認幾個問題,我就開始寫大綱。",
+ "flow.confirmed": "已確認:\n{{summary}}",
+ "flow.skipClarify": "跳過確認,直接寫大綱。",
+ "flow.researchIntro": "正在進行深度研究——多角度聯網檢索並多輪驗證,然後再撰寫大綱。",
+ "flow.searching": "聯網檢索:{{detail}}",
+ "flow.synthesizing": "整理研究簡報({{detail}})",
+ "flow.outlineReady": "我整理了一個 {{count}} 頁的大綱——「{{title}}」。你可以在右側改標題、要點和順序,或直接告訴我怎麼改;滿意後點「生成」我再逐頁出圖。",
+ "flow.outlineDoc": "大綱 · {{count}} 頁",
+ "flow.outlineUpdated": "已更新大綱。",
+ "flow.stylePrompt": "出圖前,先挑一個視覺參考風格吧——我已按你的主題和大綱排好順序。點「瀏覽」選擇,或跳過並使用預設風格。",
+ "flow.styleSelected": "選定風格:{{name}}",
+ "flow.styleFailed": "應用風格失敗:{{error}}",
+ "flow.styleSkipped": "跳過風格,使用預設風格生成。",
+ "flow.fastRender": "⚡ 快速模式:{{count}} 頁並行生成(超出並發的會自動排隊),並保持統一的風格與需求…",
+ "flow.render": "開始逐頁生成 {{count}} 頁投影片,每頁約 30 秒…",
+ "flow.renderDone": "完成!已生成 {{count}} 頁。接下來可以直接告訴我怎麼優化,或從右上角匯出:",
+ "flow.renderingTitle": "正在生成頁面",
+ "flow.fastRenderingTitle": "正在生成頁面 · 快速模式",
+ "flow.fastRenderingNote": "快速模式並行生成所有頁面(超出的自動排隊),大綱與視覺參考保持鎖定。",
+ "flow.fastRenderTool": "並行生成簡報頁面",
+ "flow.renderingNote": "大綱與視覺參考已鎖定,正在逐頁繪製。",
+ "flow.renderTool": "生成簡報頁面",
+ "flow.renderingSlide": "正在生成第 {{index}} 頁",
+ "flow.failedCount": "{{count}} 頁失敗",
+ "flow.retrying": "重試第 {{index}} 頁(第 {{attempt}}/{{total}} 次)",
+ "flow.verifying": "校驗每一頁… 待補 {{pending}}/{{total}} 頁",
+ "flow.verifyDone": "校驗完成 · {{rendered}}/{{total}} 頁已生成",
+ "flow.renderFinishedWithErrors": "頁面生成完成,部分失敗",
+ "flow.renderFinished": "頁面生成完成",
+ "flow.renderStopped": "頁面生成中斷",
+ "flow.renderRestored": "已恢復並保留這次生成記錄。",
+ "flow.styleConfirmed": "已確認視覺參考:{{name}}。你可以隨時重新開啟這個選項。",
+ "flow.suggestionSummary": "加一頁總結收尾",
+ "flow.suggestionBusiness": "整體換成更商務的風格",
+ "flow.suggestionCover": "重畫封面,讓它更醒目",
+ "flow.suggestionSpecific": "把要點講得更具體",
+ "flow.placeholderClarify": "還可以補充其它要求;確認後開始寫大綱…",
+ "flow.placeholderOutline": "告訴助手怎麼改大綱,或直接在右側編輯…",
+ "flow.placeholderInspire": "點「瀏覽」選擇視覺風格,或跳過並使用預設風格…",
+ "flow.placeholderDeck": "讓助手增刪頁面、改寫內容、換風格或繼續優化…",
+ "agent.understanding": "正在理解你的修改",
+ "agent.understandingNote": "我正在核對修改要求、頁面上下文和附件,然後再更新簡報。",
+ "agent.readDesignFile": "讀取 Design File",
+ "agent.revisingOutline": "正在修改大綱",
+ "agent.revisingOutlineNote": "我會先讀取修改要求與引用的專案檔案,再更新大綱。",
+ "agent.reviseOutline": "修改大綱",
+ "agent.reviseOutlineDetail": "應用要求,並保留未涉及的頁面",
+ "agent.outlineRevised": "已更新 {{count}} 頁",
+ "agent.outlineComplete": "大綱修改完成",
+ "agent.outlineFailed": "大綱修改失敗",
+ "agent.editChecklist": "修改任務清單",
+ "agent.editChecklistDetail": "追蹤 {{count}} 個頁面修改",
+ "agent.runCommand": "執行命令",
+ "agent.readFile": "讀取檔案",
+ "agent.editFiles": "編輯檔案",
+ "agent.search": "搜尋",
+ "agent.taskList": "任務清單",
+ "agent.useTool": "呼叫工具",
+ "agent.plan": "規劃修改",
+ "agent.planDetail": "識別操作和受影響的頁面",
+ "agent.targetOne": "目標頁面:第 {{targets}} 頁",
+ "agent.targetMany": "目標頁面:第 {{targets}} 頁",
+ "agent.addRender": "新增並生成一個新頁面",
+ "agent.replyOnly": "回覆,不修改簡報",
+ "agent.answering": "回答問題",
+ "agent.readContext": "讀取引用的專案上下文",
+ "agent.adding": "正在新增新頁面",
+ "agent.applying": "正在應用修改",
+ "agent.reviewed": "請求已檢查",
+ "agent.plannedChange": "計劃修改:{{instruction}}",
+ "agent.noChange": "此請求不需要修改頁面。",
+ "agent.insert": "插入頁面",
+ "agent.after": "在第 {{index}} 頁之後",
+ "agent.renderSlide": "生成頁面",
+ "agent.matchStyle": "匹配目前視覺系統",
+ "agent.inserted": "已插入第 {{index}} 頁",
+ "agent.renderingSlide": "正在生成第 {{index}} 頁",
+ "agent.renderedSlide": "第 {{index}} 頁已生成",
+ "agent.addedSlide": "已新增第 {{index}} 頁",
+ "agent.addedReply": "{{reply}}(已新增第 {{index}} 頁)",
+ "agent.addTask": "新增第 {{index}} 頁",
+ "agent.updateSlide": "更新第 {{index}} 頁",
+ "agent.waitPrevious": "等待上一項修改完成",
+ "agent.redrawing": "按目前簡報風格重繪",
+ "agent.updatedSlide": "第 {{index}} 頁已更新",
+ "agent.updatedReply": "{{reply}}(已更新第 {{targets}} 頁)",
+ "agent.partialFailure": "{{reply}} 其餘頁面已更新,但第 {{targets}} 頁失敗。",
+ "agent.editErrors": "修改完成,但有錯誤",
+ "agent.editComplete": "簡報修改完成",
+ "agent.editFailed": "未能完成修改",
+ "agent.markRequest": "請修改第 {{index}} 頁中標注的區域。",
+ "agent.visualMark": "視覺標注",
+ "agent.editingSlide": "正在修改第 {{index}} 頁",
+ "agent.markNoteOne": "我正在讀取標注區域和你的修改說明。",
+ "agent.markNoteTwo": "會保留周圍佈局和整套簡報的視覺系統。",
+ "agent.applyVisual": "應用視覺修改",
+ "agent.processMark": "處理第 {{index}} 頁的標注區域",
+ "agent.markApplied": "已將視覺標注應用到第 {{index}} 頁。",
+ "agent.updated": "已更新",
+ "agent.updatedSaved": "更新後的頁面已儲存",
+ "agent.notUpdated": "第 {{index}} 頁未更新",
+ "agent.ranSeconds": "耗時 {{seconds}} 秒",
+ "agent.ranMinutes": "耗時 {{minutes}} 分 {{seconds}} 秒",
+ "status.outlining": "正在規劃簡報…",
+ "status.rendering": "正在繪製投影片…",
+ "status.editing": "正在應用修改…",
+ "status.drawingSlide": "正在繪製第 {{index}} 頁{{title}}",
+ "status.workingEdit": "正在處理修改…",
+ "status.outliningDeck": "正在編寫大綱",
+ "status.outlineReady": "大綱已就緒",
+ "status.renderingPages": "正在生成頁面",
+ "status.renderingNamed": "正在生成第 {{index}} 頁{{title}}",
+ "status.renderingCount": "正在生成 {{done}} / {{total}} 頁",
+ "template.preset": "預設風格",
+ "outline.draft": "大綱草稿",
+ "outline.pageCount": "{{count}} 頁 · {{aspect}}",
+ "outline.generate": "✓ 生成 {{count}} 頁",
+ "outline.generateHelp": "按大綱逐頁生成投影片",
+ "outline.hint": "先確認大綱:可改標題、增刪要點、調整順序,也可讓左側助手直接修改。滿意後點「生成」開始逐頁出圖。",
+ "outline.brief": "研究簡報",
+ "outline.pageTitle": "第 {{index}} 頁標題",
+ "outline.moveUp": "上移",
+ "outline.moveDown": "下移",
+ "outline.delete": "刪除",
+ "outline.pointsPlaceholder": "這一頁講什麼?每行寫一個要點…",
+ "outline.insert": "在此插入一頁",
+ "outline.insertAfter": "在第 {{index}} 頁後插入一頁",
+ "outline.add": "+ 新增一頁",
+ "outline.ready": "共 {{count}} 頁大綱已就緒",
+ "outline.timeHint": "確認後逐頁生成,每頁約 30 秒",
+ "outline.generating": "生成中…",
+ "outline.generateSlides": "✓ 生成 {{count}} 頁投影片",
+ "outline.streaming": "正在繼續撰寫下一頁…",
+ "outline.streamingCount": "已流式生成 {{count}} 頁大綱",
+ "outline.streamingHint": "大綱會邊寫邊顯示,完成後即可編輯確認",
+ "inspire.search": "搜尋視覺風格,如資料可視化 / 雜誌排版 / 手繪…",
+ "inspire.searchLabel": "搜尋風格",
+ "inspire.clear": "清空搜尋",
+ "inspire.close": "關閉",
+ "inspire.preview": "風格預覽",
+ "inspire.previewNamed": "放大預覽「{{name}}」",
+ "inspire.closePreview": "關閉風格預覽",
+ "inspire.previousPreview": "上一個風格",
+ "inspire.nextPreview": "下一個風格",
+ "inspire.previewKeyHint": "← → 翻頁 · Esc 關閉",
+ "inspire.previewSelected": "已選擇此風格",
+ "inspire.try": "試試:",
+ "inspire.recommended": "✦ 推薦",
+ "inspire.empty": "沒有匹配的風格,換個篩選或搜尋詞。",
+ "inspire.pickOne": "選擇一個風格(最多 1 個)",
+ "inspire.skip": "跳過,使用預設風格",
+ "inspire.apply": "應用風格並生成",
+ "inspire.libraryCount": "{{count}} 個 PPT 可用風格",
+ "inspire.selectNamed": "使用「{{name}}」",
+ "inspire.applyNamed": "應用「{{name}}」→",
+ "inspire.sourceMeta": "{{source}} · {{license}}",
+ "inspire.ranking": "智慧匹配中",
+ "inspire.ranked": "已按你的主題排序",
+ "inspire.generateNamed": "用「{{name}}」生成 →",
+ "inspire.choose": "選擇一個風格",
+ "inspire.query.businessReport": "專業商業匯報",
+ "inspire.query.infographic": "訊息圖佈局",
+ "inspire.query.diagram": "技術圖解",
+ "inspire.query.data": "資料可視化",
+ "inspire.query.uiDashboard": "儀表板介面",
+ "inspire.query.poster": "大膽海報",
+ "inspire.query.product": "產品展示",
+ "inspire.query.brandIdentity": "品牌視覺板",
+ "inspire.query.architectureSpace": "建築空間提案",
+ "inspire.query.photoCinematic": "電影感攝影",
+ "inspire.query.editorial": "雜誌排版",
+ "inspire.query.illustration": "插畫風格",
+ "slide.present": "播放",
+ "slide.presentHelp": "全屏播放",
+ "slide.export": "匯出",
+ "slide.exportHelp": "匯出簡報",
+ "slide.download": "下載簡報",
+ "slide.pdfHelp": "適合列印,每頁一張圖片",
+ "slide.pptxHelp": "可編輯的 .pptx,並保留原生演講備註",
+ "export.loading": "正在匯出 {{format}}…",
+ "export.ready": "{{format}} 已匯出",
+ "export.error": "{{format}} 匯出失敗",
+ "slide.previous": "上一頁",
+ "slide.next": "下一頁",
+ "slide.tools": "第 {{index}} 頁編輯工具",
+ "slide.askAi": "問 AI",
+ "slide.askAiHelp": "讓 AI 修改或擴展這一頁",
+ "slide.mark": "標注並評論",
+ "slide.markHelp": "標注一個區域並留下修改意見",
+ "slide.transition": "轉場",
+ "slide.transitionHelp": "設定頁面轉場",
+ "slide.replace": "替換圖片",
+ "slide.replaceHelp": "用上傳圖片替換目前頁面",
+ "slide.moveLeft": "向前移動",
+ "slide.moveLeftHelp": "把這一頁向前移動一位",
+ "slide.moveRight": "向後移動",
+ "slide.moveRightHelp": "把這一頁向後移動一位",
+ "slide.upload": "上傳圖片",
+ "slide.uploadHelp": "上傳一張投影片圖片",
+ "slide.duplicate": "複製",
+ "slide.duplicateHelp": "複製這一頁",
+ "slide.delete": "刪除",
+ "slide.deleteHelp": "刪除這一頁",
+ "slide.renderFailed": "生成失敗",
+ "slide.retry": "重新生成",
+ "slide.emptyBody": "讓 AI 生成一個視覺頁面,或上傳完成的投影片圖片。",
+ "slide.askAgent": "詢問簡報助手",
+ "slide.continueChat": "在助手對話中繼續",
+ "slide.formats": "PNG、JPG 或 WebP",
+ "slide.addFirst": "新增第一張投影片",
+ "slide.addFirstBody": "先新增空白頁,再生成或上傳視覺稿。",
+ "slide.add": "新增頁面",
+ "slide.select": "{{title}} — 選擇頁面",
+ "slide.transitionState": "第 {{index}} 頁轉場:{{transition}}",
+ "slide.none": "無",
+ "slide.addAfter": "在第 {{index}} 頁後新增頁面",
+ "slide.untitled": "未命名簡報",
+ "slide.ready": "第 {{index}} 頁已就緒",
+ "slide.drawing": "正在繪製第 {{index}} 頁{{title}}…",
+ "slide.queued": "已排隊,等待繪製…",
+ "slide.adding": "正在新增第 {{index}} 頁…",
+ "slide.agentUnavailable": "此頁面暫時無法使用簡報助手。",
+ "slide.imageTooLarge": "請選擇小於 20 MB 的圖片",
+ "slide.imagePrepareFailed": "無法處理這張圖片",
+ "slide.imageConvertFailed": "無法轉換這張圖片",
+ "slide.transitionTitle": "轉場:{{transition}}",
+ "versions.entry": "版本",
+ "versions.title": "版本管理",
+ "versions.count": "{{count}} 個版本",
+ "versions.current": "目前",
+ "versions.sourceAi": "AI 編輯",
+ "versions.sourceManual": "手動編輯",
+ "versions.sourceRestore": "回退生成",
+ "versions.slides": "{{count}} 頁",
+ "versions.restored": "已回退",
+ "versions.restoredFrom": "從 v{{version}} 回退",
+ "versions.search": "搜尋版本",
+ "versions.listAria": "簡報版本",
+ "versions.empty": "暫無已生成版本。",
+ "versions.noResults": "沒有匹配的版本。",
+ "versions.prompt": "提示詞",
+ "versions.noPrompt": "此版本沒有記錄提示詞。",
+ "versions.copyPrompt": "複製提示詞",
+ "versions.copied": "已複製",
+ "versions.copyFailed": "無法複製提示詞。",
+ "versions.promptSource.message": "來自使用者請求",
+ "versions.promptSource.project": "來自專案需求",
+ "versions.promptSource.manual": "手動操作",
+ "versions.promptSource.restore": "回退操作",
+ "versions.play": "播放",
+ "versions.restore": "切換版本",
+ "versions.restoring": "切換中…",
+ "versions.restoreConfirmTitle": "切換到此版本?",
+ "versions.restoreConfirmBody": "版本 {{version}} 會被恢復為一個新的目前版本,現有歷史不會被覆蓋。",
+ "versions.restoreConfirm": "確認切換",
+ "versions.loadingPreview": "正在載入版本預覽…",
+ "versions.noRenderedSlides": "此版本沒有已生成頁面。",
+ "versions.slidesAria": "版本頁面",
+ "versions.close": "關閉版本管理",
+ "play.mode": "簡報模式",
+ "play.navigate": "翻頁",
+ "play.exit": "退出",
+ "play.exitPresentation": "退出簡報",
+ "play.enterFullscreen": "進入全屏",
+ "play.exitFullscreen": "退出全屏",
+ "presenter.audiencePlayback": "觀眾播放",
+ "presenter.fromCurrent": "從目前頁播放",
+ "presenter.fromCurrentHelp": "從畫布目前選中的頁面開始",
+ "presenter.fromBeginning": "從頭開始播放",
+ "presenter.fromBeginningHelp": "從第一張已生成頁面開始",
+ "presenter.mode": "演講者模式",
+ "presenter.presenterFromCurrent": "從目前頁進入演講者模式",
+ "presenter.presenterFromBeginning": "從頭進入演講者模式",
+ "presenter.modeHelp": "觀眾畫面與備註計時視窗同步播放",
+ "presenter.windowTitle": "演講者視圖",
+ "presenter.opening": "正在開啟演講者視圖…",
+ "presenter.popupBlocked": "演講者視窗被瀏覽器攔截,請允許本站彈出視窗後重試。",
+ "presenter.pause": "暫停計時",
+ "presenter.resume": "繼續計時",
+ "presenter.reset": "重新開始",
+ "presenter.previous": "上一頁",
+ "presenter.next": "下一頁",
+ "presenter.slide": "第 {{current}} / {{total}} 頁",
+ "speakerNotes.title": "演講備註",
+ "speakerNotes.slide": "第 {{current}} 頁",
+ "speakerNotes.edit": "編輯",
+ "speakerNotes.save": "儲存",
+ "speakerNotes.saved": "已儲存",
+ "speakerNotes.generated": "已生成",
+ "speakerNotes.failed": "儲存失敗",
+ "speakerNotes.saving": "正在儲存…",
+ "speakerNotes.placeholder": "輸入這一頁的演講備註",
+ "speakerNotes.empty": "這一頁還沒有演講備註。你可以直接撰寫,也可以讓 AI 生成自然的講稿。",
+ "speakerNotes.emptyPresenter": "這一頁暫無演講備註,點擊此處新增。",
+ "speakerNotes.generate": "讓 AI 生成",
+ "speakerNotes.generating": "正在生成…",
+ "speakerNotes.regenerate": "重新生成",
+ "speakerNotes.write": "手動撰寫",
+ "speakerNotes.unavailable": "專案儲存後才可使用演講備註。",
+ "transition.title": "頁面轉場",
+ "transition.help": "該頁面進入簡報模式時播放。",
+ "transition.none": "無",
+ "transition.fade": "淡入",
+ "transition.push": "推進",
+ "transition.wipe": "擦除",
+ "transition.zoom": "縮放",
+ "transition.flip": "翻轉",
+ "transition.done": "完成",
+ "transition.slideTitle": "第 {{index}} 頁轉場",
+ "transition.close": "關閉轉場選擇器",
+ "transition.saveFailed": "儲存失敗:{{error}}",
+ "transition.saving": "正在儲存轉場…",
+ "transition.selected": "已選擇{{transition}}",
+ "mark.region": "標注第 {{index}} 頁",
+ "mark.textPlaceholder": "輸入文字,回車確認",
+ "mark.tools": "標注工具",
+ "mark.freehand": "自由繪製",
+ "mark.line": "直線",
+ "mark.rectangle": "矩形",
+ "mark.text": "文字標注",
+ "mark.textHelp": "文字標注 · 拖動可調整位置",
+ "mark.undo": "撤銷",
+ "mark.redo": "重做",
+ "mark.clear": "清除標注",
+ "mark.close": "關閉標注工具",
+ "mark.comment": "給簡報助手的修改說明",
+ "mark.cancel": "取消",
+ "mark.send": "發送給簡報助手",
+ "mark.imageLoading": "頁面圖片仍在載入,請稍後重試。",
+ "mark.imagePrepareFailed": "無法生成標注圖片,請重試。",
+ "mark.retryHelp": "你的標注仍然保留,可再次發送重試。",
+ "mark.editing": "修改中",
+ "mark.sending": "發送中",
+ "mark.retry": "重試",
+ "mark.sendShort": "發送",
+ "material.title": "品牌參考",
+ "material.optional": "可選",
+ "material.help": "新增 Logo、產品圖或視覺樣例,作為所有頁面的風格參考。",
+ "material.remove": "移除 {{name}}",
+ "material.addMore": "新增更多品牌圖片",
+ "material.add": "新增品牌圖片",
+ "material.guidance": "圖片僅用作視覺參考",
+ "material.uploading": "上傳中…",
+ "material.addMoreShort": "繼續新增",
+ "template.title": "視覺風格",
+ "template.palette": "色板:{{colors}}",
+ "template.styles": "視覺風格",
+ "template.search": "搜尋風格或類別",
+ "template.current": "目前專案風格",
+ "template.currentHelp": "不應用預設,按目前風格重新生成",
+ "template.stylesCount": "{{count}} 個風格",
+ "template.community": "Community 社區",
+ "template.useCurrent": "使用目前專案風格",
+ "template.presetShort": "預設",
+ "template.density": "{{category}} · {{density}}密度",
+ "template.densityLow": "低",
+ "template.densityMedium": "中",
+ "template.densityHigh": "高",
+ "template.noPreset": "不會應用預設風格",
+ "template.searchLabel": "搜尋視覺風格",
+ "template.noMatch": "沒有匹配“{{query}}”的風格。",
+ "restyle.open": "為所有頁面應用新的視覺風格",
+ "restyle.button": "整體換風格",
+ "restyle.close": "關閉整體換風格面板",
+ "restyle.title": "為整套簡報換風格",
+ "restyle.subtitle": "選擇一個視覺系統,並可新增品牌參考。",
+ "restyle.warning": "所有頁面的視覺稿都會被替換。",
+ "restyle.warningHelp": "大綱、文案和頁面順序保持不變。",
+ "restyle.progress": "正在重繪第 {{current}}/{{total}} 頁…",
+ "restyle.allOne": "重繪全部 {{count}} 頁",
+ "restyle.allMany": "重繪全部 {{count}} 頁",
+ "restyle.started": "正在為全部 {{count}} 頁更換視覺風格…",
+ "restyle.done": "完成——全部 {{count}} 頁已應用新的視覺風格。",
+ "restyle.saveFailed": "無法儲存新的簡報風格",
+ "brandSystem.open": "開啟整套簡報的品牌與設計體系",
+ "brandSystem.button": "品牌與設計體系",
+ "brandSystem.title": "Brand & Design System",
+ "brandSystem.subtitle": "用一套可編輯規範約束整份簡報。",
+ "brandSystem.close": "關閉品牌與設計體系",
+ "brandSystem.alwaysOn": "始終傳給 Agent 的上下文",
+ "brandSystem.alwaysOnHelp": "儲存後,這些規則會自動進入本簡報的每次新會話、生成和編輯。",
+ "brandSystem.overview": "體系總覽",
+ "brandSystem.unnamedBrand": "未命名品牌",
+ "brandSystem.systemReady": "顏色、字型與版式規則均可編輯",
+ "brandSystem.identity": "品牌標識",
+ "brandSystem.identityHelp": "名稱、核心訊息、語氣與 Logo 使用方式",
+ "brandSystem.brandName": "品牌名稱",
+ "brandSystem.brandNamePlaceholder": "例如:NOVA",
+ "brandSystem.tagline": "Slogan / 核心訊息",
+ "brandSystem.taglinePlaceholder": "希望品牌長期佔據的一句話",
+ "brandSystem.voice": "品牌語氣",
+ "brandSystem.voicePlaceholder": "清晰、樂觀、準確;避免誇張表述…",
+ "brandSystem.logoUsage": "Logo 規範",
+ "brandSystem.logoUsagePlaceholder": "位置、留白、顏色及禁止使用方式…",
+ "brandSystem.visualStyle": "設計風格",
+ "brandSystem.visualStyleHelp": "可替換預設,也可繼續編輯視覺方向",
+ "brandSystem.direction": "視覺方向",
+ "brandSystem.directionPlaceholder": "例如:瑞士編輯風 + 溫暖的產品攝影",
+ "brandSystem.keywords": "風格關鍵詞",
+ "brandSystem.keywordsPlaceholder": "簡潔、高級、編輯感、高對比…",
+ "brandSystem.imageTreatment": "圖片處理",
+ "brandSystem.imageTreatmentPlaceholder": "攝影、插畫、裁切、光線、材質方式…",
+ "brandSystem.colors": "顏色",
+ "brandSystem.colorsHelp": "所有頁面統一使用的語義色板",
+ "brandSystem.colorPrimary": "Primary",
+ "brandSystem.colorPrimaryTint": "Primary Tint",
+ "brandSystem.colorAccent": "Accent",
+ "brandSystem.colorAccentTint": "Accent Tint",
+ "brandSystem.colorInk": "Ink",
+ "brandSystem.colorSurface": "Surface",
+ "brandSystem.colorBackground": "Background",
+ "brandSystem.colorBackgroundWarm": "Background Warm",
+ "brandSystem.typography": "字型排版",
+ "brandSystem.typographyHelp": "字型家族、字重與簡報字號層級",
+ "brandSystem.headingFont": "標題字型",
+ "brandSystem.bodyFont": "正文字型",
+ "brandSystem.monoFont": "等寬 / 資料字型",
+ "brandSystem.typeScale": "字號層級",
+ "brandSystem.headingWeight": "標題字重",
+ "brandSystem.bodyWeight": "正文字重",
+ "brandSystem.effects": "效果",
+ "brandSystem.effectsHelp": "陰影、描邊與表面材質",
+ "brandSystem.shadow": "陰影",
+ "brandSystem.border": "描邊",
+ "brandSystem.texture": "紋理 / 材質",
+ "brandSystem.spacing": "間距",
+ "brandSystem.spacingHelp": "全部版式共享的密度與節奏",
+ "brandSystem.density": "密度",
+ "brandSystem.densityCompact": "緊湊",
+ "brandSystem.densityBalanced": "均衡",
+ "brandSystem.densitySpacious": "寬鬆",
+ "brandSystem.baseUnit": "基礎單位(px)",
+ "brandSystem.sectionGap": "區塊間距(px)",
+ "brandSystem.radius": "圓角",
+ "brandSystem.radiusHelp": "卡片與控件共享的幾何規範",
+ "brandSystem.cardRadius": "卡片(px)",
+ "brandSystem.controlRadius": "控件(px)",
+ "brandSystem.pillRadius": "膠囊(px)",
+ "brandSystem.assets": "品牌素材",
+ "brandSystem.assetsHelp": "Logo、產品圖與視覺參考",
+ "brandSystem.saveHelp": "儲存會影響後續 Agent 工作;重繪為可選操作,會替換現有頁面圖片。",
+ "brandSystem.saveAndRedraw": "儲存並重繪 {{count}} 頁",
+ "brandSystem.redrawProgress": "正在重繪 {{current}}/{{total}}…",
+ "brandSystem.save": "儲存體系",
+ "brandSystem.saved": "品牌與設計體系已儲存。它會作為這份簡報每次新會話、頁面生成和編輯的預設上下文。",
+ "brandSystem.renderContext": "接下來將以已儲存的品牌與設計體系作為視覺基準;每一頁都會遵循其中的配色、字型、圖片、間距與組件規則。",
+ "brandSystem.useSaved": "使用已儲存的品牌與設計體系,繼續生成頁面。",
+ "brandSystem.saveFailed": "無法儲存品牌與設計體系",
+ "brandSystem.workflowLabel": "品牌體系",
+ "project.draftIntro": "這個簡報還是草稿——「{{title}}」有 {{count}} 頁大綱,尚未生成視覺稿。你可以在右側編輯大綱或讓我修改,滿意後點「生成」逐頁出圖。",
+ "project.readyIntro": "我是這份簡報的助手。「{{title}}」共有 {{count}} 頁(已生成 {{rendered}} 頁)。我可以新增頁面、改寫內容、重繪指定頁面,或優化整套簡報。",
+ "context.preview": "預覽 {{name}}",
+ "context.remove": "移除 {{name}}",
+ "context.attachedImage": "已附圖片",
+ "dialog.closePreview": "關閉圖片預覽",
+ "loading.project": "正在開啟 {{title}}…",
+ "loading.default": "正在開啟專案…",
+ "common.cancel": "取消",
+ "common.send": "發送",
+ "common.working": "處理中…",
+ "common.upload": "上傳",
+ "common.refresh": "刷新",
+ "common.saveChanges": "儲存修改",
+ "common.saving": "儲存中…",
+ "common.saved": "已儲存",
+ "common.recommended": "推薦",
+ "chat.openDesignFiles": "在 Design Files 中開啟",
+ "chat.newConversationTitle": "新會話",
+ "designFiles.title": "Design Files",
+ "designFiles.workspaceViews": "工作區視圖",
+ "designFiles.canvas": "PPT 畫布",
+ "designFiles.itemCountOne": "{{count}} 項",
+ "designFiles.itemCountMany": "{{count}} 項",
+ "designFiles.list": "設計檔案",
+ "designFiles.referenceFiles": "參考檔案",
+ "designFiles.workflowEmpty": "流程開始後,問題、大綱和靈感會出現在這裡。",
+ "designFiles.noPreview": "暫無可預覽檔案",
+ "designFiles.noPreviewHelp": "完成流程步驟後,可從會話卡片或左側列表開啟。",
+ "designFiles.confirmedAnswers": "已確認的回答",
+ "designFiles.defaultStyle": "使用預設視覺風格",
+ "designFiles.defaultStyleHelp": "靈感步驟已跳過,生成會根據簡報主題與內容自動選擇視覺語言。",
+ "designFiles.templatePalette": "範本色板",
+ "designFiles.refresh": "刷新檔案",
+ "designFiles.back": "返回簡報",
+ "designFiles.project": "專案",
+ "designFiles.fileCountOne": "{{count}} 個檔案",
+ "designFiles.fileCountMany": "{{count}} 個檔案",
+ "designFiles.generated": "生成檔案",
+ "designFiles.uploads": "上傳檔案",
+ "designFiles.loading": "正在載入檔案…",
+ "designFiles.loadFailed": "檔案列表載入失敗",
+ "designFiles.searchPlaceholder": "搜尋檔案",
+ "designFiles.searchLabel": "搜尋專案檔案",
+ "designFiles.clearSearch": "清空搜尋",
+ "designFiles.searchResults": "{{count}} 個結果",
+ "designFiles.noSearchResults": "沒有匹配的檔案",
+ "designFiles.empty": "簡報流程中建立的檔案會顯示在這裡。",
+ "designFiles.select": "選擇一個檔案",
+ "designFiles.selectHelp": "在這裡預覽和編輯專案產物。",
+ "designFiles.viewMode": "檔案查看方式",
+ "designFiles.preview": "預覽",
+ "designFiles.source": "源碼",
+ "designFiles.edit": "編輯 {{name}}",
+ "designFiles.contentLoadFailed": "這個檔案暫時無法載入",
+ "designFiles.retry": "重試",
+ "designFiles.autoSaveHint": "更改會自動儲存",
+ "designFiles.autoSaved": "已於 {{time}} 自動儲存",
+ "designFiles.saveFailed": "儲存失敗 · 點擊重試",
+ "designFiles.retrySave": "重新儲存這個檔案",
+ "designFiles.dropToUpload": "鬆開以上傳檔案",
+ "designFiles.dropToUploadHelp": "檔案會新增到目前專案的 Design Files。",
+ "designFiles.uploadFailed": "上傳失敗",
+ "designFiles.copyPath": "複製路徑",
+ "designFiles.pathCopied": "路徑已複製",
+ "designFiles.download": "下載",
+ "designFiles.downloadNamed": "下載 {{name}}",
+ "designFiles.questionsPrepared": "我準備了 {{count}} 個確認問題。它們會作為 Design File 保留,後面可以隨時回看。",
+ "designFiles.questionsTitle": "需求確認問題",
+ "designFiles.questionsPending": "{{count}} 個問題 · 待確認",
+ "designFiles.questionsConfirmed": "{{count}} 個問題 · 已確認",
+ "designFiles.questionsConfirmedOpenBrief": "已確認 · 開啟專案簡報",
+ "designFiles.questionsSkipped": "已跳過問題確認",
+ "designFiles.outlineTitle": "簡報大綱",
+ "designFiles.outlineEditing": "{{count}} 頁 · 編輯中",
+ "designFiles.outlineConfirmed": "{{count}} 頁 · 已確認",
+ "designFiles.researchTitle": "深度研究報告",
+ "designFiles.researchRunning": "流式生成中 · 已收錄 {{count}} 個來源",
+ "designFiles.researchComplete": "已儲存 · {{count}} 個來源",
+ "designFiles.researchError": "研究中斷 · 已儲存目前內容",
+ "designFiles.researchPending": "完成首輪檢索後,Markdown 報告會出現在這裡。",
+ "designFiles.inspirationTitle": "視覺參考靈感",
+ "designFiles.inspirationSkipped": "已跳過 · 預設風格",
+ "designFiles.inspirationSelected": "已選擇 · 可回看",
+ "designFiles.inspirationPending": "候選方向 · 待選擇",
+ "research.title": "深度研究",
+ "research.running": "執行中…",
+ "research.starting": "正在啟動…",
+ "research.brief": "研究簡報——可編輯的 Markdown,大綱將基於此內容生成",
+ "research.researching": "研究中…",
+ "research.noDocument": "暫無文件",
+ "research.generate": "根據研究簡報生成簡報 →",
+ "research.round": "第 {{round}} 輪:{{queries}}",
+ "research.results": "🔎 {{query}} → {{count}} 條結果",
+ "research.searchCount": "已檢索 {{count}} 次",
+ "research.synthesizing": "✍ 正在整理(第 {{round}} 輪)…",
+ "research.complete": "✓ 研究完成",
+ "research.stageRound": "第 {{round}} / {{total}} 輪",
+ "research.sourceCount": "{{count}} 個來源",
+ "research.failed": "研究中斷",
+ "research.stageEyebrow": "Research workspace",
+ "research.liveTitle": "深度研究正在持續推進",
+ "research.completeTitle": "研究報告已完成",
+ "research.failedTitle": "研究過程已中斷",
+ "research.stageHelp": "搜尋呼叫、來源站點與 Markdown 報告會在這裡持續流式出現。",
+ "research.completeHelp": "報告與來源已經儲存,接下來會基於這份研究生成大綱。",
+ "research.failedHelp": "已保留目前報告、來源與過程,後續仍可回看。",
+ "research.outlineStarting": "深度研究已完成,正在根據報告生成簡報大綱…",
+ "research.searchMetric": "次搜尋",
+ "research.sourceMetric": "個來源",
+ "research.progressLabel": "深度研究進度",
+ "research.liveProcess": "實時過程",
+ "research.activityCount": "{{count}} 個步驟",
+ "research.startingDetail": "正在規劃檢索角度並連接搜尋工具…",
+ "research.sourcesTitle": "已讀取的網站",
+ "research.sourcesPending": "來源會隨著搜尋和引用核驗持續出現。",
+ "research.sourceFallback": "已用於研究報告中的事實核驗與交叉驗證。",
+ "research.reportTitle": "研究報告 · Markdown",
+ "research.reportStreaming": "流式寫入中",
+ "research.reportSaved": "已儲存",
+ "research.reportPending": "完成首輪檢索後,報告會在這裡逐字生成。",
+ "research.persisting": "研究過程正在持續寫入專案,刷新後仍可恢復",
+ "research.partialSaved": "目前過程與可用內容已儲存到專案",
+ "research.persisted": "報告已儲存為 Design Files / research.md",
+ "research.searchPreparing": "準備聯網檢索",
+ "research.activityRound": "第 {{round}} 輪",
+ "research.writingReport": "流式撰寫研究報告",
+ "research.writingRound": "第 {{round}} 輪綜合與交叉驗證",
+ "research.roundPlan": "規劃第 {{round}} 輪研究",
+ "research.roundPlanDetail": "拆分角度、補齊證據並檢查訊息缺口",
+ "chatEdit.title": "通過對話修改",
+ "chatEdit.you": "你",
+ "chatEdit.agent": "助手",
+ "chatEdit.placeholder": "例如“把第 2 頁改暖一些”或“整套換成瑞士國際主義風格”",
+ "tutorial.entry.eyebrow": "Codex 工作流",
+ "tutorial.entry.title": "在 Codex 中可視化使用 Codex Slides",
+ "tutorial.entry.body": "從開啟 Browser 到生成、修改、簡報和匯出的完整指引。",
+ "tutorial.entry.cta": "開啟教程",
+ "tutorial.dialog.kicker": "Codex Slides × Codex",
+ "tutorial.dialog.title": "不離開 Codex,完成整套簡報",
+ "tutorial.dialog.subtitle": "讓 Codex Slides 始終顯示在 Codex Browser 中,每個決策都可確認,每次生成和修改都能實時查看。",
+ "tutorial.dialog.close": "關閉 Codex 教程",
+ "tutorial.tabs.label": "Codex 教程內容",
+ "tutorial.tabs.guide": "可視化流程",
+ "tutorial.tabs.prompts": "Prompt 示例庫",
+ "tutorial.steps.label": "教程步驟",
+ "tutorial.stepCount": "第 {{current}} / {{total}} 步",
+ "tutorial.browserFirst.title": "核心規則:先開啟 Browser",
+ "tutorial.browserFirst.body": "Codex 必須先開啟 Codex Slides 首頁,再讓專案工作區持續顯示需求確認、大綱、風格、生成和複查過程,不能在隱藏後台一口氣跑完。",
+ "tutorial.sayInCodex": "在 Codex 裡這樣說",
+ "tutorial.copy": "複製",
+ "tutorial.copied": "已複製",
+ "tutorial.previous": "上一步",
+ "tutorial.next": "下一步",
+ "tutorial.openPrompts": "開啟 Prompt 示例庫",
+ "tutorial.step1.title": "開啟實時產品介面",
+ "tutorial.step1.body": "從 Codex 開始,而不是呼叫隱藏的後台任務。Codex 先在 Browser 中開啟 Codex Slides 首頁,確認建立介面已經顯示,再開始製作。",
+ "tutorial.step1.prompt": "在 Codex Browser 中開啟 Codex Slides。整個流程都保持產品介面可見,不要在隱藏的後台呼叫裡直接生成整套 PPT。",
+ "tutorial.step2.title": "建立可恢復的 Project",
+ "tutorial.step2.body": "在首頁輸入需求後立即建立 Project。之後每一步都會儲存,同一個 URL 可以隨時重新開啟並繼續。",
+ "tutorial.step2.prompt": "在 Codex Slides 首頁建立一個“2026 年人形機器人市場”Project:12 頁、16:9、中文、開啟深度研究。建立後進入 Project 頁面並繼續操作。",
+ "tutorial.step3.title": "確認需求問題",
+ "tutorial.step3.body": "在 Project 中檢查系統生成的問題,確認受眾、頁數、比例、語言、用途和內容重點,再讓 Codex 起草大綱。",
+ "tutorial.step3.prompt": "繼續操作目前可見的 Project。檢查需求確認問題;已有明確答案的採用推薦項,會實質影響結果但我沒有說明的選項保留在介面裡讓我確認,然後再生成大綱。",
+ "tutorial.step4.title": "確認大綱與視覺方向",
+ "tutorial.step4.body": "直接編輯、排序、新增或刪除大綱頁面。確認敘事後比較視覺參考,選擇風格,再進入生成。",
+ "tutorial.step4.prompt": "檢查 Codex Slides 中的大綱:把市場證據提前到競品分析之前,最後增加 90 天行動計劃,然後展示視覺風格選項。大綱和風格確認前不要生成頁面。",
+ "tutorial.step5.title": "可視化查看逐頁生成",
+ "tutorial.step5.body": "從已確認的 Project 開始生成,保持畫布開啟,讓完成的頁面逐一出現;生成期間仍可繼續輸入修改要求並自動排隊。",
+ "tutorial.step5.prompt": "確認目前視覺方向並生成 PPT。生成期間持續顯示 Codex Slides Project,展示逐頁進度,完成後在畫布中檢查整套簡報。",
+ "tutorial.step6.title": "通過 Deck Agent 持續修改",
+ "tutorial.step6.body": "可以用自然語言改寫單頁、新增或刪除頁面、調整結構、重繪視覺,或重設整套風格;生成中發送的要求會按順序排隊執行。",
+ "tutorial.step6.prompt": "在目前 Project 中,把第 3 頁文案縮短一半,在第 5 頁後增加一頁執行摘要,並把第 7 頁重繪成清晰的對比版式。其他頁面保持不變,每個結果都在畫布中展示。",
+ "tutorial.step7.title": "標注、品牌、播放與匯出",
+ "tutorial.step7.body": "可以直接在頁面上標注精確修改,用 @ 引用 Design Files,儲存始終生效的品牌與設計系統,通過 Play 檢查,視覺確認後再匯出。",
+ "tutorial.step7.prompt": "開啟第 4 頁的標注模式並按我的標記修改。然後把目前顏色、字型和 Logo 規則儲存為品牌與設計系統,通過 Play 模式檢查整套簡報,最後匯出 PPTX。",
+ "tutorial.library.title": "覆蓋完整流程的可複製 Prompt",
+ "tutorial.library.body": "直接在 Codex 中使用;每條 Prompt 都會把實時 Codex Slides Project 作為可視化事實來源。",
+ "tutorial.prompt.generate.title": "從零生成",
+ "tutorial.prompt.generate.body": "在 Codex Browser 中開啟 Codex Slides,建立一份 8 頁、16:9、英文的產品戰略簡報。持續顯示 Project,讓我依次確認問題、大綱和視覺方向,然後生成並檢查每一頁。",
+ "tutorial.prompt.sources.title": "基於檔案生成",
+ "tutorial.prompt.sources.body": "開啟 Codex Slides,把我上傳的 PDF 作為內容來源、表格作為資料集、Logo 和產品截圖作為品牌參考。在 Browser 中建立 Project,生成前停在大綱確認步驟。",
+ "tutorial.prompt.outline.title": "修改敘事結構",
+ "tutorial.prompt.outline.body": "在目前 Project 中把大綱收緊為決策敘事:背景、證據、選項、建議和下一步。合並重複頁面,展示修改後的大綱,確認後再生成。",
+ "tutorial.prompt.content.title": "改寫單頁內容",
+ "tutorial.prompt.content.body": "面向管理層改寫第 3 頁:保留結論,文案減少 50%,所有數字可追溯,只重新生成這一頁,並展示更新結果。",
+ "tutorial.prompt.structure.title": "新增、複製或刪除頁面",
+ "tutorial.prompt.structure.body": "在第 1 頁後增加執行摘要,複製第 5 頁並改成海外市場版本,刪除最後一頁附錄。保持現有視覺系統和轉場不變。",
+ "tutorial.prompt.visual.title": "改變整套視覺方向",
+ "tutorial.prompt.visual.body": "把整套簡報調整為克制的瑞士編輯設計:嚴格網格、高對比字型、暖色攝影和單一藍色強調。匯出前先在 Browser 中展示結果。",
+ "tutorial.prompt.mark.title": "按標注修改",
+ "tutorial.prompt.mark.body": "開啟第 4 頁標注模式,嚴格按照我的箭頭、文字和評論修改,只重新生成這一頁,並在專案歷史中保留標注源圖。",
+ "tutorial.prompt.brand.title": "應用品牌並匯出",
+ "tutorial.prompt.brand.body": "開啟品牌與設計系統,把 Logo、顏色角色、字型、間距和品牌語氣儲存為 Project 全域上下文;重繪目前簡報,通過 Play 檢查,然後匯出 PPTX 和 PDF。",
+};
diff --git a/src/i18n/messages.ts b/src/i18n/messages.ts
index 1d91c54..2e97110 100644
--- a/src/i18n/messages.ts
+++ b/src/i18n/messages.ts
@@ -1,6 +1,7 @@
import { en } from "./locales/en";
import { ja } from "./locales/ja";
import { zhCN } from "./locales/zh-CN";
+import { zhTW } from "./locales/zh-TW";
import { LOCALES, type Dict, type Locale, type MessageKey, type MessageValues, type UiLocale } from "./types";
export { LOCALES, LOCALE_LABEL, RTL_LOCALES } from "./types";
@@ -13,6 +14,7 @@ export const UI_LOCALE_STORAGE_KEY = "codex-slides-ui-locale";
export const DICTS: Record = {
en,
"zh-CN": zhCN,
+ "zh-TW": zhTW,
ja,
};
diff --git a/src/i18n/types.ts b/src/i18n/types.ts
index eaffaba..ea9f7a6 100644
--- a/src/i18n/types.ts
+++ b/src/i18n/types.ts
@@ -1,13 +1,14 @@
import type { Dict, MessageKey } from "./locales/en";
/** BCP-47 UI locales. Add a locale here, then register its dictionary in messages.ts. */
-export type Locale = "en" | "zh-CN" | "ja";
+export type Locale = "en" | "zh-CN" | "zh-TW" | "ja";
export type UiLocale = Locale;
-export const LOCALES: Locale[] = ["en", "zh-CN", "ja"];
+export const LOCALES: Locale[] = ["en", "zh-CN", "zh-TW", "ja"];
export const LOCALE_LABEL: Record = {
en: "English",
"zh-CN": "简体中文",
+ "zh-TW": "繁體中文",
ja: "日本語",
};
diff --git a/src/lib/onboard.ts b/src/lib/onboard.ts
index 86c252f..003c796 100644
--- a/src/lib/onboard.ts
+++ b/src/lib/onboard.ts
@@ -35,9 +35,11 @@ export function buildOnboardPrompt(
const cats = CATEGORIES.map((c) => `${c.id} (${c.labelEn})`).join(", ");
const responseLanguage = uiLocale === "zh-CN"
? "Simplified Chinese"
- : uiLocale === "ja"
- ? "Japanese"
- : "English";
+ : uiLocale === "zh-TW"
+ ? "Traditional Chinese (Taiwan)"
+ : uiLocale === "ja"
+ ? "Japanese"
+ : "English";
return [
"You are an onboarding assistant for an AI slide-deck generator.",
"Given the user's topic, produce 6-7 SHORT clarifying questions that will make the deck much better.",
diff --git a/src/lib/questionSemantics.ts b/src/lib/questionSemantics.ts
index bf14a6f..f16e97b 100644
--- a/src/lib/questionSemantics.ts
+++ b/src/lib/questionSemantics.ts
@@ -70,7 +70,7 @@ export function semanticOptionLabel(
return descriptor ? `${token} · ${descriptor}` : token;
}
-export type QuestionCopyLocale = "zh-CN" | "en" | "ja";
+export type QuestionCopyLocale = "zh-CN" | "zh-TW" | "en" | "ja";
/** Deterministic fallback when a model omits the required output-quality question. */
export function resolutionQuestionCopy(locale: QuestionCopyLocale) {
@@ -86,6 +86,12 @@ export function resolutionQuestionCopy(locale: QuestionCopyLocale) {
labels: ["標準", "高画質", "超高画質"],
};
}
+ if (locale === "zh-TW") {
+ return {
+ question: "輸出清晰度要選哪一檔?",
+ labels: ["標準品質", "高畫質", "超高畫質"],
+ };
+ }
return {
question: "输出清晰度选择哪档?",
labels: ["标准质量", "高清质量", "超高清质量"],
diff --git a/src/lib/scenarios.ts b/src/lib/scenarios.ts
index 14ba313..afa4dad 100644
--- a/src/lib/scenarios.ts
+++ b/src/lib/scenarios.ts
@@ -715,6 +715,8 @@ export const PRESENTATION_SCENARIOS: PresentationScenario[] = [
export const FEATURED_SCENARIOS = PRESENTATION_SCENARIOS.filter((scenario) => scenario.featured);
export function scenarioText(value: LocalizedScenarioText, locale: string): string {
+ // Traditional Chinese reuses the Simplified copy until scenario text is localized.
+ if (locale === "zh-TW") return value["zh-CN"];
return value[locale as keyof LocalizedScenarioText] ?? value.en;
}
diff --git a/src/lib/templates.ts b/src/lib/templates.ts
index 11f16a3..c767621 100644
--- a/src/lib/templates.ts
+++ b/src/lib/templates.ts
@@ -56,7 +56,11 @@ export const CATEGORIES: DeckCategory[] = [
];
export function categoryLabel(category: DeckCategory, locale: string): string {
- return locale === "zh-CN" ? category.labelZh : locale === "ja" ? category.labelJa : category.labelEn;
+ return locale === "zh-CN" || locale === "zh-TW"
+ ? category.labelZh
+ : locale === "ja"
+ ? category.labelJa
+ : category.labelEn;
}
// ---- seeded templates (5 paid categories x 3) --------------------------