diff --git a/src/api/search.ts b/src/api/search.ts index feb2633..e980416 100644 --- a/src/api/search.ts +++ b/src/api/search.ts @@ -69,7 +69,9 @@ export interface VideoParseResult { * @param vndbId VNDB ID (如 "v12345") */ export async function fetchGameVideoUrl(vndbId: string): Promise { - if (!vndbId) return null + if (!vndbId) { + return null + } try { const response = await fetch(getVideoParseApiUrl(), { @@ -790,15 +792,14 @@ const COMBINED_PROMPT = `你是一名专业的视觉小说(Galgame/AVG)本 - 台词:保留情感色彩和语气,注意口语化 【输出格式】 -严格按以下格式输出,使用相同的分隔符: -===SECTION=== +严格按照输入的相同格式输出,使用 ===SECTION=== 分隔三部分: 翻译后的简介 ===SECTION=== 翻译后的标签(每行一个,与输入行数对应) ===SECTION=== 翻译后的台词(每行一条,与输入行数对应) -仅输出翻译结果,无需任何说明` +注意:输出不要以 ===SECTION=== 开头,直接输出翻译内容。仅输出翻译结果,无需任何说明。` /** * AI 翻译文本 @@ -962,7 +963,9 @@ export async function translateAllContent( }) if (!response.ok) { - if (attempt === maxRetries) return result + if (attempt === maxRetries) { + return result + } await new Promise((r) => setTimeout(r, 1000 * (attempt + 1))) continue } @@ -971,8 +974,13 @@ export async function translateAllContent( const content = data.choices?.[0]?.message?.content?.trim() if (content) { - // 解析返回结果 - 保留空字符串以维持索引对应关系 - const parts = content.split(/===SECTION===/).map((s: string) => s.trim()) + // 解析返回结果 + let parts = content.split(/===SECTION===/).map((s: string) => s.trim()) + + // 如果 AI 以 ===SECTION=== 开头,第一个元素会是空字符串,需要过滤掉 + if (parts[0] === '') { + parts = parts.slice(1) + } // 索引 0 = 描述, 索引 1 = 标签, 索引 2 = 名言 if (parts[0] && descText) { @@ -997,7 +1005,9 @@ export async function translateAllContent( return result } catch { - if (attempt === maxRetries) return result + if (attempt === maxRetries) { + return result + } await new Promise((r) => setTimeout(r, 1000 * (attempt + 1))) } } diff --git a/src/components/CommentsModal.vue b/src/components/CommentsModal.vue index a43b49b..82bf69b 100644 --- a/src/components/CommentsModal.vue +++ b/src/components/CommentsModal.vue @@ -29,10 +29,17 @@
-
+
+ +
+
+

+ 评论区 + +

+
-

评论区

@@ -67,7 +74,7 @@ import { watch, onMounted, onUnmounted, nextTick } from 'vue' import { useUIStore } from '@/stores/ui' import { playTransitionUp, playTransitionDown } from '@/composables/useSound' import Artalk from 'artalk/dist/Artalk.mjs' -import { MessageCircle, ChevronLeft, X } from 'lucide-vue-next' +import { MessageCircle, ChevronLeft, X, Sparkles, Send } from 'lucide-vue-next' interface ArtalkInstance { destroy(): void diff --git a/src/components/KeyboardHelpPanel.vue b/src/components/KeyboardHelpPanel.vue index 385ebe9..a2661b7 100644 --- a/src/components/KeyboardHelpPanel.vue +++ b/src/components/KeyboardHelpPanel.vue @@ -42,34 +42,58 @@
-

导航

+

+ + 导航 +

- 关闭当前面板 + + + 关闭当前面板 + Esc
- 返回首页 + + + 返回首页 + H
- 打开/关闭设置 + + + 打开/关闭设置 + ,
- 打开/关闭评论 + + + 打开/关闭评论 + C
- 打开/关闭作品介绍 + + + 打开/关闭作品介绍 + V
- 打开/关闭搜索历史 + + + 打开/关闭搜索历史 + Y
- 站点导航 + + + 站点导航 + N
@@ -77,14 +101,23 @@
-

操作

+

+ + 操作 +

- 聚焦搜索框 + + + 聚焦搜索框 + /
- 显示/隐藏快捷键帮助 + + + 显示/隐藏快捷键帮助 + ?
@@ -92,18 +125,30 @@
-

滚动

+

+ + 滚动 +

- 回到顶部 + + + 回到顶部 + T
- 上一个平台 + + + 上一个平台 + [
- 下一个平台 + + + 下一个平台 + ]
@@ -119,7 +164,12 @@ import { ref } from 'vue' import { useUIStore } from '@/stores/ui' import { playTransitionDown } from '@/composables/useSound' -import { Keyboard, X } from 'lucide-vue-next' +import { + Keyboard, X, + Home, Settings, MessageSquare, BookOpen, History, Grid3x3, Search, HelpCircle, + ArrowUp, ChevronLeft, ChevronRight, + Navigation, Command, Zap, +} from 'lucide-vue-next' const uiStore = useUIStore() const panelRef = ref(null) diff --git a/src/components/ResultItem.vue b/src/components/ResultItem.vue index 284bc6b..ba50b66 100644 --- a/src/components/ResultItem.vue +++ b/src/components/ResultItem.vue @@ -1,5 +1,7 @@