feat(Localization): Add toggle error message for MCP servers across languages

- Update en-us, ja-jp, ru-ru, zh-cn, and zh-tw locale files
- Add 'toggleError' translation key for MCP server settings
- Improve error handling and user feedback for server toggle actions
This commit is contained in:
kangfenmao 2025-03-11 16:46:53 +08:00
parent 67bb1f19f0
commit a25c0e657b
6 changed files with 79 additions and 91 deletions

View File

@ -806,7 +806,8 @@
"title": "MCP Servers", "title": "MCP Servers",
"type": "Type", "type": "Type",
"updateSuccess": "Server updated successfully", "updateSuccess": "Server updated successfully",
"url": "URL" "url": "URL",
"toggleError": "Toggle failed"
}, },
"messages.divider": "Show divider between messages", "messages.divider": "Show divider between messages",
"messages.grid_columns": "Message grid display columns", "messages.grid_columns": "Message grid display columns",

View File

@ -806,7 +806,8 @@
"title": "MCP サーバー", "title": "MCP サーバー",
"type": "タイプ", "type": "タイプ",
"updateSuccess": "サーバーが正常に更新されました", "updateSuccess": "サーバーが正常に更新されました",
"url": "URL" "url": "URL",
"toggleError": "切り替えに失敗しました"
}, },
"messages.divider": "メッセージ間に区切り線を表示", "messages.divider": "メッセージ間に区切り線を表示",
"messages.grid_columns": "メッセージグリッドの表示列数", "messages.grid_columns": "メッセージグリッドの表示列数",

View File

@ -806,7 +806,8 @@
"title": "Серверы MCP", "title": "Серверы MCP",
"type": "Тип", "type": "Тип",
"updateSuccess": "Сервер успешно обновлен", "updateSuccess": "Сервер успешно обновлен",
"url": "URL" "url": "URL",
"toggleError": "Переключение не удалось"
}, },
"messages.divider": "Показывать разделитель между сообщениями", "messages.divider": "Показывать разделитель между сообщениями",
"messages.grid_columns": "Количество столбцов сетки сообщений", "messages.grid_columns": "Количество столбцов сетки сообщений",

View File

@ -806,7 +806,8 @@
"title": "MCP 服务器", "title": "MCP 服务器",
"type": "类型", "type": "类型",
"updateSuccess": "服务器更新成功", "updateSuccess": "服务器更新成功",
"url": "URL" "url": "URL",
"toggleError": "切换失败"
}, },
"messages.divider": "消息分割线", "messages.divider": "消息分割线",
"messages.grid_columns": "消息网格展示列数", "messages.grid_columns": "消息网格展示列数",

View File

@ -806,7 +806,8 @@
"title": "MCP 伺服器", "title": "MCP 伺服器",
"type": "類型", "type": "類型",
"updateSuccess": "伺服器更新成功", "updateSuccess": "伺服器更新成功",
"url": "URL" "url": "URL",
"toggleError": "切換失敗"
}, },
"messages.divider": "訊息間顯示分隔線", "messages.divider": "訊息間顯示分隔線",
"messages.grid_columns": "訊息網格展示列數", "messages.grid_columns": "訊息網格展示列數",

View File

