@tomako/tools-runtime 0.1.4 → 0.1.6

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 (57) 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-icon-resizer/app-icon-resizer.spec.ts +1 -1
  8. package/src/features/tools/app-store-screenshot-generator/app-store-screenshot-generator.container.tsx +6 -8
  9. package/src/features/tools/app-store-screenshot-generator/app-store-screenshot-generator.spec.ts +1 -1
  10. package/src/features/tools/app-store-screenshot-generator/widget/app-store-screenshot-generator.tsx +44 -6
  11. package/src/features/tools/app-store-screenshot-generator/widget/generation.test.ts +126 -0
  12. package/src/features/tools/app-store-screenshot-generator/widget/generation.ts +52 -14
  13. package/src/features/tools/cold-start-channel-selector/cold-start-channel-selector.spec.ts +1 -1
  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 +31 -26
  16. package/src/features/tools/competitor-analysis/competitor-analysis.spec.ts +1 -1
  17. package/src/features/tools/competitor-analysis/widget/competitor-analysis.tsx +47 -16
  18. package/src/features/tools/disclaimer-generator/disclaimer-generator.package.ts +4 -4
  19. package/src/features/tools/email-template-generator/email-template-generator.container.tsx +45 -173
  20. package/src/features/tools/email-template-generator/email-template-generator.spec.ts +1 -1
  21. package/src/features/tools/email-template-generator/widget/email-template-generator.tsx +37 -4
  22. package/src/features/tools/package/to-tool-module.ts +15 -0
  23. package/src/features/tools/product-name-generator/product-name-generator.spec.ts +1 -1
  24. package/src/features/tools/product-name-generator/widget/product-name-generator.tsx +60 -27
  25. package/src/features/tools/product-poster-generator/product-poster-generator.spec.ts +1 -1
  26. package/src/features/tools/product-poster-generator/widget/constants.ts +3 -1
  27. package/src/features/tools/product-poster-generator/widget/helpers.test.ts +51 -0
  28. package/src/features/tools/product-poster-generator/widget/helpers.ts +27 -0
  29. package/src/features/tools/product-poster-generator/widget/product-poster-generator.tsx +112 -12
  30. package/src/features/tools/slogan-generator/slogan-generator.package.ts +101 -29
  31. package/src/features/tools/twitter-gif-downloader/twitter-gif-downloader.container.tsx +2 -3
  32. package/src/features/tools/twitter-gif-downloader/twitter-gif-downloader.spec.ts +1 -1
  33. package/src/i18n/messages/en/tools/app-icon-resizer.ts +1 -1
  34. package/src/i18n/messages/en/tools/app-store-screenshot-generator.ts +3 -3
  35. package/src/i18n/messages/en/tools/cold-start-channel-selector.ts +4 -4
  36. package/src/i18n/messages/en/tools/competitor-analysis.ts +14 -10
  37. package/src/i18n/messages/en/tools/email-template-generator.ts +13 -13
  38. package/src/i18n/messages/en/tools/product-poster-generator.ts +3 -2
  39. package/src/i18n/messages/en/tools/twitter-gif-downloader.ts +1 -1
  40. package/src/i18n/messages/zh/tools/app-store-screenshot-generator.ts +4 -4
  41. package/src/i18n/messages/zh/tools/cold-start-channel-selector.ts +2 -2
  42. package/src/i18n/messages/zh/tools/competitor-analysis.ts +14 -10
  43. package/src/i18n/messages/zh/tools/email-template-generator.ts +12 -12
  44. package/src/i18n/messages/zh/tools/product-poster-generator.ts +2 -1
  45. package/src/i18n/messages/zh/tools/twitter-gif-downloader.ts +1 -1
  46. package/src/i18n/messages/zh-tw/tools/app-store-screenshot-generator.ts +44 -44
  47. package/src/i18n/messages/zh-tw/tools/cold-start-channel-selector.ts +105 -105
  48. package/src/i18n/messages/zh-tw/tools/competitor-analysis.ts +44 -40
  49. package/src/i18n/messages/zh-tw/tools/email-template-generator.ts +112 -112
  50. package/src/i18n/messages/zh-tw/tools/product-name-generator.ts +92 -92
  51. package/src/i18n/messages/zh-tw/tools/product-poster-generator.ts +74 -73
  52. package/src/i18n/messages/zh-tw/tools/twitter-gif-downloader.ts +48 -48
  53. package/src/lib/tools/cold-start-channel-selector-schema.test.ts +39 -0
  54. package/src/lib/tools/cold-start-channel-selector-schema.ts +8 -4
  55. package/src/lib/tools/competitor-analysis-schema.test.ts +69 -0
  56. package/src/lib/tools/competitor-analysis-schema.ts +53 -5
  57. package/src/lib/tools/ops-catalog.ts +10 -1
