From d5e8ffc00f2dace0b5a888303ef6f4e5d7e343e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=87=AA=E7=94=B1=E7=9A=84=E4=B8=96=E7=95=8C=E4=BA=BA?= <3196812536@qq.com> Date: Wed, 2 Jul 2025 15:23:58 +0800 Subject: [PATCH] fix: add custom prompt setting for translate model (#7623) * fix: add custom prompt setting for translate model Introduces a UI section in TranslateSettings to allow users to view and edit the custom prompt for the translation model. The prompt is now saved to the database and can be toggled for display in the settings modal. * fix: add reset button for translate prompt and improve prompt editing Introduced a reset button to restore the translate prompt to its default value. Updated the prompt editing area to use local state, improved UI with a rounded Textarea, and ensured prompt changes are dispatched to the store. * refactor: bidirectional settings layout in TranslatePage Removed unnecessary margin and conditional wrapper for the bidirectional settings. The Space component is now only rendered when bidirectional mode is enabled, improving layout clarity and reducing extra DOM nesting. * Update TranslatePage.tsx --- .../src/pages/translate/TranslatePage.tsx | 80 ++++++++++++++++--- 1 file changed, 69 insertions(+), 11 deletions(-) diff --git a/src/renderer/src/pages/translate/TranslatePage.tsx b/src/renderer/src/pages/translate/TranslatePage.tsx index 353f75bf81..8d4e7116b6 100644 --- a/src/renderer/src/pages/translate/TranslatePage.tsx +++ b/src/renderer/src/pages/translate/TranslatePage.tsx @@ -1,16 +1,20 @@ -import { CheckOutlined, DeleteOutlined, HistoryOutlined, SendOutlined } from '@ant-design/icons' +import { CheckOutlined, DeleteOutlined, HistoryOutlined, RedoOutlined, SendOutlined } from '@ant-design/icons' import { Navbar, NavbarCenter } from '@renderer/components/app/Navbar' import CopyIcon from '@renderer/components/Icons/CopyIcon' import { HStack } from '@renderer/components/Layout' import { isEmbeddingModel } from '@renderer/config/models' +import { TRANSLATE_PROMPT } from '@renderer/config/prompts' import { translateLanguageOptions } from '@renderer/config/translate' import { useCodeStyle } from '@renderer/context/CodeStyleProvider' import db from '@renderer/databases' import { useDefaultModel } from '@renderer/hooks/useAssistant' import { useProviders } from '@renderer/hooks/useProvider' +import { useSettings } from '@renderer/hooks/useSettings' import { fetchTranslate } from '@renderer/services/ApiService' import { getDefaultTranslateAssistant } from '@renderer/services/AssistantService' import { getModelUniqId, hasModel } from '@renderer/services/ModelService' +import { useAppDispatch } from '@renderer/store' +import { setTranslateModelPrompt } from '@renderer/store/settings' import type { Model, TranslateHistory } from '@renderer/types' import { runAsyncFunction, uuid } from '@renderer/utils' import { @@ -24,7 +28,7 @@ import TextArea, { TextAreaRef } from 'antd/es/input/TextArea' import dayjs from 'dayjs' import { useLiveQuery } from 'dexie-react-hooks' import { find, isEmpty, sortBy } from 'lodash' -import { HelpCircle, Settings2, TriangleAlert } from 'lucide-react' +import { ChevronDown, HelpCircle, Settings2, TriangleAlert } from 'lucide-react' import { FC, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -65,7 +69,11 @@ const TranslateSettings: FC<{ selectOptions }) => { const { t } = useTranslation() + const { translateModelPrompt } = useSettings() + const dispatch = useAppDispatch() const [localPair, setLocalPair] = useState<[string, string]>(bidirectionalPair) + const [showPrompt, setShowPrompt] = useState(false) + const [localPrompt, setLocalPrompt] = useState(translateModelPrompt) const defaultTranslateModel = useMemo( () => (hasModel(translateModel) ? getModelUniqId(translateModel) : undefined), @@ -74,7 +82,8 @@ const TranslateSettings: FC<{ useEffect(() => { setLocalPair(bidirectionalPair) - }, [bidirectionalPair, visible]) + setLocalPrompt(translateModelPrompt) + }, [bidirectionalPair, translateModelPrompt, visible]) const handleSave = () => { if (localPair[0] === localPair[1]) { @@ -88,6 +97,8 @@ const TranslateSettings: FC<{ db.settings.put({ id: 'translate:bidirectional:pair', value: localPair }) db.settings.put({ id: 'translate:scroll:sync', value: isScrollSyncEnabled }) db.settings.put({ id: 'translate:markdown:enabled', value: enableMarkdown }) + db.settings.put({ id: 'translate:model:prompt', value: localPrompt }) + dispatch(setTranslateModelPrompt(localPrompt)) window.message.success({ content: t('message.save.success.title'), key: 'translate-settings-save' @@ -112,7 +123,14 @@ const TranslateSettings: FC<{ width={420}>
-
{t('translate.settings.model')}
+
+ {t('translate.settings.model')} + + + + + +
+ + )} +
+ +
+ +
setShowPrompt(!showPrompt)}> + {t('settings.models.translate_model_prompt_title')} + +
+ {localPrompt !== TRANSLATE_PROMPT && ( + +
+ +
+