From d1cae6c23005ff8ff814801d883255ea8954d1d1 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Sat, 30 Nov 2024 22:33:10 +0800 Subject: [PATCH] feat: auto translate input text --- .../src/components/TranslateButton.tsx | 75 ++++++++++++++++--- src/renderer/src/i18n/locales/en-us.json | 7 +- src/renderer/src/i18n/locales/ru-ru.json | 7 +- src/renderer/src/i18n/locales/zh-cn.json | 7 +- src/renderer/src/i18n/locales/zh-tw.json | 7 +- .../src/pages/home/Inputbar/Inputbar.tsx | 72 +++++++++++++++++- .../src/pages/home/Tabs/SettingsTab.tsx | 16 +++- .../src/pages/paintings/PaintingsPage.tsx | 19 +---- src/renderer/src/services/TranslateService.ts | 15 ++++ src/renderer/src/store/settings.ts | 10 ++- 10 files changed, 194 insertions(+), 41 deletions(-) create mode 100644 src/renderer/src/services/TranslateService.ts diff --git a/src/renderer/src/components/TranslateButton.tsx b/src/renderer/src/components/TranslateButton.tsx index 60f86746cb..6084f6bb15 100644 --- a/src/renderer/src/components/TranslateButton.tsx +++ b/src/renderer/src/components/TranslateButton.tsx @@ -1,27 +1,41 @@ -import { TranslationOutlined } from '@ant-design/icons' +import { LoadingOutlined, TranslationOutlined } from '@ant-design/icons' import { useDefaultModel } from '@renderer/hooks/useAssistant' import { fetchTranslate } from '@renderer/services/ApiService' import { getDefaultTopic, getDefaultTranslateAssistant } from '@renderer/services/AssistantService' import { getUserMessage } from '@renderer/services/MessagesService' -import { Button } from 'antd' -import { FC, useState } from 'react' +import { Button, Tooltip } from 'antd' +import { FC, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' +import styled from 'styled-components' interface Props { text?: string onTranslated: (translatedText: string) => void disabled?: boolean style?: React.CSSProperties + isLoading?: boolean } -const TranslateButton: FC = ({ text, onTranslated, disabled, style }) => { +const TranslateButton: FC = ({ text, onTranslated, disabled, style, isLoading }) => { const { t } = useTranslation() const { translateModel } = useDefaultModel() const [isTranslating, setIsTranslating] = useState(false) + const translateConfirm = () => { + return window?.modal?.confirm({ + title: t('translate.confirm.title'), + content: t('translate.confirm.content'), + centered: true + }) + } + const handleTranslate = async () => { if (!text?.trim()) return + if (!(await translateConfirm())) { + return + } + if (!translateModel) { window.message.error({ content: t('translate.error.not_configured'), @@ -55,16 +69,53 @@ const TranslateButton: FC = ({ text, onTranslated, disabled, style }) => } } + useEffect(() => { + setIsTranslating(isLoading ?? false) + }, [isLoading]) + return ( -