@tomako/tools-runtime 0.1.5 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/package.json +2 -1
  2. package/src/components/tools/engine/package-widget-runtime.tsx +5 -1
  3. package/src/components/tools/engine/task-recovery.test.ts +65 -0
  4. package/src/components/tools/engine/task-recovery.ts +109 -0
  5. package/src/components/tools/engine/use-legacy-llm-task.ts +16 -3
  6. package/src/components/tools/engine/use-tool-task.ts +77 -53
  7. package/src/features/tools/app-store-screenshot-generator/widget/app-store-screenshot-generator.tsx +88 -16
  8. package/src/features/tools/app-store-screenshot-generator/widget/asset-slots.test.ts +52 -0
  9. package/src/features/tools/app-store-screenshot-generator/widget/asset-slots.ts +3 -2
  10. package/src/features/tools/app-store-screenshot-generator/widget/generation.test.ts +126 -0
  11. package/src/features/tools/app-store-screenshot-generator/widget/generation.ts +52 -14
  12. package/src/features/tools/app-store-screenshot-generator/widget/input-media.test.ts +81 -0
  13. package/src/features/tools/app-store-screenshot-generator/widget/input-media.ts +20 -8
  14. package/src/features/tools/cold-start-channel-selector/widget/cold-start-channel-selector.tsx +45 -16
  15. package/src/features/tools/competitor-analysis/competitor-analysis.container.tsx +26 -20
  16. package/src/features/tools/competitor-analysis/widget/competitor-analysis.tsx +47 -16
  17. package/src/features/tools/disclaimer-generator/disclaimer-generator.package.ts +3 -3
  18. package/src/features/tools/email-template-generator/widget/email-template-generator.tsx +37 -4
  19. package/src/features/tools/package/to-tool-module.ts +15 -0
  20. package/src/features/tools/product-name-generator/widget/product-name-generator.tsx +60 -27
  21. package/src/features/tools/product-poster-generator/widget/constants.ts +3 -1
  22. package/src/features/tools/product-poster-generator/widget/helpers.test.ts +51 -0
  23. package/src/features/tools/product-poster-generator/widget/helpers.ts +27 -0
  24. package/src/features/tools/product-poster-generator/widget/product-poster-generator.tsx +112 -12
  25. package/src/features/tools/slogan-generator/slogan-generator.package.ts +28 -28
  26. package/src/i18n/messages/en/tools/app-icon-resizer.ts +1 -1
  27. package/src/i18n/messages/en/tools/app-store-screenshot-generator.ts +2 -2
  28. package/src/i18n/messages/en/tools/cold-start-channel-selector.ts +4 -4
  29. package/src/i18n/messages/en/tools/competitor-analysis.ts +9 -8
  30. package/src/i18n/messages/en/tools/email-template-generator.ts +10 -10
  31. package/src/i18n/messages/en/tools/product-poster-generator.ts +1 -0
  32. package/src/i18n/messages/zh/tools/app-store-screenshot-generator.ts +3 -3
  33. package/src/i18n/messages/zh/tools/cold-start-channel-selector.ts +2 -2
  34. package/src/i18n/messages/zh/tools/competitor-analysis.ts +10 -9
  35. package/src/i18n/messages/zh/tools/email-template-generator.ts +11 -11
  36. package/src/i18n/messages/zh/tools/product-poster-generator.ts +1 -0
  37. package/src/i18n/messages/zh-tw/tools/app-store-screenshot-generator.ts +44 -44
  38. package/src/i18n/messages/zh-tw/tools/cold-start-channel-selector.ts +105 -105
  39. package/src/i18n/messages/zh-tw/tools/competitor-analysis.ts +41 -40
  40. package/src/i18n/messages/zh-tw/tools/email-template-generator.ts +111 -111
  41. package/src/i18n/messages/zh-tw/tools/product-name-generator.ts +92 -92
  42. package/src/i18n/messages/zh-tw/tools/product-poster-generator.ts +74 -73
  43. package/src/i18n/messages/zh-tw/tools/twitter-gif-downloader.ts +47 -47
  44. package/src/lib/tools/cold-start-channel-selector-schema.test.ts +39 -0
  45. package/src/lib/tools/cold-start-channel-selector-schema.ts +8 -4
  46. package/src/lib/tools/competitor-analysis-schema.test.ts +69 -0
  47. package/src/lib/tools/competitor-analysis-schema.ts +53 -5