@@ -2,8 +2,8 @@ const productNameGenerator = {
2
2
  meta: {
3
3
  title: "產品取名器:App 和 SaaS 起名工具",
4
4
  displayTitle: "產品取名器",
5
- description: "輸入產品想法、目標用戶、命名風格和域名後綴,生成 3-5 個可繼續評估的產品名,展開單個候選後再做域名、搜索與商標預篩。",
6
- intro: "為 App、Web 工具、SaaS 和 AI 產品早期命名設計。先拿到少量有理由的候選名,再按需深查域名、搜索噪音和商標入口,避免一次性把成本花在會被淘汰的名字上。",
5
+ description: "輸入產品想法、目標使用者、命名風格和網域名稱後綴,產生 3-5 個可繼續評估的產品名,展開單個候選後再做網域名稱、搜尋與商標預篩。",
6
+ intro: "為 App、Web 工具、SaaS 和 AI 產品早期命名設計。先拿到少量有理由的候選名,再按需深查網域名稱、搜尋噪音和商標入口,避免一次性把成本花在會被淘汰的名字上。",
7
7
  category: "品牌工具",
8
8
  keywords: [
9
9
  "產品取名器",
@@ -11,13 +11,13 @@ const productNameGenerator = {
11
11
  "App 起名",
12
12
  "SaaS 命名",
13
13
  "AI 產品命名",
14
- "域名預篩",
14
+ "網域名稱預篩",
15
15
  ],
16
16
  },
17
17
  guide: {
18
18
  workspaceHeading: "產品取名器",
19
19
  workspaceHint:
20
- "輸入產品想法,生成候選名與預篩線索。",
20
+ "輸入產品想法,產生候選名與預篩線索。",
21
21
  workspaceBadge: "3-5 個候選名",
22
22
  standard: {
23
23
  benefits: {
@@ -25,15 +25,15 @@ const productNameGenerator = {
25
25
  cards: [
26
26
  {
27
27
  title: "可討論的短名單",
28
- body: "首輪只返回 3-5 個候選名,並附上核心理念和基礎品牌信號,讓命名會先聚焦少數方向。",
28
+ body: "首輪只回傳 3-5 個候選名,並附上核心理念和基礎品牌信號,讓命名會先聚焦少數方向。",
29
29
  },
30
30
  {
31
31
  title: "更少的早期誤判",
32
- body: "讀音、長度、風格、域名後綴和搜索噪音會分層呈現,幫助你先排掉不值得深查的名字。",
32
+ body: "讀音、長度、風格、網域名稱後綴和搜尋噪音會分層呈現,幫助你先排掉不值得深查的名字。",
33
33
  },
34
34
  {
35
35
  title: "清楚的複核邊界",
36
- body: "域名和商標只做預篩入口與風險提示,不把 AI 候選名包裝成可直接商用的法律結論。",
36
+ body: "網域名稱和商標只做預篩入口與風險提示,不把 AI 候選名包裝成可直接商用的法律結論。",
37
37
  },
38
38
  ],
39
39
  },
@@ -42,8 +42,8 @@ const productNameGenerator = {
42
42
  id: "name-shortlist",
43
43
  title: "把粗糙想法整理成\n可評審的候選名",
44
44
  body: [
45
- "產品早期起名最怕一次拿到幾十個相似詞,卻沒有理由判斷。這個工具先把產品想法、目標用戶和命名氣質轉成少量候選。",
46
- "每個名字都帶核心理念和基礎信息,方便產品、設計、增長和創始團隊快速決定哪些方向值得繼續看。",
45
+ "產品早期起名最怕一次拿到幾十個相似詞,卻沒有理由判斷。這個工具先把產品想法、目標使用者和命名氣質轉成少量候選。",
46
+ "每個名字都帶核心理念和基礎資訊,方便產品、設計、增長和創始團隊快速決定哪些方向值得繼續看。",
47
47
  ],
48
48
  image: {
49
49
  src: "/tools/product-name-generator-section-primary-8bit-v2.webp",
@@ -53,34 +53,34 @@ const productNameGenerator = {
53
53
  },
54
54
  {
55
55
  id: "name-variations",
56
- title: "用風格、市場和域名偏好\n控制命名方向",
56
+ title: "用風格、市場和網域名稱偏好\n控制命名方向",
57
57
  body: [
58
58
  "同一個產品可以走清晰直接、技術感、友好輕量、高級可信或自造詞方向。表單只保留會真正影響結果的核心選擇。",
59
- "目標市場和域名後綴會影響候選名的讀音、長度和後續檢查路徑,避免把所有 App、SaaS 和 AI 工具套進同一套名字。",
59
+ "目標市場和網域名稱後綴會影響候選名的讀音、長度和後續檢查路徑,避免把所有 App、SaaS 和 AI 工具套進同一套名字。",
60
60
  ],
61
61
  image: {
62
62
  src: "/tools/product-name-generator-section-variation-8bit-v2.webp",
63
- alt: "像素風命名方向配圖,展示風格、市場和域名偏好影響候選名。",
63
+ alt: "像素風命名方向配圖,展示風格、市場和網域名稱偏好影響候選名。",
64
64
  },
65
65
  },
66
66
  {
67
67
  id: "name-review",
68
68
  title: "先判斷名字是否值得保留\n再做深查",
69
69
  body: [
70
- "域名、搜索和商標預篩只在你展開單個候選後繼續觸發。這樣可以減少等待,也避免把預算和注意力花在早就會被淘汰的名字上。",
71
- "深查結果會提供可打開的搜索入口、風險提示和下一步檢查清單,正式商用前仍需要註冊商確認和專業商標複核。",
70
+ "網域名稱、搜尋和商標預篩只在你展開單個候選後繼續觸發。這樣可以減少等待,也避免把預算和注意力花在早就會被淘汰的名字上。",
71
+ "深查結果會提供可打開的搜尋入口、風險提示和下一步檢查清單,正式商用前仍需要註冊商確認和專業商標複核。",
72
72
  ],
73
73
  image: {
74
74
  src: "/tools/product-name-generator-section-support-8bit-v2.webp",
75
- alt: "像素風候選名複核配圖,展示域名、搜索和商標預篩線索。",
75
+ alt: "像素風候選名複核配圖,展示網域名稱、搜尋和商標預篩線索。",
76
76
  },
77
77
  imageFirst: true,
78
78
  },
79
79
  ],
80
80
  generation: {
81
- title: "如何生成一份\n產品名短名單",
81
+ title: "如何產生一份\n產品名短名單",
82
82
  imageAlt: "像素風產品取名流程配圖,展示從產品 brief 到候選名和複核材料。",
83
- ctaLabel: "生成候選名",
83
+ ctaLabel: "產生候選名",
84
84
  steps: [
85
85
  {
86
86
  title: "寫下產品想法",
@@ -88,15 +88,15 @@ const productNameGenerator = {
88
88
  },
89
89
  {
90
90
  title: "選擇命名約束",
91
- body: "確認目標用戶、命名風格、目標市場和域名後綴。已有工作名或候選名可以放到高級設置裡一起篩。",
91
+ body: "確認目標使用者、命名風格、目標市場和網域名稱後綴。已有工作名或候選名可以放到進階設定裡一起篩。",
92
92
  },
93
93
  {
94
- title: "生成首輪短名單",
95
- body: "工具會返回 3-5 個候選名,並附核心理念、基礎信息、快篩維度和可複製結果。",
94
+ title: "產生首輪短名單",
95
+ body: "工具會回傳 3-5 個候選名,並附核心理念、基礎資訊、快篩維度和可複製結果。",
96
96
  },
97
97
  {
98
98
  title: "展開候選做複核",
99
- body: "對真正有感覺的名字再展開深查,查看域名、搜索、商標入口、風險提示和下一步檢查。",
99
+ body: "對真正有感覺的名字再展開深查,查看網域名稱、搜尋、商標入口、風險提示和下一步檢查。",
100
100
  },
101
101
  ],
102
102
  },
@@ -108,17 +108,17 @@ const productNameGenerator = {
108
108
  {
109
109
  title: "產品名短名單",
110
110
  body:
111
- "首輪返回少量候選名,每個名字都附核心理念和基礎信息,方便團隊直接討論。",
111
+ "首輪回傳少量候選名,每個名字都附核心理念和基礎資訊,方便團隊直接討論。",
112
112
  },
113
113
  {
114
114
  title: "基礎品牌信號",
115
115
  body:
116
- "優先檢查讀音、長度、命名風格和你選擇的域名後綴,先排掉明顯不值得深查的方向。",
116
+ "優先檢查讀音、長度、命名風格和你選擇的網域名稱後綴,先排掉明顯不值得深查的方向。",
117
117
  },
118
118
  {
119
119
  title: "單名深查入口",
120
120
  body:
121
- "只對你展開的候選名繼續看域名、搜索噪音、商標官方入口、風險提示和下一步檢查。",
121
+ "只對你展開的候選名繼續看網域名稱、搜尋噪音、商標官方入口、風險提示和下一步檢查。",
122
122
  },
123
123
  {
124
124
  title: "可複製的決策素材",
@@ -128,25 +128,25 @@ const productNameGenerator = {
128
128
  ],
129
129
  howToUse: "如何使用產品取名器",
130
130
  howToUseSteps: [
131
- "填寫產品想法、目標用戶、命名氣質和已有工作名。",
132
- "選擇目標市場、域名後綴和可接受預算,首輪先保持輕量。",
133
- "生成 3-5 個候選名後,先看核心理念、讀音和基礎信息。",
134
- "對有感覺的名字點擊展開,再單獨做域名、搜索和商標預篩。",
131
+ "填寫產品想法、目標使用者、命名氣質和已有工作名。",
132
+ "選擇目標市場、網域名稱後綴和可接受預算,首輪先保持輕量。",
133
+ "產生 3-5 個候選名後,先看核心理念、讀音和基礎資訊。",
134
+ "對有感覺的名字點擊展開,再單獨做網域名稱、搜尋和商標預篩。",
135
135
  ],
136
136
  capabilityNote:
137
- "首輪優先解決「有沒有值得繼續看的名字」。域名價格、搜索噪音和商標安全不會在首輪強行承諾,深查也只作為預篩,不替代註冊商確認或法律意見。",
137
+ "首輪優先解決「有沒有值得繼續看的名字」。網域名稱價格、搜尋噪音和商標安全不會在首輪強行承諾,深查也只作為預篩,不替代註冊商確認或法律意見。",
138
138
  stagedOutput: "為什麼分階段輸出",
139
139
  stageLabel: "階段",
140
140
  stagedOutputBullets: [
141
141
  "第一階段只解決「有沒有值得繼續看的名字」:減少等待時間和不必要的深查成本。",
142
- "第二階段只分析用戶點擊的候選名:域名、搜索、商標入口和風險點按需展開。",
142
+ "第二階段只分析使用者點擊的候選名:網域名稱、搜尋、商標入口和風險點按需展開。",
143
143
  "第三階段適合最終決策:把 2-3 個候選名放在一起做紅黃綠判斷和下一步清單。",
144
144
  ],
145
145
  resultGuidance: "拿到候選名後怎麼判斷",
146
146
  resultGuidanceBullets: [
147
- "先淘汰讀音不順、過於泛化、和競品太近或看不出產品方向的名字,不急著買域名。",
148
- "把 2-3 個候選名讀給真實用戶或團隊成員聽,觀察他們能否複述、拼寫和猜到產品大概用途。",
149
- "只對最終候選展開深查,核對域名價格、搜索噪音、商標官方入口和需要人工複核的風險點。",
147
+ "先淘汰讀音不順、過於泛化、和競品太近或看不出產品方向的名字,不急著買網域名稱。",
148
+ "把 2-3 個候選名讀給真實使用者或團隊成員聽,觀察他們能否複述、拼寫和猜到產品大概用途。",
149
+ "只對最終候選展開深查,核對網域名稱價格、搜尋噪音、商標官方入口和需要人工複核的風險點。",
150
150
  ],
151
151
  whyTomako: "為什麼選這個取名器",
152
152
  whyTomakoItems: [
@@ -158,136 +158,136 @@ const productNameGenerator = {
158
158
  {
159
159
  title: "圍繞產品語境篩選",
160
160
  body:
161
- "候選名會結合產品想法、目標用戶、命名風格、已有工作名和目標市場,不把所有 App、SaaS、AI 工具套進同一套名字。",
161
+ "候選名會結合產品想法、目標使用者、命名風格、已有工作名和目標市場,不把所有 App、SaaS、AI 工具套進同一套名字。",
162
162
  },
163
163
  {
164
164
  title: "先判斷名字,再決定是否深查",
165
165
  body:
166
- "域名、搜索和商標預篩放在展開後按需觸發,適合早期命名會、產品方向還在變化的階段。",
166
+ "網域名稱、搜尋和商標預篩放在展開後按需觸發,適合早期命名會、產品方向還在變化的階段。",
167
167
  },
168
168
  {
169
169
  title: "邊界清楚,方便複核",
170
170
  body:
171
- "頁面會把域名狀態、商標入口和法律邊界說清楚,讓候選名成為決策起點,而不是冒充最終清關結論。",
171
+ "頁面會把網域名稱狀態、商標入口和法律邊界說清楚,讓候選名成為決策起點,而不是冒充最終清關結論。",
172
172
  },
173
173
  ],
174
174
  strongName: "好產品名的判斷標準",
175
175
  strongNameBullets: [
176
- "可讀可念:團隊、用戶和投資人第一次聽到時不費勁。",
176
+ "可讀可念:團隊、使用者和投資人第一次聽到時不費勁。",
177
177
  "可延展:不鎖死在今天的單一功能,能承載產品線升級。",
178
- "可檢索:品牌搜索、App Store、GitHub、社媒和域名仍有可得空間。",
179
- "可講述:名字背後的隱喻能和產品定位、用戶場景或品牌語氣自然連上。",
178
+ "可檢索:品牌搜尋、App Store、GitHub、社群媒體和網域名稱仍有可得空間。",
179
+ "可講述:名字背後的隱喻能和產品定位、使用者場景或品牌語氣自然連上。",
180
180
  "差異感:與同類軟件、AI 工具或頭部競品在拼寫和讀音上拉開距離。",
181
181
  ],
182
182
  mistakes: "命名時最容易踩的坑",
183
183
  mistakeBullets: [
184
- "把「.com 是否可買」當成唯一標準,忽略目標市場和用戶記憶。",
185
- "一次生成幾十個好聽名字,卻沒有域名、SEO、商標和品類衝突的分層篩選。",
186
- "過早追求抽象高級感,導致用戶不知道產品解決什麼問題。",
184
+ "把「.com 是否可買」當成唯一標準,忽略目標市場和使用者記憶。",
185
+ "一次產生幾十個好聽名字,卻沒有網域名稱、SEO、商標和品類衝突的分層篩選。",
186
+ "過早追求抽象高級感,導致使用者不知道產品解決什麼問題。",
187
187
  "為了包含關鍵詞把名字做得太長,最後既不像品牌,也不利於口頭傳播。",
188
188
  ],
189
189
  useCases: "適合哪些場景",
190
190
  useCaseBullets: [
191
191
  "獨立開發者給新 App、Web 工具、插件或 AI 小產品定名字。",
192
192
  "早期團隊在產品定位還會變化時,先拿到可延展的命名方向。",
193
- "已經有 2-5 個候選名,需要判斷哪個更適合繼續買域名和做品牌。",
194
- "出海產品需要同時考慮英文可讀性、中文語感和全球搜索噪音。",
195
- "產品、設計和增長團隊開命名會前,用同一套標準先生成可討論的短名單。",
193
+ "已經有 2-5 個候選名,需要判斷哪個更適合繼續買網域名稱和做品牌。",
194
+ "出海產品需要同時考慮英文可讀性、中文語感和全球搜尋噪音。",
195
+ "產品、設計和增長團隊開命名會前,用同一套標準先產生可討論的短名單。",
196
196
  ],
197
197
  faq: "常見問題",
198
198
  faqItems: [
199
199
  {
200
- question: "為什麼不一次性返回所有域名和商標分析?",
200
+ question: "為什麼不一次性回傳所有網域名稱和商標分析?",
201
201
  answer:
202
- "命名初期大部分候選會被淘汰。先輕量生成和快篩,再只對用戶點開的名字做深查,可以明顯降低等待時間和不必要的分析成本。",
202
+ "命名初期大部分候選會被淘汰。先輕量產生和快篩,再只對使用者點開的名字做深查,可以明顯降低等待時間和不必要的分析成本。",
203
203
  },
204
204
  {
205
205
  question: "我需要寫很完整的產品定位嗎?",
206
206
  answer:
207
- "不需要。寫清產品做什麼、給誰用、想傳達什麼感覺即可;如果只有粗糙想法,也可以先生成方向,再用候選名反推定位是否清楚。",
207
+ "不需要。寫清產品做什麼、給誰用、想傳達什麼感覺即可;如果只有粗糙想法,也可以先產生方向,再用候選名反推定位是否清楚。",
208
208
  },
209
209
  {
210
- question: "工具會保證域名可以買到嗎?",
210
+ question: "工具會保證網域名稱可以買到嗎?",
211
211
  answer:
212
- "不會。域名狀態來自 RDAP/DNS 等快篩信號,價格和最終可購買性必須以註冊商頁面為準,尤其是溢價域名。",
212
+ "不會。網域名稱狀態來自 RDAP/DNS 等快篩信號,價格和最終可購買性必須以註冊商頁面為準,尤其是溢價網域名稱。",
213
213
  },
214
214
  {
215
215
  question: "商標預篩可以替代律師嗎?",
216
216
  answer:
217
- "不可以。工具會提供官方數據庫入口、搜索查詢和風險提示,但不能給出法律清關結論。正式投入品牌資產前應做專業檢索和法律複核。",
217
+ "不可以。工具會提供官方資料庫入口、搜尋查詢和風險提示,但不能給出法律清關結論。正式投入品牌資產前應做專業檢索和法律複核。",
218
218
  },
219
219
  {
220
220
  question: "已有候選名也能分析嗎?",
221
221
  answer:
222
- "可以。把候選名按行填到表單裡,工具會把它們納入首輪篩選,也會根據產品定位生成相近變體。",
222
+ "可以。把候選名按行填到表單裡,工具會把它們納入首輪篩選,也會根據產品定位產生相近變體。",
223
223
  },
224
224
  {
225
225
  question: "提交的產品想法會如何使用?",
226
226
  answer:
227
- "表單內容會用於生成候選名和深查所需的上下文。不要提交機密源碼、未公開商業秘密、客戶隱私或其他敏感個人信息。",
227
+ "表單內容會用於產生候選名和深查所需的上下文。不要提交機密源碼、未公開商業秘密、客戶隱私或其他敏感個人資訊。",
228
228
  },
229
229
  {
230
- question: "生成的名字可以直接商用嗎?",
230
+ question: "產生的名字可以直接商用嗎?",
231
231
  answer:
232
- "候選名可以作為命名起點,但正式商用前仍要確認域名、應用商店、社媒賬號、商標近似和目標市場語義,必要時請做專業商標檢索。",
232
+ "候選名可以作為命名起點,但正式商用前仍要確認網域名稱、應用程式商店、社群媒體帳號、商標近似和目標市場語義,必要時請做專業商標檢索。",
233
233
  },
234
234
  ],
235
235
  ctaPrimary: "繼續做 GTM 自檢",
236
- ctaSecondary: "返回全部工具",
236
+ ctaSecondary: "回傳全部工具",
237
237
  ctaHint:
238
- "確定候選名後,繼續評估定位、渠道、素材和衡量指標是否準備好上線。",
238
+ "確定候選名後,繼續評估定位、通路、素材和衡量指標是否準備好上線。",
239
239
  visualAlt: {
240
240
  hero: "產品取名器首屏視覺,展示粗略想法被整理成候選方向和檢查信號。",
241
241
  value: "聚焦短名單視覺,展示零散命名想法被篩成少量高質量候選方向。",
242
- checks: "候選名預篩視覺,展示域名、搜索和人工複核等檢查入口。",
242
+ checks: "候選名預篩視覺,展示網域名稱、搜尋和人工複核等檢查入口。",
243
243
  decision: "命名決策包視覺,展示候選方向進入保留、複核和決策流程。",
244
244
  },
245
245
  },
246
246
  widget: {
247
- formTitle: "生成產品名候選",
247
+ formTitle: "產生產品名候選",
248
248
  formHint:
249
- "先生成可評估的候選名;深度查詢留到卡片展開後再做。",
249
+ "先產生可評估的候選名;深度查詢留到卡片展開後再做。",
250
250
  workingNameLabel: "已有產品名或工作名",
251
251
  workingNamePlaceholder: "例如 Kitepath,可留空",
252
252
  descriptionLabel: "產品想法",
253
253
  descriptionPlaceholder:
254
- "描述產品做什麼、給誰用、解決什麼問題。例如:一個幫獨立開發者自動生成上線素材和渠道計劃的 AI 工作臺。",
255
- targetUsersLabel: "目標用戶",
254
+ "描述產品做什麼、給誰用、解決什麼問題。例如:一個幫獨立開發者自動產生上線素材和通路計劃的 AI 工作區。",
255
+ targetUsersLabel: "目標使用者",
256
256
  targetUsersPlaceholder: "例如 獨立開發者、SaaS 創始人、出海小團隊",
257
257
  desiredVibeLabel: "希望傳達的感覺",
258
258
  desiredVibePlaceholder: "例如 清爽、可信、技術感、輕一點、不要太企業",
259
259
  styleLabel: "命名風格",
260
260
  marketLabel: "目標市場 / 語言",
261
261
  marketPlaceholder: "選擇目標市場",
262
- domainLabel: "優先查詢的域名後綴",
263
- domainPlaceholder: "選擇域名後綴",
262
+ domainLabel: "優先查詢的網域名稱後綴",
263
+ domainPlaceholder: "選擇網域名稱後綴",
264
264
  maxPriceLabel: "最高可接受價格(美元)",
265
- countLabel: "返回數量",
266
- advancedLabel: "更多篩選設置",
267
- fallbackLabel: "允許備選組合域名",
265
+ countLabel: "回傳數量",
266
+ advancedLabel: "更多篩選設定",
267
+ fallbackLabel: "允許備選組合網域名稱",
268
268
  fallbackHint: "例如 get + 名稱、try + 名稱、名稱 + app、名稱 + hq。",
269
269
  candidateNamesLabel: "已有候選名",
270
270
  candidateNamesPlaceholder: "每行一個,或用逗號分隔。例如:\nKitepath\nNimbly\nAuralis",
271
271
  optional: "可選",
272
- generateAgent: "開始生成候選名",
273
- generatingAgent: "正在生成候選名",
274
- retryAgent: "重新生成候選名",
272
+ generateAgent: "開始產生候選名",
273
+ generatingAgent: "正在產生候選名",
274
+ retryAgent: "重新產生候選名",
275
275
  reset: "重置",
276
- emptyTitle: "等待生成候選名",
276
+ emptyTitle: "等待產生候選名",
277
277
  emptyHint:
278
- "首輪結果會逐個展示,每張卡片先只放核心理念和基礎信息;域名、SEO、商標預篩在展開後單獨觸發。",
279
- emptyBullets: ["3-5 個候選名", "核心理念與基礎信息", "按需觸發二次深查"],
278
+ "首輪結果會逐個展示,每張卡片先只放核心理念和基礎資訊;網域名稱、SEO、商標預篩在展開後單獨觸發。",
279
+ emptyBullets: ["3-5 個候選名", "核心理念與基礎資訊", "按需觸發二次深查"],
280
280
  workspaceVisualAlt:
281
- "工作臺右側視覺,展示粗略命名輸入被整理成三個候選方向和域名後綴信號。",
282
- loadingTitle: "正在生成與快篩",
281
+ "工作區右側視覺,展示粗略命名輸入被整理成三個候選方向和網域名稱後綴信號。",
282
+ loadingTitle: "正在產生與快篩",
283
283
  loadingStatus: "正在準備候選名短名單",
284
284
  loadingCountdown: "約 1 分鐘內",
285
285
  loadingHint:
286
- "正在根據產品想法生成候選名,並做基礎讀音、長度和域名後綴快篩。首輪不會做完整商標清關。",
286
+ "正在根據產品想法產生候選名,並做基礎讀音、長度和網域名稱後綴快篩。首輪不會做完整商標清關。",
287
287
  loadingSteps: [
288
- "生成命名策略和候選名",
288
+ "產生命名策略和候選名",
289
289
  "運行讀音、長度和基礎品牌篩選",
290
- "只檢查你選擇的域名後綴",
290
+ "只檢查你選擇的網域名稱後綴",
291
291
  "準備可展開的深查入口",
292
292
  ],
293
293
  errorTitle: "暫時沒有拿到取名結果",
@@ -302,14 +302,14 @@ const productNameGenerator = {
302
302
  detailAwaiting: "深查已完成初步分析,正在整理可展示結果。",
303
303
  score: "評分",
304
304
  coreIdea: "核心理念",
305
- basics: "基礎信息",
306
- domains: "域名快照",
305
+ basics: "基礎資訊",
306
+ domains: "網域名稱快照",
307
307
  checks: "快篩維度",
308
- seoDetail: "SEO / 搜索預篩",
308
+ seoDetail: "SEO / 搜尋預篩",
309
309
  trademarkDetail: "商標預篩",
310
310
  risks: "風險提示",
311
311
  nextChecks: "下一步檢查",
312
- openLink: "打開鏈接",
312
+ openLink: "打開連結",
313
313
  taskIdLabel: "任務 ID",
314
314
  styles: {
315
315
  clear: "清晰直接",
@@ -348,34 +348,34 @@ const productNameGenerator = {
348
348
  stages: {
349
349
  unchecked_idea: "未檢查想法",
350
350
  fast_screened: "已快篩",
351
- domain_checked: "已查域名",
351
+ domain_checked: "已查網域名稱",
352
352
  deep_researched: "已深查",
353
353
  },
354
354
  errors: {
355
- required: "請至少填寫產品想法,並選擇目標市場和域名後綴。",
356
- fixFields: "請先修正表單中標註的位置,再生成候選名。",
355
+ required: "請至少填寫產品想法,並選擇目標市場和網域名稱後綴。",
356
+ fixFields: "請先修正表單中標註的位置,再產生候選名。",
357
357
  descriptionRequired: "請先填寫產品想法。",
358
358
  descriptionShort: "產品想法再補充一點點就能開始,至少寫 4 個字。",
359
359
  descriptionMeaningful: "請填寫真實的產品想法,不要只輸入數字或佔位符。",
360
360
  market: "請至少選擇一個目標市場或語言。",
361
- domain: "請至少選擇一個要優先查詢的域名後綴。",
361
+ domain: "請至少選擇一個要優先查詢的網域名稱後綴。",
362
362
  maxPrice: "最高可接受價格需要是 0 到 50000 之間的數字。",
363
363
  candidateNames: "已有候選名太長了,請控制在 500 個字符以內。",
364
364
  copy: "當前瀏覽器無法複製,請稍後重試。",
365
365
  agent:
366
- "取名任務提交或生成失敗。請稍後重試;當前沒有拿到可展示的取名結果。",
366
+ "取名任務提交或產生失敗。請稍後重試;當前沒有拿到可展示的取名結果。",
367
367
  gateway:
368
368
  "在線任務服務暫時不可用,任務沒有創建成功。這不是表單選擇問題,請稍後重試。",
369
369
  noResult:
370
- "取名流程結束後沒有返回可展示的結構化結果。請稍後重試。",
370
+ "取名流程結束後沒有回傳可展示的結構化結果。請稍後重試。",
371
371
  invalidResult:
372
- "返回結果的結構或內容不符合取名器要求。請重新生成。",
372
+ "回傳結果的結構或內容不符合取名器要求。請重新產生。",
373
373
  demoFallbackResult:
374
- "返回的候選名疑似示例或兜底名單,頁面已拒絕展示。請重新生成,或確認遠端取名流程已更新。",
374
+ "回傳的候選名疑似示例或兜底名單,頁面已拒絕展示。請重新產生,或確認遠端取名流程已更新。",
375
375
  noDetail:
376
- "深查任務結束後沒有返回可展示結果。請重試。",
376
+ "深查任務結束後沒有回傳可展示結果。請重試。",
377
377
  invalidDetailResult:
378
- "深查返回內容不符合本工具需要的結構。請重試。",
378
+ "深查回傳內容不符合本工具需要的結構。請重試。",
379
379
  },
380
380
  },
381
381
  } as const;