@ -1,7 +1,6 @@
import { DeleteOutlined, EditOutlined, PlusOutlined, QuestionCircleOutlined } from '@ant-design/icons' import { DeleteOutlined, EditOutlined, PlusOutlined, QuestionCircleOutlined } from '@ant-design/icons'
import { useTheme } from '@renderer/context/ThemeProvider' import { useTheme } from '@renderer/context/ThemeProvider'
import { useAppDispatch, useAppSelector } from '@renderer/store' import { useAppSelector } from '@renderer/store'
import { addMCPServer, deleteMCPServer, setMCPServerActive, updateMCPServer } from '@renderer/store/mcp'
import { MCPServer } from '@renderer/types' import { MCPServer } from '@renderer/types'
import { Button, Card, Form, Input, Modal, Radio, Space, Switch, Table, Tag, Tooltip, Typography } from 'antd' import { Button, Card, Form, Input, Modal, Radio, Space, Switch, Table, Tag, Tooltip, Typography } from 'antd'
import TextArea from 'antd/es/input/TextArea' import TextArea from 'antd/es/input/TextArea'
@ -25,7 +24,6 @@ const MCPSettings: FC = () => {
const { t } = useTranslation() const { t } = useTranslation()
const { theme } = useTheme() const { theme } = useTheme()
const { Paragraph, Text } = Typography const { Paragraph, Text } = Typography
const dispatch = useAppDispatch()
const mcpServers = useAppSelector((state) => state.mcp.servers) const mcpServers = useAppSelector((state) => state.mcp.servers)
const [isModalVisible, setIsModalVisible] = useState(false) const [isModalVisible, setIsModalVisible] = useState(false)
@ -78,11 +76,10 @@ const MCPSettings: FC = () => {
form.resetFields() form.resetFields()
} }
const handleSubmit = () => { const handleSubmit = async () => {
setLoading(true) setLoading(true)
form try {
.validateFields() const values = await form.validateFields()
.then((values) => {
const mcpServer: MCPServer = { const mcpServer: MCPServer = {
name: values.name, name: values.name,
description: values.description, description: values.description,
@ -110,19 +107,16 @@ const MCPSettings: FC = () => {
} }
if (editingServer) { if (editingServer) {
window.api.mcp try {
.updateServer(mcpServer) await window.api.mcp.updateServer(mcpServer)
.then(() => {
window.message.success(t('settings.mcp.updateSuccess')) window.message.success(t('settings.mcp.updateSuccess'))
setLoading(false) setLoading(false)
setIsModalVisible(false) setIsModalVisible(false)
form.resetFields() form.resetFields()
}) } catch (error: any) {
.catch((error) => {
window.message.error(`${t('settings.mcp.updateError')}: ${error.message}`) window.message.error(`${t('settings.mcp.updateError')}: ${error.message}`)
setLoading(false) setLoading(false)
}) }
dispatch(updateMCPServer(mcpServer))
} else { } else {
// Check for duplicate name // Check for duplicate name
if (mcpServers.some((server: MCPServer) => server.name === mcpServer.name)) { if (mcpServers.some((server: MCPServer) => server.name === mcpServer.name)) {
@ -131,24 +125,20 @@ const MCPSettings: FC = () => {
return return
} }
window.api.mcp try {
.addServer(mcpServer) await window.api.mcp.addServer(mcpServer)
.then(() => {
dispatch(addMCPServer(mcpServer))
window.message.success(t('settings.mcp.addSuccess')) window.message.success(t('settings.mcp.addSuccess'))
setLoading(false) setLoading(false)
setIsModalVisible(false) setIsModalVisible(false)
form.resetFields() form.resetFields()
}) } catch (error: any) {
.catch((error) => {
window.message.error(`${t('settings.mcp.addError')}: ${error.message}`) window.message.error(`${t('settings.mcp.addError')}: ${error.message}`)
setLoading(false) setLoading(false)
})
} }
}) }
.catch(() => { } catch (error: any) {
setLoading(false) setLoading(false)
}) }
} }
const handleDelete = (serverName: string) => { const handleDelete = (serverName: string) => {
@ -159,30 +149,23 @@ const MCPSettings: FC = () => {
okButtonProps: { danger: true }, okButtonProps: { danger: true },
cancelText: t('common.cancel'), cancelText: t('common.cancel'),
centered: true, centered: true,
onOk: () => { onOk: async () => {
window.api.mcp try {
.deleteServer(serverName) await window.api.mcp.deleteServer(serverName)
.then(() => {
window.message.success(t('settings.mcp.deleteSuccess')) window.message.success(t('settings.mcp.deleteSuccess'))
}) } catch (error: any) {
.catch((error) => {
window.message.error(`${t('settings.mcp.deleteError')}: ${error.message}`) window.message.error(`${t('settings.mcp.deleteError')}: ${error.message}`)
}) }
dispatch(deleteMCPServer(serverName))
} }
}) })
} }
const handleToggleActive = (name: string, isActive: boolean) => { const handleToggleActive = (name: string, isActive: boolean) => {
window.api.mcp try {
.setServerActive(name, isActive) window.api.mcp.setServerActive(name, isActive)
.then(() => { } catch (error: any) {
// Optional: Show success message or update UI
})
.catch((error) => {
window.message.error(`${t('settings.mcp.toggleError')}: ${error.message}`) window.message.error(`${t('settings.mcp.toggleError')}: ${error.message}`)
}) }
dispatch(setMCPServerActive({ name, isActive }))
} }
const columns = [ const columns = [