@@ -1,27 +1,27 @@
1
1
  const competitorAnalysis = {
2
2
  meta: {
3
3
  title: "AI 競品分析工具",
4
- description: "輸入一個競品的網址,雲端 Agent 調研公開信息,輸出結構化的競品檔案:產品概覽、流量與增長、業務規模、團隊與融資,並附來源和可信度。",
5
- intro: "把一個競品 URL 變成一頁看懂的競品檔案。基於公開網頁和檢索的估算,每個維度都標註可信度,幫助你做定位、增長和競爭決策。",
4
+ description: "輸入一個競品網址,線上調研流程會整理公開資訊並輸出結構化競品檔案:產品概覽、流量與成長、業務規模、團隊與募資,並附來源和可信度。",
5
+ intro: "把一個競品 URL 變成一頁看懂的競品檔案。依據公開網頁和搜尋結果估算,每個面向都標註可信度,協助你做定位、成長和競爭決策。",
6
6
  category: "市場調研工具",
7
7
  keywords: [
8
8
  "競品分析工具",
9
9
  "競品分析",
10
10
  "競品調研",
11
11
  "競品流量分析",
12
- "競品融資查詢",
12
+ "競品募資查詢",
13
13
  ],
14
14
  },
15
15
  examples: [
16
16
  {
17
17
  label: "已上線 SaaS 競品",
18
18
  input: "競品 URL https://linear.app",
19
- expectedOutput: "產品概覽、流量量級與趨勢、定價與規模估算、創始團隊、融資輪次、來源鏈接,以及每個維度的可信度。",
19
+ expectedOutput: "產品概覽、流量規模與趨勢、定價與規模估算、創辦團隊、募資輪次、來源連結,以及每個面向的可信度。",
20
20
  },
21
21
  {
22
22
  label: "帶關注點的競品",
23
23
  input: "競品 URL https://www.notion.so,備註 關注定價與團隊規模",
24
- expectedOutput: "圍繞定價與團隊規模重點輸出,並對缺失數據降低可信度而非編造。",
24
+ expectedOutput: "聚焦輸出定價與團隊規模,缺少資料時降低可信度而非編造。",
25
25
  },
26
26
  ],
27
27
  widget: {
@@ -30,15 +30,15 @@ const competitorAnalysis = {
30
30
  nameLabel: "競品名稱(可選)",
31
31
  namePlaceholder: "例如 Linear",
32
32
  notesLabel: "關注點(可選)",
33
- notesPlaceholder: "想重點了解什麼?例如定價、團隊規模、增長渠道。",
34
- inputHint: "僅基於公開信息調研,請填寫競品的公開官網地址。",
33
+ notesPlaceholder: "想優先了解什麼?例如定價、團隊規模、成長管道。",
34
+ inputHint: "僅依公開資訊調研,請填寫競品的公開官網網址。",
35
35
  submit: "開始分析",
36
36
  submitting: "提交中…",
37
37
  running: "調研中…",
38
38
  emptyTitle: "競品檔案會顯示在這裡",
39
- emptyHint: "輸入一個競品網址,雲端 Agent 會調研公開信息並生成結構化檔案。",
39
+ emptyHint: "輸入一個競品網址,線上調研流程會整理公開資訊並產生結構化檔案。",
40
40
  runningTitle: "正在調研這個競品",
41
- runningHint: "Agent 正在讀取官網並檢索公開信號,整理流量、規模、團隊和融資。通常需要 1-3 分鐘。",
41
+ runningHint: "調研流程正在讀取官網並搜尋公開訊號,整理流量、規模、團隊和募資。通常需要 1-3 分鐘。",
42
42
  status: {
43
43
  default: "調研中",
44
44
  PENDING: "排隊中",
@@ -50,18 +50,18 @@ const competitorAnalysis = {
50
50
  retry: "重試",
51
51
  errors: {
52
52
  invalidUrl: "請輸入有效的競品網址(含 https://)。",
53
- submit: "提交失敗,請檢查網絡後重試。",
53
+ submit: "提交失敗,請檢查網路後重試。",
54
54
  task: "調研任務失敗,請稍後重試。",
55
- timeout: "調研超時,競品信息可能較難獲取,請稍後重試。",
55
+ timeout: "調研逾時,競品資訊可能較難取得,請稍後重試。",
56
56
  schema: "返回結果格式異常,請重試。",
57
57
  generic: "出現問題,請重試。",
58
58
  },
59
- noData: "暫無公開數據",
59
+ noData: "暫無公開資料",
60
60
  unknownCompetitor: "未識別競品",
61
- visitSite: "訪問官網",
61
+ visitSite: "造訪官網",
62
62
  analyzeAnother: "分析另一個競品",
63
63
  disclaimerFallback:
64
- "以上為基於公開信息的估算,可能不完整或滯後,非官方實時數據,請結合多方來源判斷。",
64
+ "以上為依據公開資訊的估算,可能不完整或落後,並非官方即時資料,請結合多方來源判斷。",
65
65
  confidence: {
66
66
  label: "可信度",
67
67
  low: "低",
@@ -73,9 +73,9 @@ const competitorAnalysis = {
73
73
  traffic: "流量與增長",
74
74
  businessScale: "業務規模",
75
75
  team: "團隊",
76
- funding: "融資",
76
+ funding: "募資",
77
77
  positioning: "定位與機會",
78
- sources: "信息來源",
78
+ sources: "資訊來源",
79
79
  },
80
80
  overview: {
81
81
  category: "品類",
@@ -84,10 +84,10 @@ const competitorAnalysis = {
84
84
  hq: "總部",
85
85
  },
86
86
  traffic: {
87
- monthlyVisits: "月訪問量(估算)",
88
- trend: "增長趨勢",
87
+ monthlyVisits: "每月造訪量(估算)",
88
+ trend: "成長趨勢",
89
89
  trendTitle: "近期流量趨勢",
90
- channels: "流量渠道",
90
+ channels: "流量來源",
91
91
  geographies: "主要地區",
92
92
  trendLabels: {
93
93
  growing: "上升",
@@ -106,11 +106,11 @@ const competitorAnalysis = {
106
106
  },
107
107
  team: {
108
108
  teamSize: "團隊規模",
109
- founders: "創始團隊",
109
+ founders: "創辦團隊",
110
110
  keyPeople: "核心成員",
111
111
  },
112
112
  funding: {
113
- totalRaised: "累計融資",
113
+ totalRaised: "累計募資",
114
114
  stage: "最新輪次",
115
115
  amount: "金額",
116
116
  date: "時間",
@@ -125,34 +125,35 @@ const competitorAnalysis = {
125
125
  },
126
126
  guide: {
127
127
  workspaceHeading: "AI 競品分析工具",
128
- workspaceHint: "輸入競品公開網址,產生帶來源的結構化檔案,並為主要發現標註可信度與未知項。",
128
+ workspaceHint: "輸入競品公開網址,產生附來源的結構化檔案,並為主要發現標註可信度與未知項目。",
129
129
  workspaceBadge: "僅使用公開來源",
130
130
  visualAlt: {
131
- hero: "競品檔案報告預覽(配圖待補)",
132
- howToUse: "競品分析使用流程示意(配圖待補)",
133
- result: "競品檔案結果解讀示意(配圖待補)",
131
+ hero: "包含來源與可信度的競品檔案報告。",
132
+ howToUse: "從公開競品網址到附來源競品檔案的分析流程。",
133
+ result: "把競品發現拆分為證據、估算、可信度與未知項。",
134
+ useCases: "團隊把競品研究用於定位、定價與上市決策。",
134
135
  },
135
136
  howToUseKicker: "使用流程",
136
137
  howToUse: "如何分析一個競品",
137
138
  howToUseSteps: [
138
- "粘貼競品的公開官網網址,可選填競品名稱和你重點關注的維度。",
139
- "提交後,雲端 Agent 會讀取官網並檢索公開信號,整理流量、規模、團隊和融資。",
140
- "結果以結構化檔案返回:每個維度都帶可信度,數據缺失時降級而非編造。",
141
- "先看概覽和流量趨勢,再把“定位與機會”轉成你的定位、定價或渠道假設。",
139
+ "貼上競品的公開官網網址,可選填競品名稱和你優先關注的面向。",
140
+ "提交後,線上調研流程會讀取官網並搜尋公開訊號,整理流量、規模、團隊和募資。",
141
+ "結果以結構化檔案傳回:每個面向都附可信度,缺少資料時降低可信度而非編造。",
142
+ "先看概覽和流量趨勢,再把「定位與機會」轉成你的定位、定價或成長管道假設。",
142
143
  ],
143
144
  runtimeNote:
144
- "調研由雲端 Agent 完成,僅基於公開網頁和檢索的估算。頁面只渲染結構化結果,不提供本地模板兜底。",
145
+ "調研透過線上流程完成,僅依公開網頁和搜尋結果估算。頁面只呈現結構化結果,不提供本機範本備援。",
145
146
  resultKicker: "結果解讀",
146
147
  resultGuidance: "如何看懂競品檔案",
147
148
  guidanceBullets: [
148
149
  "可信度標籤決定權重:low 僅作線索,medium 可參考,high 才適合作為決策依據。",
149
150
  "流量趨勢比絕對數字更重要——上升說明在搶佔心智,下降可能是切入窗口。",
150
- "業務規模和融資幫你判斷對手的資源厚度,以及你能否在細分人群上錯位競爭。",
151
- "“你的切入機會”是行動項:落到首頁定位、定價策略、關鍵功能或首發渠道上。",
151
+ "業務規模和募資有助於判斷對手的資源厚度,以及你能否在細分客群中錯位競爭。",
152
+ "「你的切入機會」是行動項目:落到首頁定位、定價策略、關鍵功能或首波推廣管道上。",
152
153
  ],
153
154
  useCasesKicker: "適用場景",
154
155
  useCases: "適合的場景",
155
- useCasesIntro: "把一個競品 URL 變成可執行的競爭情報,而不是零散搜索結果的堆砌。",
156
+ useCasesIntro: "把一個競品 URL 變成可執行的競爭情報,而不是零散搜尋結果的堆疊。",
156
157
  useCaseBullets: [
157
158
  "進入新賽道前,快速摸清頭部競品的規模、資源和增長態勢。",
158
159
  "重寫官網、定價頁或冷啟動文案前,先看清對手怎麼定位、面向誰。",
@@ -162,28 +163,28 @@ const competitorAnalysis = {
162
163
  faq: "常見問題",
163
164
  faqItems: [
164
165
  {
165
- question: "數據是真實的嗎?",
166
+ question: "資料是真實的嗎?",
166
167
  answer:
167
- "是基於公開網頁和檢索的估算,不是官方實時數據。流量、營收、融資等可能滯後或缺失,每個維度都標註了可信度。",
168
+ "這是依據公開網頁和搜尋結果的估算,不是官方即時資料。流量、營收、募資等資訊可能落後或缺漏,每個面向都標註了可信度。",
168
169
  },
169
170
  {
170
171
  question: "需要填什麼?",
171
172
  answer: "只需競品的公開官網網址;可選填名稱和你關注的維度,讓結果更聚焦。",
172
173
  },
173
174
  {
174
- question: "會處理私有或登錄後的頁面嗎?",
175
- answer: "不會。Agent 只讀取公開頁面和公開檢索結果,不抓取私有、登錄或付費牆後的內容。",
175
+ question: "會處理私有或登入後的頁面嗎?",
176
+ answer: "不會。調研流程只讀取公開頁面和公開搜尋結果,不會擷取私有、登入後或付費牆後的內容。",
176
177
  },
177
178
  {
178
179
  question: "拿到結果後該做什麼?",
179
180
  answer:
180
- "用“定位與機會”裡的行動項,去調整你的定位、定價、關鍵功能或首發渠道,並結合多方來源複核高影響決策。",
181
+ "用「定位與機會」中的行動項目,調整你的定位、定價、關鍵功能或首波推廣管道,並結合多方來源複核高影響決策。",
181
182
  },
182
183
  ],
183
184
  faqBoundaryTitle: "能力邊界",
184
185
  faqBoundaryBullets: [
185
- "僅公開信息的估算,非官方實時數據。",
186
- "冷門或信息稀少的競品,部分維度可能為空。",
186
+ "僅依公開資訊估算,並非官方即時資料。",
187
+ "冷門或資訊稀少的競品,部分面向可能為空。",
187
188
  "高影響決策請結合多方來源人工複核。",
188
189
  ],
189
190
  ctaHint: "拿到競品檔案後,下一步把它轉成你的上市準備。",
@@ -1,174 +1,174 @@
1
1
  const emailTemplateGenerator = {
2
2
  meta: {
3
- title: "郵件模板生成器",
4
- description: "輸入營銷或高頻交易郵件需求,由在線 Agent 生成 MJML-first 郵件模板包,包含可預覽 HTML、純文本、變量、複核項和開發交付說明。",
5
- intro: "把粗略郵件需求轉成可預覽、可修改、可導出的 MJML 郵件模板包,適合營銷活動、驗證碼、賬單、訂閱成功和賬號通知等場景。",
6
- category: "營銷工具",
3
+ title: "郵件範本產生器",
4
+ description: "輸入行銷或高頻交易郵件需求,由線上產生流程製作 MJML-first 郵件範本包,包含可預覽 HTML、純文字、變數、複核項目和開發交付說明。",
5
+ intro: "把粗略郵件需求轉成可預覽、可修改、可匯出的 MJML 郵件範本包,適合行銷活動、驗證碼、帳單、訂閱成功和帳號通知等情境。",
6
+ category: "行銷工具",
7
7
  keywords: [
8
- "郵件模板生成器",
8
+ "郵件範本產生器",
9
9
  "MJML 郵件模板",
10
- "HTML 郵件生成器",
11
- "營銷郵件模板",
10
+ "HTML 郵件產生器",
11
+ "行銷郵件範本",
12
12
  ],
13
- inputSignal: "郵件需求、受眾、場景、品牌語氣",
14
- outputSignal: "MJML、HTML、純文本、變量和交付說明",
15
- boundarySignal: "營銷合規需人工複核",
13
+ inputSignal: "郵件需求、受眾、情境、品牌語氣",
14
+ outputSignal: "MJML、HTML、純文字、變數和交付說明",
15
+ boundarySignal: "行銷合規需人工複核",
16
16
  },
17
17
  guide: {
18
- heroImageAlt: "粗略郵件需求轉成 MJML、HTML、純文本、變量和導出包的視覺圖。",
18
+ heroImageAlt: "粗略郵件需求轉成 MJML、HTML、純文字、變數和匯出包的視覺圖。",
19
19
  workspaceHeading: "MJML 郵件模板產生器",
20
20
  workspaceHint:
21
- "描述郵件目標、受眾、場景和品牌語氣,Agent 會返回結構化的 MJML-first 郵件模板包,可預覽、修改、複製和導出。",
22
- workspaceBadge: "MJML 模板包",
21
+ "描述郵件目標、受眾、情境和品牌語氣,產生流程會傳回結構化的 MJML-first 郵件範本包,可預覽、修改、複製和匯出。",
22
+ workspaceBadge: "MJML 範本包",
23
23
  outputs: "你會得到什麼",
24
24
  outputsIntro:
25
- "生成結果不是一段只能閱讀的文案,而是一組可交付開發的郵件材料:源碼、渲染版本、純文本、變量和複核說明都在同一個結構化結果裡。",
25
+ "產生結果不是一段只能閱讀的文案,而是一組可交付開發的郵件材料:原始碼、呈現版本、純文字、變數和複核說明都在同一個結構化結果裡。",
26
26
  outputItems: [
27
27
  {
28
- title: "MJML 源文件",
29
- body: "把 MJML 作為可編輯源文件,用來維護響應式郵件佈局、間距、區塊、按鈕和頁腳結構。",
28
+ title: "MJML 原始檔",
29
+ body: "把 MJML 作為可編輯原始檔,用來維護響應式郵件版面、間距、區塊、按鈕和頁尾結構。",
30
30
  },
31
31
  {
32
32
  title: "HTML 郵件版本",
33
- body: "同時拿到匹配的 HTML 版本,用於郵件服務導入、開發檢查和頁面預覽。",
33
+ body: "同時取得相符的 HTML 版本,用於匯入郵件服務、開發檢查和頁面預覽。",
34
34
  },
35
35
  {
36
- title: "純文本 fallback",
37
- body: "生成適合無 HTML 郵件客戶端、可訪問性和送達率檢查的純文本版本。",
36
+ title: "純文字 fallback",
37
+ body: "產生適合不支援 HTML 的郵件軟體、無障礙和送達率檢查的純文字版本。",
38
38
  },
39
39
  {
40
- title: "變量和佔位符",
41
- body: "返回 {{first_name}}、{{cta_url}}、{{verification_code}}、{{invoice_url}} 等可替換變量及示例說明。",
40
+ title: "變數和預留位置",
41
+ body: "傳回 {{first_name}}、{{cta_url}}、{{verification_code}}、{{invoice_url}} 等可替換變數及範例說明。",
42
42
  },
43
43
  {
44
44
  title: "複核說明",
45
- body: "在交付開發前看到營銷合規、無障礙、渲染兼容和缺失信息等檢查項。",
45
+ body: "在交付開發前查看行銷合規、無障礙、呈現相容性和缺漏資訊等檢查項目。",
46
46
  },
47
47
  {
48
- title: "Agent 修改循環",
49
- body: "生成後可以描述要改的文案、模塊或結構,重新由 Agent 寫回新的結構化結果。",
48
+ title: "引導式修改流程",
49
+ body: "產生後可以描述要修改的文案、模組或結構,再產生一份新的結構化結果。",
50
50
  },
51
51
  ],
52
- valueVisualAlt: "包含 MJML、HTML、變量和開發交付說明的郵件模板包視覺圖。",
53
- standards: "好的郵件模板生成器應該具備什麼",
52
+ valueVisualAlt: "包含 MJML、HTML、變數和開發交付說明的郵件範本包視覺圖。",
53
+ standards: "好的郵件範本產生器應該具備什麼",
54
54
  standardsIntro:
55
- "真正有用的郵件生成器不只是寫幾段好看的文案,還應該產出營銷、生命週期和研發團隊可以繼續落地的格式。",
55
+ "真正有用的郵件產生器不只是寫幾段好看的文案,還應該產出行銷、生命週期和研發團隊可以繼續落地的格式。",
56
56
  standardsItems: [
57
57
  {
58
58
  title: "格式可交付",
59
- body: "MJML、HTML 和純文本分開輸出,讓源文件、渲染模板和 fallback 各自有清楚用途。",
59
+ body: "MJML、HTML 和純文字分開輸出,讓原始檔、呈現範本和 fallback 各自有清楚用途。",
60
60
  },
61
61
  {
62
- title: "理解場景差異",
63
- body: "營銷活動、生命週期郵件、驗證碼、賬單和訂閱通知需要不同語氣、CTA 和合規處理。",
62
+ title: "理解情境差異",
63
+ body: "行銷活動、生命週期郵件、驗證碼、帳單和訂閱通知需要不同語氣、CTA 和合規處理。",
64
64
  },
65
65
  {
66
66
  title: "方便開發接手",
67
- body: "變量、缺失信息、預覽文案和實現說明能減少營銷與研發之間的反覆溝通。",
67
+ body: "變數、缺漏資訊、預覽文案和實作說明能減少行銷與研發之間的反覆溝通。",
68
68
  },
69
69
  {
70
70
  title: "邊界可複核",
71
- body: "工具會提示退訂、交易/營銷邊界、無障礙和渲染檢查,而不是假裝每封郵件都可以直接發送。",
71
+ body: "工具會提示退訂、交易/行銷邊界、無障礙和呈現檢查,而不是假裝每封郵件都可以直接傳送。",
72
72
  },
73
73
  {
74
74
  title: "迭代速度快",
75
- body: "粗略 brief 可以先生成第一版,再通過 Agent 修改結構、措辭和模塊。",
75
+ body: "粗略 brief 可以先產生第一版,再依後續要求修改結構、措辭和模組。",
76
76
  },
77
77
  {
78
78
  title: "預覽真實有用",
79
- body: "HTML 預覽、源碼、純文本和交付說明放在一起,方便用戶在導出前檢查。",
79
+ body: "HTML 預覽、原始碼、純文字和交付說明放在一起,方便使用者在匯出前檢查。",
80
80
  },
81
81
  ],
82
- boundary: "支持場景、邊界和失敗恢復",
82
+ boundary: "支援情境、邊界和失敗恢復",
83
83
  boundaryIntro:
84
- "營銷郵件和交易郵件有相同的投遞限制,但寫法不能混在一起。這個工具會把這些差異在結果裡顯式保留。",
84
+ "行銷郵件和交易郵件有相同的投遞限制,但寫法不能混在一起。這個工具會在結果中清楚保留這些差異。",
85
85
  boundaryGroups: [
86
86
  {
87
87
  title: "適合處理",
88
88
  items: [
89
- "營銷 newsletter、產品發佈、促銷活動、用戶激活和生命週期培育郵件。",
90
- "驗證碼、賬單、收據、訂閱成功、賬號通知等常見交易/系統郵件模板。",
91
- "需要 MJML 源碼、HTML 導出、純文本、變量和開發說明的郵件模板交付場景。",
89
+ "行銷 newsletter、產品發布、促銷活動、使用者啟用和生命週期培育郵件。",
90
+ "驗證碼、帳單、收據、訂閱成功、帳號通知等常見交易/系統郵件範本。",
91
+ "需要 MJML 原始碼、HTML 匯出、純文字、變數和開發說明的郵件範本交付情境。",
92
92
  ],
93
93
  },
94
94
  {
95
95
  title: "需要人工複核",
96
96
  items: [
97
- "CAN-SPAM、GDPR/ePrivacy、CASL、退訂鏈接、發件人身份、法律頁腳、營銷承諾、折扣和抽獎規則。",
97
+ "CAN-SPAM、GDPR/ePrivacy、CASL、退訂連結、寄件者身分、法律頁尾、行銷承諾、折扣和抽獎規則。",
98
98
  "冷郵件、強監管產品、金融承諾、醫療聲明和高風險促銷等送達率或合規敏感內容。",
99
- "品牌關鍵文案、本地化、圖片資產、變量命名和郵件服務商特殊要求。",
99
+ "品牌關鍵文案、在地化、圖片資產、變數命名和郵件服務商特殊要求。",
100
100
  ],
101
101
  },
102
102
  {
103
103
  title: "失敗時怎麼恢復",
104
104
  items: [
105
- "如果結果太泛,補充真實產品價值、用戶分群、優惠內容、CTA、反對意見和品牌示例。",
106
- "如果交易郵件顯得過度營銷,切換到交易場景,或要求 Agent 移除銷售性措辭。",
107
- "如果缺少變量或鏈接,把需要的變量名寫進修改要求,再通過修改框重新生成。",
105
+ "如果結果太泛,補充真實產品價值、使用者分群、優惠內容、CTA、反對意見和品牌範例。",
106
+ "如果交易郵件顯得過度行銷,切換到交易情境,或在修改要求中說明移除銷售性措辭。",
107
+ "如果缺少變數或連結,把需要的變數名稱寫進修改要求,再透過修改框重新產生。",
108
108
  ],
109
109
  },
110
110
  ],
111
- supportVisualAlt: "營銷、驗證碼、收據和複核郵件卡片的視覺圖。",
112
- guidance: "如何使用生成結果",
111
+ supportVisualAlt: "行銷、驗證碼、收據和複核郵件卡片的視覺圖。",
112
+ guidance: "如何使用產生結果",
113
113
  guidanceIntro:
114
- "把生成包當作可交付開發的起點。先預覽,再檢查變量和說明,最後放到郵件服務商裡做真實測試。",
114
+ "把產生的郵件包當作可交付開發的起點。先預覽,再檢查變數和說明,最後放到郵件服務商中做真實測試。",
115
115
  guidanceItems: [
116
- "需要調整佈局、間距、按鈕、模塊或頁腳時,從 MJML 源文件開始改。",
117
- "HTML 導出適合預覽、開發評審,或導入支持原始 HTML 的郵件系統。",
118
- "純文本版本要和核心消息及 CTA 保持一致,不要把可訪問性和送達率放到最後才補。",
119
- "發送前檢查桌面和移動端渲染、退訂或偏好鏈接、變量、預覽文案、發件人身份和追蹤要求。",
116
+ "需要調整版面、間距、按鈕、模組或頁尾時,從 MJML 原始檔開始修改。",
117
+ "HTML 匯出適合預覽、開發評審,或匯入支援原始 HTML 的郵件系統。",
118
+ "純文字版本要和核心訊息及 CTA 保持一致,不要把無障礙和送達率放到最後才補。",
119
+ "傳送前檢查桌面和行動裝置呈現、退訂或偏好連結、變數、預覽文案、寄件者身分和追蹤要求。",
120
120
  ],
121
- exportVisualAlt: "可編輯郵件草案、響應式預覽、MJML 源碼和導出文件夾的視覺圖。",
122
- useCases: "適用場景",
121
+ exportVisualAlt: "可編輯郵件草案、響應式預覽、MJML 原始碼和匯出資料夾的視覺圖。",
122
+ useCases: "適用情境",
123
123
  useCaseItems: [
124
124
  {
125
- title: "活動和發佈郵件",
126
- body: "把產品發佈、功能更新、季節促銷或 newsletter 需求轉成第一版 MJML 模板包。",
125
+ title: "活動和發布郵件",
126
+ body: "把產品發布、功能更新、季節促銷或 newsletter 需求轉成第一版 MJML 範本包。",
127
127
  },
128
128
  {
129
- title: "生命週期營銷",
130
- body: "生成激活、入門引導、升級、召回和留存郵件,並附帶清楚 CTA 與後續檢查項。",
129
+ title: "生命週期行銷",
130
+ body: "產生啟用、入門引導、升級、召回和留存郵件,並附帶清楚 CTA 與後續檢查項目。",
131
131
  },
132
132
  {
133
133
  title: "交易/系統模板",
134
- body: "起草驗證碼、賬單、收據、訂閱成功和賬號通知郵件,避免把系統通知寫成廣告。",
134
+ body: "起草驗證碼、帳單、收據、訂閱成功和帳號通知郵件,避免把系統通知寫成廣告。",
135
135
  },
136
136
  {
137
- title: "營銷交付開發",
138
- body: "給研發一組 MJML、HTML、變量、純文本和複核說明,而不是一份鬆散文案文檔。",
137
+ title: "行銷交付開發",
138
+ body: "提供研發一組 MJML、HTML、變數、純文字和複核說明,而不是一份鬆散的文案檔案。",
139
139
  },
140
140
  ],
141
141
  faq: "常見問題",
142
142
  faqItems: [
143
143
  {
144
- question: "這個工具生成 HTML 還是 MJML?",
144
+ question: "這個工具產生 HTML 還是 MJML?",
145
145
  answer:
146
- "兩個都會生成。MJML 是可編輯源文件,HTML 用於預覽、導入和開發交付。",
146
+ "兩個都會產生。MJML 是可編輯原始檔,HTML 用於預覽、匯入和開發交付。",
147
147
  },
148
148
  {
149
149
  question: "可以處理交易郵件嗎?",
150
150
  answer:
151
- "可以。它支持驗證碼、賬單、收據、訂閱成功和賬號通知等高頻場景,這些郵件會保持更事實化、更少營銷味。",
151
+ "可以。它支援驗證碼、帳單、收據、訂閱成功和帳號通知等高頻情境,這些郵件會保持更事實化、更少行銷語氣。",
152
152
  },
153
153
  {
154
- question: "生成後可以修改嗎?",
154
+ question: "產生後可以修改嗎?",
155
155
  answer:
156
- "可以。你可以查看模塊,並把修改要求發回 Agent。下一版會作為新的結構化結果寫回。",
156
+ "可以。你可以查看模組並提交修改要求,下一版會以新的結構化結果傳回。",
157
157
  },
158
158
  {
159
- question: "生成的 HTML 可以直接發送嗎?",
159
+ question: "產生的 HTML 可以直接傳送嗎?",
160
160
  answer:
161
- "它是高質量起點,但發送前仍要在郵件服務商裡測試,並複核退訂、發件人身份、營銷承諾、變量和渲染兼容。",
161
+ "它是高品質起點,但傳送前仍要在郵件服務商中測試,並複核退訂、寄件者身分、行銷承諾、變數和呈現相容性。",
162
162
  },
163
163
  {
164
- question: "我需要提供哪些信息?",
164
+ question: "我需要提供哪些資訊?",
165
165
  answer:
166
- "產品名稱、受眾、場景、目標、優惠或觸發條件、品牌語氣、CTA 和必須包含的信息,就足夠生成第一版。",
166
+ "產品名稱、受眾、情境、目標、優惠或觸發條件、品牌語氣、CTA 和必須包含的資訊,就足夠產生第一版。",
167
167
  },
168
168
  {
169
169
  question: "結果太泛怎麼辦?",
170
170
  answer:
171
- "補充產品證據、用戶分群、反對意見、優惠細節、發件人身份、變量名和更明確的 CTA,然後通過修改框重新生成。",
171
+ "補充產品證據、使用者分群、反對意見、優惠細節、寄件者身分、變數名稱和更明確的 CTA,然後透過修改框重新產生。",
172
172
  },
173
173
  ],
174
174
  ctaTitle: "繼續完善上線系統",
@@ -178,110 +178,110 @@ const emailTemplateGenerator = {
178
178
  "郵件模板整理好後,可以繼續打磨產品命名、上線文案和開發交付材料。",
179
179
  },
180
180
  widget: {
181
- formTitle: "先生成可用的第一版",
182
- formHint: "先填寫必要信息。品牌規則和必須包含的內容可以放到高級設置裡。",
181
+ formTitle: "先產生可用的第一版",
182
+ formHint: "先填寫必要資訊。品牌規則和必須包含的內容可以放到進階設定中。",
183
183
  productNameLabel: "產品名稱",
184
184
  productNamePlaceholder: "例如 Tomako Launch",
185
185
  audienceLabel: "目標受眾",
186
- audiencePlaceholder: "例如還沒有完成設置的試用用戶",
187
- scenarioLabel: "郵件場景",
186
+ audiencePlaceholder: "例如尚未完成設定的試用使用者",
187
+ scenarioLabel: "郵件情境",
188
188
  toneLabel: "語氣",
189
189
  languageLabel: "語言",
190
190
  briefLabel: "郵件需求",
191
191
  briefPlaceholder:
192
- "說明這封郵件的目標、觸發條件、優惠或通知內容、用戶背景、核心信息,以及希望用戶下一步做什麼。",
192
+ "說明這封郵件的目標、觸發條件、優惠或通知內容、使用者背景、核心資訊,以及希望使用者下一步做什麼。",
193
193
  ctaLabel: "主要 CTA",
194
- ctaPlaceholder: "例如 完成設置",
194
+ ctaPlaceholder: "例如 完成設定",
195
195
  brandNotesLabel: "品牌與風格說明",
196
196
  brandNotesPlaceholder:
197
- "可以寫品牌語氣、禁用詞、發件人身份、顏色、已有郵件示例或文案偏好。",
197
+ "可以填寫品牌語氣、禁用詞、寄件者身分、顏色、既有郵件範例或文案偏好。",
198
198
  mustIncludeLabel: "必須包含",
199
199
  mustIncludePlaceholder:
200
- "可以寫變量名、鏈接、免責聲明、頁腳要求、優惠細節或驗證碼佔位符。",
201
- advancedTitle: "高級設置",
200
+ "可以填寫變數名稱、連結、免責聲明、頁尾要求、優惠細節或驗證碼預留位置。",
201
+ advancedTitle: "進階設定",
202
202
  optional: "可選",
203
- generate: "生成郵件模板",
203
+ generate: "產生郵件範本",
204
204
  submitting: "正在提交請求...",
205
- running: "正在生成模板包...",
205
+ running: "正在產生範本包...",
206
206
  retry: "重試",
207
- emptyTitle: "生成結果會顯示在這裡",
207
+ emptyTitle: "產生結果會顯示在這裡",
208
208
  emptyHint:
209
- "結果包含 HTML 預覽、MJML 源碼、HTML、純文本、變量、複核說明和導出動作。",
210
- runningTitle: "Agent 正在生成郵件模板包",
209
+ "結果包含 HTML 預覽、MJML 原始碼、HTML、純文字、變數、複核說明和匯出動作。",
210
+ runningTitle: "正在產生郵件範本包",
211
211
  runningHint:
212
- "它會生成 MJML、匹配的 HTML、純文本、變量和複核說明。結構化結果短暫延遲是正常的。",
212
+ "它會產生 MJML、相符的 HTML、純文字、變數和複核說明。結構化結果短暫延遲是正常的。",
213
213
  previewInput: "輸入",
214
214
  previewOutput: "輸出",
215
215
  previewTitle: "工作臺預覽",
216
- previewHint: "右側會從需求預覽切換到生成中狀態,完成後顯示真實 HTML 預覽。",
216
+ previewHint: "右側會從需求預覽切換到產生中狀態,完成後顯示真實 HTML 預覽。",
217
217
  previewDraft: "草稿",
218
- previewReady: "已生成",
218
+ previewReady: "已產生",
219
219
  previewProductFallback: "你的產品",
220
220
  previewAudienceFallback: "目標受眾",
221
221
  previewBriefFallback:
222
- "描述活動、觸發條件、用戶背景、核心信息、CTA 和所需變量。",
223
- previewItems: ["MJML 源碼", "HTML 預覽", "純文本", "變量", "複核說明"],
224
- previewFooter: "生成後,下方會展示完整模板包,包括源碼 tab、交付說明、複製、下載和繼續修改動作。",
225
- resultReady: "模板包已生成",
222
+ "描述活動、觸發條件、使用者背景、核心資訊、CTA 和所需變數。",
223
+ previewItems: ["MJML 原始碼", "HTML 預覽", "純文字", "變數", "複核說明"],
224
+ previewFooter: "產生後,下方會展示完整範本包,包括原始碼分頁、交付說明、複製、下載和繼續修改動作。",
225
+ resultReady: "範本包已產生",
226
226
  copyPackage: "複製完整包",
227
227
  downloadPackage: "下載完整包",
228
228
  copied: "已複製",
229
229
  tabs: {
230
230
  preview: "預覽",
231
- plain: "純文本",
231
+ plain: "純文字",
232
232
  handoff: "交付說明",
233
233
  },
234
- htmlPreviewTitle: "生成的 HTML 郵件預覽",
235
- sectionsTitle: "可修改模塊",
234
+ htmlPreviewTitle: "產生的 HTML 郵件預覽",
235
+ sectionsTitle: "可修改模組",
236
236
  copyMjml: "複製 MJML",
237
237
  downloadMjml: "下載 MJML",
238
238
  copyHtml: "複製 HTML",
239
239
  downloadHtml: "下載 HTML",
240
- copyPlain: "複製純文本",
240
+ copyPlain: "複製純文字",
241
241
  downloadPlain: "下載 TXT",
242
242
  handoff: {
243
- variables: "變量",
243
+ variables: "變數",
244
244
  compliance: "合規提示",
245
245
  developer: "開發說明",
246
246
  accessibility: "無障礙說明",
247
- render: "渲染檢查",
248
- missing: "缺失信息",
247
+ render: "呈現檢查",
248
+ missing: "缺漏資訊",
249
249
  empty: "沒有返回相關項目。",
250
250
  },
251
- revisionLabel: "讓 Agent 修改",
251
+ revisionLabel: "修改結果",
252
252
  revisionHint: "寫具體修改要求",
253
253
  revisionPlaceholder:
254
- "例如:縮短首屏,把 CTA 改成預約演示,並增加 {{calendar_url}} 變量。",
254
+ "例如:縮短首屏,把 CTA 改成預約示範,並增加 {{calendar_url}} 變數。",
255
255
  sendRevision: "發送修改要求",
256
256
  status: {
257
257
  PENDING: "排隊中",
258
- STREAMING: "生成中",
258
+ STREAMING: "產生中",
259
259
  AWAITING_INPUT: "等待結構化結果",
260
260
  SUCCEEDED: "正在完成結果",
261
261
  default: "處理中",
262
262
  },
263
263
  errors: {
264
- invalid: "請填寫真實產品名稱、目標受眾和郵件需求。佔位或純數字輸入無法生成有用模板。",
265
- revision: "發送給 Agent 前,請寫清楚具體修改要求。",
266
- copy: "複製失敗。你仍然可以手動選中文本複製。",
264
+ invalid: "請填寫真實產品名稱、目標受眾和郵件需求。預留文字或純數字輸入無法產生有用範本。",
265
+ revision: "提交前,請寫清楚具體修改要求。",
266
+ copy: "複製失敗。你仍然可以手動選取文字複製。",
267
267
  submit: "請求提交失敗。",
268
- task: "生成任務失敗。",
268
+ task: "產生任務失敗。",
269
269
  timeout: "結構化結果沒有在限定時間內返回。",
270
- schema: "Agent 返回的結果不符合郵件模板 schema。",
271
- generic: "郵件模板生成失敗。",
270
+ schema: "產生結果的格式無法安全讀取,請重試。",
271
+ generic: "郵件範本產生失敗。",
272
272
  recover:
273
- "請檢查郵件需求,或補充更具體的產品、受眾、CTA 和變量信息後重試。",
273
+ "請檢查郵件需求,或補充更具體的產品、受眾、CTA 和變數資訊後重試。",
274
274
  },
275
275
  copy: {
276
276
  scenarios: {
277
277
  newsletter: "Newsletter",
278
- productLaunch: "產品發佈",
278
+ productLaunch: "產品發布",
279
279
  promoCampaign: "促銷活動",
280
280
  lifecycleNurture: "生命週期培育",
281
281
  verificationCode: "驗證碼",
282
- invoiceReceipt: "賬單或收據",
282
+ invoiceReceipt: "帳單或收據",
283
283
  subscriptionConfirmation: "訂閱成功",
284
- accountNotification: "賬號通知",
284
+ accountNotification: "帳號通知",
285
285
  },
286
286
  tones: {
287
287
  clear: "清晰直接",