fix: add Markdown preview option in translation settings (#7250)

This commit is contained in:
自由的世界人 2025-06-17 14:42:27 +08:00 committed by GitHub
parent 763c63841a
commit 66f70e9a13
6 changed files with 36 additions and 6 deletions

View File

@ -1885,7 +1885,8 @@
"model_desc": "Model used for translation service", "model_desc": "Model used for translation service",
"bidirectional": "Bidirectional Translation Settings", "bidirectional": "Bidirectional Translation Settings",
"bidirectional_tip": "When enabled, only bidirectional translation between source and target languages is supported", "bidirectional_tip": "When enabled, only bidirectional translation between source and target languages is supported",
"scroll_sync": "Scroll Sync Settings" "scroll_sync": "Scroll Sync Settings",
"preview": "Markdown Preview"
}, },
"title": "Translation", "title": "Translation",
"tooltip.newline": "Newline", "tooltip.newline": "Newline",

View File

@ -1884,7 +1884,8 @@
"model_desc": "翻訳サービスで使用されるモデル", "model_desc": "翻訳サービスで使用されるモデル",
"bidirectional": "双方向翻訳設定", "bidirectional": "双方向翻訳設定",
"bidirectional_tip": "有効にすると、ソース言語と目標言語間の双方向翻訳のみがサポートされます", "bidirectional_tip": "有効にすると、ソース言語と目標言語間の双方向翻訳のみがサポートされます",
"scroll_sync": "スクロール同期設定" "scroll_sync": "スクロール同期設定",
"preview": "Markdown プレビュー"
}, },
"title": "翻訳", "title": "翻訳",
"tooltip.newline": "改行", "tooltip.newline": "改行",

View File

@ -1883,7 +1883,8 @@
"model_desc": "Модель, используемая для службы перевода", "model_desc": "Модель, используемая для службы перевода",
"bidirectional": "Настройки двунаправленного перевода", "bidirectional": "Настройки двунаправленного перевода",
"scroll_sync": "Настройки синхронизации прокрутки", "scroll_sync": "Настройки синхронизации прокрутки",
"bidirectional_tip": "Если включено, перевод будет выполняться в обоих направлениях, исходный текст будет переведен на целевой язык и наоборот." "bidirectional_tip": "Если включено, перевод будет выполняться в обоих направлениях, исходный текст будет переведен на целевой язык и наоборот.",
"preview": "Markdown предпросмотр"
}, },
"title": "Перевод", "title": "Перевод",
"tooltip.newline": "Перевести", "tooltip.newline": "Перевести",

View File

@ -1887,7 +1887,8 @@
"model_desc": "翻译服务使用的模型", "model_desc": "翻译服务使用的模型",
"bidirectional": "双向翻译设置", "bidirectional": "双向翻译设置",
"bidirectional_tip": "开启后,仅支持在源语言和目标语言之间进行双向翻译", "bidirectional_tip": "开启后,仅支持在源语言和目标语言之间进行双向翻译",
"scroll_sync": "滚动同步设置" "scroll_sync": "滚动同步设置",
"preview": "Markdown 预览"
}, },
"title": "翻译", "title": "翻译",
"tooltip.newline": "换行", "tooltip.newline": "换行",

View File

@ -1884,7 +1884,8 @@
"model_desc": "翻譯服務使用的模型", "model_desc": "翻譯服務使用的模型",
"bidirectional": "雙向翻譯設定", "bidirectional": "雙向翻譯設定",
"bidirectional_tip": "開啟後,僅支援在源語言和目標語言之間進行雙向翻譯", "bidirectional_tip": "開啟後,僅支援在源語言和目標語言之間進行雙向翻譯",
"scroll_sync": "滾動同步設定" "scroll_sync": "滾動同步設定",
"preview": "Markdown 預覽"
}, },
"title": "翻譯", "title": "翻譯",
"tooltip.newline": "換行", "tooltip.newline": "換行",

View File

