@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.
- package/package.json +2 -1
- package/src/components/tools/engine/package-widget-runtime.tsx +5 -1
- package/src/components/tools/engine/task-recovery.test.ts +65 -0
- package/src/components/tools/engine/task-recovery.ts +109 -0
- package/src/components/tools/engine/use-legacy-llm-task.ts +16 -3
- package/src/components/tools/engine/use-tool-task.ts +77 -53
- package/src/features/tools/app-store-screenshot-generator/widget/app-store-screenshot-generator.tsx +88 -16
- package/src/features/tools/app-store-screenshot-generator/widget/asset-slots.test.ts +52 -0
- package/src/features/tools/app-store-screenshot-generator/widget/asset-slots.ts +3 -2
- package/src/features/tools/app-store-screenshot-generator/widget/generation.test.ts +126 -0
- package/src/features/tools/app-store-screenshot-generator/widget/generation.ts +52 -14
- package/src/features/tools/app-store-screenshot-generator/widget/input-media.test.ts +81 -0
- package/src/features/tools/app-store-screenshot-generator/widget/input-media.ts +20 -8
- package/src/features/tools/cold-start-channel-selector/widget/cold-start-channel-selector.tsx +45 -16
- package/src/features/tools/competitor-analysis/competitor-analysis.container.tsx +26 -20
- package/src/features/tools/competitor-analysis/widget/competitor-analysis.tsx +47 -16
- package/src/features/tools/disclaimer-generator/disclaimer-generator.package.ts +3 -3
- package/src/features/tools/email-template-generator/widget/email-template-generator.tsx +37 -4
- package/src/features/tools/package/to-tool-module.ts +15 -0
- package/src/features/tools/product-name-generator/widget/product-name-generator.tsx +60 -27
- package/src/features/tools/product-poster-generator/widget/constants.ts +3 -1
- package/src/features/tools/product-poster-generator/widget/helpers.test.ts +51 -0
- package/src/features/tools/product-poster-generator/widget/helpers.ts +27 -0
- package/src/features/tools/product-poster-generator/widget/product-poster-generator.tsx +112 -12
- package/src/features/tools/slogan-generator/slogan-generator.package.ts +28 -28
- package/src/i18n/messages/en/tools/app-icon-resizer.ts +1 -1
- package/src/i18n/messages/en/tools/app-store-screenshot-generator.ts +2 -2
- package/src/i18n/messages/en/tools/cold-start-channel-selector.ts +4 -4
- package/src/i18n/messages/en/tools/competitor-analysis.ts +9 -8
- package/src/i18n/messages/en/tools/email-template-generator.ts +10 -10
- package/src/i18n/messages/en/tools/product-poster-generator.ts +1 -0
- package/src/i18n/messages/zh/tools/app-store-screenshot-generator.ts +3 -3
- package/src/i18n/messages/zh/tools/cold-start-channel-selector.ts +2 -2
- package/src/i18n/messages/zh/tools/competitor-analysis.ts +10 -9
- package/src/i18n/messages/zh/tools/email-template-generator.ts +11 -11
- package/src/i18n/messages/zh/tools/product-poster-generator.ts +1 -0
- package/src/i18n/messages/zh-tw/tools/app-store-screenshot-generator.ts +44 -44
- package/src/i18n/messages/zh-tw/tools/cold-start-channel-selector.ts +105 -105
- package/src/i18n/messages/zh-tw/tools/competitor-analysis.ts +41 -40
- package/src/i18n/messages/zh-tw/tools/email-template-generator.ts +111 -111
- package/src/i18n/messages/zh-tw/tools/product-name-generator.ts +92 -92
- package/src/i18n/messages/zh-tw/tools/product-poster-generator.ts +74 -73
- package/src/i18n/messages/zh-tw/tools/twitter-gif-downloader.ts +47 -47
- package/src/lib/tools/cold-start-channel-selector-schema.test.ts +39 -0
- package/src/lib/tools/cold-start-channel-selector-schema.ts +8 -4
- package/src/lib/tools/competitor-analysis-schema.test.ts +69 -0
- 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: "
|
|
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: "
|
|
39
|
+
emptyHint: "輸入一個競品網址,線上調研流程會整理公開資訊並產生結構化檔案。",
|
|
40
40
|
runningTitle: "正在調研這個競品",
|
|
41
|
-
runningHint: "
|
|
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
|
-
"
|
|
140
|
-
"
|
|
141
|
-
"
|
|
139
|
+
"貼上競品的公開官網網址,可選填競品名稱和你優先關注的面向。",
|
|
140
|
+
"提交後,線上調研流程會讀取官網並搜尋公開訊號,整理流量、規模、團隊和募資。",
|
|
141
|
+
"結果以結構化檔案傳回:每個面向都附可信度,缺少資料時降低可信度而非編造。",
|
|
142
|
+
"先看概覽和流量趨勢,再把「定位與機會」轉成你的定位、定價或成長管道假設。",
|
|
142
143
|
],
|
|
143
144
|
runtimeNote:
|
|
144
|
-
"
|
|
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: "
|
|
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: "
|
|
5
|
-
intro: "
|
|
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
|
-
"
|
|
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: "
|
|
33
|
+
body: "同時取得相符的 HTML 版本,用於匯入郵件服務、開發檢查和頁面預覽。",
|
|
34
34
|
},
|
|
35
35
|
{
|
|
36
|
-
title: "
|
|
37
|
-
body: "
|
|
36
|
+
title: "純文字 fallback",
|
|
37
|
+
body: "產生適合不支援 HTML 的郵件軟體、無障礙和送達率檢查的純文字版本。",
|
|
38
38
|
},
|
|
39
39
|
{
|
|
40
|
-
title: "
|
|
41
|
-
body: "
|
|
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: "
|
|
49
|
-
body: "
|
|
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
|
|
59
|
+
body: "MJML、HTML 和純文字分開輸出,讓原始檔、呈現範本和 fallback 各自有清楚用途。",
|
|
60
60
|
},
|
|
61
61
|
{
|
|
62
|
-
title: "
|
|
63
|
-
body: "
|
|
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
|
|
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
|
-
"
|
|
90
|
-
"
|
|
91
|
-
"需要 MJML
|
|
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
|
-
"
|
|
106
|
-
"
|
|
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
|
-
"
|
|
117
|
-
"HTML
|
|
118
|
-
"
|
|
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: "
|
|
125
|
+
title: "活動和發布郵件",
|
|
126
|
+
body: "把產品發布、功能更新、季節促銷或 newsletter 需求轉成第一版 MJML 範本包。",
|
|
127
127
|
},
|
|
128
128
|
{
|
|
129
|
-
title: "
|
|
130
|
-
body: "
|
|
129
|
+
title: "生命週期行銷",
|
|
130
|
+
body: "產生啟用、入門引導、升級、召回和留存郵件,並附帶清楚 CTA 與後續檢查項目。",
|
|
131
131
|
},
|
|
132
132
|
{
|
|
133
133
|
title: "交易/系統模板",
|
|
134
|
-
body: "
|
|
134
|
+
body: "起草驗證碼、帳單、收據、訂閱成功和帳號通知郵件,避免把系統通知寫成廣告。",
|
|
135
135
|
},
|
|
136
136
|
{
|
|
137
|
-
title: "
|
|
138
|
-
body: "
|
|
137
|
+
title: "行銷交付開發",
|
|
138
|
+
body: "提供研發一組 MJML、HTML、變數、純文字和複核說明,而不是一份鬆散的文案檔案。",
|
|
139
139
|
},
|
|
140
140
|
],
|
|
141
141
|
faq: "常見問題",
|
|
142
142
|
faqItems: [
|
|
143
143
|
{
|
|
144
|
-
question: "
|
|
144
|
+
question: "這個工具產生 HTML 還是 MJML?",
|
|
145
145
|
answer:
|
|
146
|
-
"
|
|
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
|
-
"
|
|
156
|
+
"可以。你可以查看模組並提交修改要求,下一版會以新的結構化結果傳回。",
|
|
157
157
|
},
|
|
158
158
|
{
|
|
159
|
-
question: "
|
|
159
|
+
question: "產生的 HTML 可以直接傳送嗎?",
|
|
160
160
|
answer:
|
|
161
|
-
"
|
|
161
|
+
"它是高品質起點,但傳送前仍要在郵件服務商中測試,並複核退訂、寄件者身分、行銷承諾、變數和呈現相容性。",
|
|
162
162
|
},
|
|
163
163
|
{
|
|
164
|
-
question: "
|
|
164
|
+
question: "我需要提供哪些資訊?",
|
|
165
165
|
answer:
|
|
166
|
-
"
|
|
166
|
+
"產品名稱、受眾、情境、目標、優惠或觸發條件、品牌語氣、CTA 和必須包含的資訊,就足夠產生第一版。",
|
|
167
167
|
},
|
|
168
168
|
{
|
|
169
169
|
question: "結果太泛怎麼辦?",
|
|
170
170
|
answer:
|
|
171
|
-
"
|
|
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
|
|
210
|
-
runningTitle: "
|
|
209
|
+
"結果包含 HTML 預覽、MJML 原始碼、HTML、純文字、變數、複核說明和匯出動作。",
|
|
210
|
+
runningTitle: "正在產生郵件範本包",
|
|
211
211
|
runningHint:
|
|
212
|
-
"
|
|
212
|
+
"它會產生 MJML、相符的 HTML、純文字、變數和複核說明。結構化結果短暫延遲是正常的。",
|
|
213
213
|
previewInput: "輸入",
|
|
214
214
|
previewOutput: "輸出",
|
|
215
215
|
previewTitle: "工作臺預覽",
|
|
216
|
-
previewHint: "
|
|
216
|
+
previewHint: "右側會從需求預覽切換到產生中狀態,完成後顯示真實 HTML 預覽。",
|
|
217
217
|
previewDraft: "草稿",
|
|
218
|
-
previewReady: "
|
|
218
|
+
previewReady: "已產生",
|
|
219
219
|
previewProductFallback: "你的產品",
|
|
220
220
|
previewAudienceFallback: "目標受眾",
|
|
221
221
|
previewBriefFallback:
|
|
222
|
-
"
|
|
223
|
-
previewItems: ["MJML
|
|
224
|
-
previewFooter: "
|
|
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: "
|
|
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: "
|
|
251
|
+
revisionLabel: "修改結果",
|
|
252
252
|
revisionHint: "寫具體修改要求",
|
|
253
253
|
revisionPlaceholder:
|
|
254
|
-
"例如:縮短首屏,把 CTA
|
|
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: "
|
|
266
|
-
copy: "
|
|
264
|
+
invalid: "請填寫真實產品名稱、目標受眾和郵件需求。預留文字或純數字輸入無法產生有用範本。",
|
|
265
|
+
revision: "提交前,請寫清楚具體修改要求。",
|
|
266
|
+
copy: "複製失敗。你仍然可以手動選取文字複製。",
|
|
267
267
|
submit: "請求提交失敗。",
|
|
268
|
-
task: "
|
|
268
|
+
task: "產生任務失敗。",
|
|
269
269
|
timeout: "結構化結果沒有在限定時間內返回。",
|
|
270
|
-
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: "清晰直接",
|