feat: add auto-detect language option and improve translation logic

This commit is contained in:
Pleasurecruise 2025-05-26 16:26:20 +08:00
parent 11d72f14dc
commit 1c337c6898
No known key found for this signature in database
GPG Key ID: E6385136096279B6
8 changed files with 56 additions and 7 deletions

View File

@ -74,7 +74,8 @@ const api = {
selectFolder: () => ipcRenderer.invoke(IpcChannel.File_SelectFolder),
saveImage: (name: string, data: string) => ipcRenderer.invoke(IpcChannel.File_SaveImage, name, data),
base64Image: (fileId: string) => ipcRenderer.invoke(IpcChannel.File_Base64Image, fileId),
download: (url: string, isUseContentType?: boolean) => ipcRenderer.invoke(IpcChannel.File_Download, url, isUseContentType),
download: (url: string, isUseContentType?: boolean) =>
ipcRenderer.invoke(IpcChannel.File_Download, url, isUseContentType),
copy: (fileId: string, destPath: string) => ipcRenderer.invoke(IpcChannel.File_Copy, fileId, destPath),
binaryImage: (fileId: string) => ipcRenderer.invoke(IpcChannel.File_BinaryImage, fileId),
base64File: (fileId: string) => ipcRenderer.invoke(IpcChannel.File_Base64File, fileId),

View File

@ -1,6 +1,18 @@
import i18n from '@renderer/i18n'
export const TranslateLanguageOptions = [
type LanguageOption = {
value: string
label: string
emoji: string
style?: React.CSSProperties
}
export const TranslateLanguageOptions: LanguageOption[] = [
{
value: 'auto-detect',
label: i18n.t('languages.auto-detect'),
emoji: '🌐'
},
{
value: 'english',
label: i18n.t('languages.english'),
@ -63,12 +75,17 @@ export const TranslateLanguageOptions = [
}
]
export const translateLanguageOptions = (): typeof TranslateLanguageOptions => {
export const translateLanguageOptions = (): LanguageOption[] => {
return TranslateLanguageOptions.map((option) => {
return {
value: option.value,
label: i18n.t(`languages.${option.value}`),
emoji: option.emoji
emoji: option.emoji,
style: {
display: 'flex',
alignItems: 'center',
gap: '8px'
}
}
})
}

View File

@ -558,6 +558,7 @@
"dimensions_size_too_large": "The embedding dimension cannot exceed the model's context limit ({{max_context}})."
},
"languages": {
"auto-detect": "Auto Detect",
"arabic": "Arabic",
"chinese": "Chinese",
"chinese-traditional": "Traditional Chinese",

View File

@ -558,6 +558,7 @@
"dimensions_size_too_large": "埋め込み次元はモデルのコンテキスト制限({{max_context}})を超えてはなりません。"
},
"languages": {
"auto-detect": "自動検出",
"arabic": "アラビア語",
"chinese": "中国語",
"chinese-traditional": "繁体字中国語",

View File

@ -558,6 +558,7 @@
"dimensions_size_too_large": "Размерность вложения не может превышать ограничение контекста модели ({{max_context}})"
},
"languages": {
"auto-detect": "Автоопределение",
"arabic": "Арабский",
"chinese": "Китайский",
"chinese-traditional": "Китайский традиционный",

View File

@ -558,6 +558,7 @@
"urls": "网址"
},
"languages": {
"auto-detect": "自动检测",
"arabic": "阿拉伯文",
"chinese": "简体中文",
"chinese-traditional": "繁体中文",

View File

@ -558,6 +558,7 @@
"dimensions_size_too_large": "嵌入維度不能超過模型上下文限制({{max_context}}"
},
"languages": {
"auto-detect": "自動偵測",
"arabic": "阿拉伯文",
"chinese": "簡體中文",
"chinese-traditional": "繁體中文",

View File

@ -5,6 +5,7 @@ import { isLocalAi } from '@renderer/config/env'
import { translateLanguageOptions } from '@renderer/config/translate'
import db from '@renderer/databases'
import { useDefaultModel } from '@renderer/hooks/useAssistant'
import i18n from '@renderer/i18n'
import { fetchTranslate } from '@renderer/services/ApiService'
import { getDefaultTranslateAssistant } from '@renderer/services/AssistantService'
import type { Assistant, TranslateHistory } from '@renderer/types'
@ -83,7 +84,20 @@ const TranslatePage: FC = () => {
return
}
const assistant: Assistant = getDefaultTranslateAssistant(targetLanguage, text)
let assistant: Assistant
if (targetLanguage === 'auto-detect') {
const currentLanguage = i18n.language
const targetLang = currentLanguage === 'en' ? 'Chinese' : 'English'
assistant = {
...getDefaultTranslateAssistant(currentLanguage === 'en' ? 'chinese' : 'english', text),
name: 'Auto Translator',
prompt: `You are a translator. If input is in ${targetLang}, translate to ${currentLanguage === 'en' ? 'English' : 'Chinese'}. Otherwise translate to ${targetLang}. Output translation only. Text: ${text}`
}
} else {
assistant = getDefaultTranslateAssistant(targetLanguage, text)
}
setLoading(true)
let translatedText = ''
@ -342,8 +356,20 @@ const TranslatePage: FC = () => {
db.settings.put({ id: 'translate:target:language', value })
}}
optionRender={(option) => (
<Space>
<span role="img" aria-label={option.data.label}>
<Space align="center">
<span
role="img"
aria-label={option.data.label}
style={{
display: 'inline-flex',
alignItems: 'center',
justifyContent: 'center',
width: '20px',
height: '20px',
fontSize: '16px',
verticalAlign: 'middle',
lineHeight: 1
}}>
{option.data.emoji}
</span>
{option.label}