mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2025-12-27 21:01:32 +08:00
feat: add auto-detect language option and improve translation logic
This commit is contained in:
parent
11d72f14dc
commit
1c337c6898
@ -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),
|
||||
|
||||
@ -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'
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -558,6 +558,7 @@
|
||||
"dimensions_size_too_large": "埋め込み次元はモデルのコンテキスト制限({{max_context}})を超えてはなりません。"
|
||||
},
|
||||
"languages": {
|
||||
"auto-detect": "自動検出",
|
||||
"arabic": "アラビア語",
|
||||
"chinese": "中国語",
|
||||
"chinese-traditional": "繁体字中国語",
|
||||
|
||||
@ -558,6 +558,7 @@
|
||||
"dimensions_size_too_large": "Размерность вложения не может превышать ограничение контекста модели ({{max_context}})"
|
||||
},
|
||||
"languages": {
|
||||
"auto-detect": "Автоопределение",
|
||||
"arabic": "Арабский",
|
||||
"chinese": "Китайский",
|
||||
"chinese-traditional": "Китайский традиционный",
|
||||
|
||||
@ -558,6 +558,7 @@
|
||||
"urls": "网址"
|
||||
},
|
||||
"languages": {
|
||||
"auto-detect": "自动检测",
|
||||
"arabic": "阿拉伯文",
|
||||
"chinese": "简体中文",
|
||||
"chinese-traditional": "繁体中文",
|
||||
|
||||
@ -558,6 +558,7 @@
|
||||
"dimensions_size_too_large": "嵌入維度不能超過模型上下文限制({{max_context}})"
|
||||
},
|
||||
"languages": {
|
||||
"auto-detect": "自動偵測",
|
||||
"arabic": "阿拉伯文",
|
||||
"chinese": "簡體中文",
|
||||
"chinese-traditional": "繁體中文",
|
||||
|
||||
@ -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}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user