@ -26,6 +26,7 @@ import { find, isEmpty, sortBy } from 'lodash'
import { HelpCircle, Settings2, TriangleAlert } from 'lucide-react' import { HelpCircle, Settings2, TriangleAlert } from 'lucide-react'
import { FC, useEffect, useMemo, useRef, useState } from 'react' import { FC, useEffect, useMemo, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import ReactMarkdown from 'react-markdown'
import styled from 'styled-components' import styled from 'styled-components'
let _text = '' let _text = ''
@ -39,6 +40,8 @@ const TranslateSettings: FC<{
setIsScrollSyncEnabled: (value: boolean) => void setIsScrollSyncEnabled: (value: boolean) => void
isBidirectional: boolean isBidirectional: boolean
setIsBidirectional: (value: boolean) => void setIsBidirectional: (value: boolean) => void
enableMarkdown: boolean
setEnableMarkdown: (value: boolean) => void
bidirectionalPair: [string, string] bidirectionalPair: [string, string]
setBidirectionalPair: (value: [string, string]) => void setBidirectionalPair: (value: [string, string]) => void
translateModel: Model | undefined translateModel: Model | undefined
@ -52,6 +55,8 @@ const TranslateSettings: FC<{
setIsScrollSyncEnabled, setIsScrollSyncEnabled,
isBidirectional, isBidirectional,
setIsBidirectional, setIsBidirectional,
enableMarkdown,
setEnableMarkdown,
bidirectionalPair, bidirectionalPair,
setBidirectionalPair, setBidirectionalPair,
translateModel, translateModel,
@ -82,6 +87,7 @@ const TranslateSettings: FC<{
setBidirectionalPair(localPair) setBidirectionalPair(localPair)
db.settings.put({ id: 'translate:bidirectional:pair', value: localPair }) db.settings.put({ id: 'translate:bidirectional:pair', value: localPair })
db.settings.put({ id: 'translate:scroll:sync', value: isScrollSyncEnabled }) db.settings.put({ id: 'translate:scroll:sync', value: isScrollSyncEnabled })
db.settings.put({ id: 'translate:markdown:enabled', value: enableMarkdown })
window.message.success({ window.message.success({
content: t('message.save.success.title'), content: t('message.save.success.title'),
key: 'translate-settings-save' key: 'translate-settings-save'
@ -135,6 +141,13 @@ const TranslateSettings: FC<{
</div> </div>
</div> </div>
<div>
<Flex align="center" justify="space-between">
<div style={{ fontWeight: 500 }}>{t('translate.settings.preview')}</div>
<Switch checked={enableMarkdown} onChange={setEnableMarkdown} />
</Flex>
</div>
<div> <div>
<Flex align="center" justify="space-between"> <Flex align="center" justify="space-between">
<div style={{ fontWeight: 500 }}>{t('translate.settings.scroll_sync')}</div> <div style={{ fontWeight: 500 }}>{t('translate.settings.scroll_sync')}</div>
@ -212,6 +225,7 @@ const TranslatePage: FC = () => {
const [historyDrawerVisible, setHistoryDrawerVisible] = useState(false) const [historyDrawerVisible, setHistoryDrawerVisible] = useState(false)
const [isScrollSyncEnabled, setIsScrollSyncEnabled] = useState(false) const [isScrollSyncEnabled, setIsScrollSyncEnabled] = useState(false)
const [isBidirectional, setIsBidirectional] = useState(false) const [isBidirectional, setIsBidirectional] = useState(false)
const [enableMarkdown, setEnableMarkdown] = useState(false)
const [bidirectionalPair, setBidirectionalPair] = useState<[string, string]>(['english', 'chinese']) const [bidirectionalPair, setBidirectionalPair] = useState<[string, string]>(['english', 'chinese'])
const [settingsVisible, setSettingsVisible] = useState(false) const [settingsVisible, setSettingsVisible] = useState(false)
const [detectedLanguage, setDetectedLanguage] = useState<string | null>(null) const [detectedLanguage, setDetectedLanguage] = useState<string | null>(null)
@ -388,6 +402,9 @@ const TranslatePage: FC = () => {
const scrollSyncSetting = await db.settings.get({ id: 'translate:scroll:sync' }) const scrollSyncSetting = await db.settings.get({ id: 'translate:scroll:sync' })
setIsScrollSyncEnabled(scrollSyncSetting ? scrollSyncSetting.value : false) setIsScrollSyncEnabled(scrollSyncSetting ? scrollSyncSetting.value : false)
const markdownSetting = await db.settings.get({ id: 'translate:markdown:enabled' })
setEnableMarkdown(markdownSetting ? markdownSetting.value : false)
}) })
}, []) }, [])
@ -586,7 +603,13 @@ const TranslatePage: FC = () => {
</OperationBar> </OperationBar>
<OutputText ref={outputTextRef} onScroll={handleOutputScroll} className="selectable"> <OutputText ref={outputTextRef} onScroll={handleOutputScroll} className="selectable">
{result || t('translate.output.placeholder')} {!result ? (
t('translate.output.placeholder')
) : enableMarkdown ? (
<ReactMarkdown>{result}</ReactMarkdown>
) : (
result
)}
</OutputText> </OutputText>
</OutputContainer> </OutputContainer>
</ContentContainer> </ContentContainer>
@ -598,6 +621,8 @@ const TranslatePage: FC = () => {
setIsScrollSyncEnabled={setIsScrollSyncEnabled} setIsScrollSyncEnabled={setIsScrollSyncEnabled}
isBidirectional={isBidirectional} isBidirectional={isBidirectional}
setIsBidirectional={toggleBidirectional} setIsBidirectional={toggleBidirectional}
enableMarkdown={enableMarkdown}
setEnableMarkdown={setEnableMarkdown}
bidirectionalPair={bidirectionalPair} bidirectionalPair={bidirectionalPair}
setBidirectionalPair={setBidirectionalPair} setBidirectionalPair={setBidirectionalPair}
translateModel={translateModel} translateModel={translateModel}