import { useState } from 'react' import { Button, Card, Form, Input, message, Space } from 'antd' import { PageHeader } from '@ant-design/pro-components' import { translateChineseToEnglish } from '@/api/zh-en-translator' const ZhEnTranslator = () => { const [form] = Form.useForm() const [loading, setLoading] = useState(false) const [translationResult, setTranslationResult] = useState('') const [currentInput, setCurrentInput] = useState('') const maxChars = 5000 const handleTranslate = async () => { try { const source_content = form.getFieldValue('source_content') || '' if (!source_content.trim()) { message.warning('请输入要翻译的中文内容') return } setLoading(true) setTranslationResult('') const response = await translateChineseToEnglish(source_content) if (!response.ok) { const errorText = await response.text() throw new Error(`翻译请求失败: ${response.status} ${errorText}`) } if (!response.body) { throw new Error('响应体为空') } const reader = response.body.getReader() const decoder = new TextDecoder('utf-8') let buffer = '' let fullContent = '' try { while (true) { const { done, value } = await reader.read() if (done) break buffer += decoder.decode(value, { stream: true }) const lines = buffer.split('\n') buffer = lines.pop() || '' for (const line of lines) { const trimmedLine = line.trim() if (!trimmedLine || trimmedLine === 'data: [DONE]') { if (trimmedLine === 'data: [DONE]') { message.success('翻译完成') setLoading(false) return } continue } if (trimmedLine.startsWith('data: ')) { try { const data = trimmedLine.slice(6) const parsed = JSON.parse(data) if (parsed.event === 'message' && parsed.answer) { fullContent += parsed.answer setTranslationResult(fullContent) } else if (parsed.event === 'error') { throw new Error(parsed.message || 'Dify API 返回错误') } } catch (parseError) { console.warn('跳过无法解析的行:', trimmedLine) } } } } } finally { reader.releaseLock() } if (fullContent) { message.success('翻译完成') } else { throw new Error('未收到翻译结果') } } catch (error) { console.error('翻译错误:', error) message.error(error instanceof Error ? error.message : '翻译失败,请稍后重试') } finally { setLoading(false) } } const handleClear = () => { form.resetFields() setTranslationResult('') setCurrentInput('') message.info('已清空内容') } const handleCopy = async () => { if (!translationResult) { message.warning('没有可复制的内容') return } try { await navigator.clipboard.writeText(translationResult) message.success('复制成功') } catch (error) { console.error('复制失败:', error) message.error('复制失败,请手动复制') } } return (
中文原文 maxChars ? '#ff4d4f' : '#999' }}> {currentInput.length} / {maxChars}
} rules={[ { required: true, message: '请输入要翻译的中文内容' }, { max: maxChars, message: `输入内容不能超过${maxChars}个字符` } ]} > setCurrentInput(e.target.value)} showCount maxLength={maxChars} style={{ fontSize: '14px' }} /> 复制 ) } >
{loading ? (
正在翻译中,请稍候...
) : translationResult || (
翻译结果将在这里显示
)}
) } export default ZhEnTranslator