feat(i18n): add delete server confirmation messages in multiple languages

This commit is contained in:
kangfenmao 2025-03-29 08:00:51 +08:00
parent 57ba91072d
commit 11c070a1d7
7 changed files with 42 additions and 23 deletions

View File

@ -1027,7 +1027,9 @@
"inputSchema": "Input Schema",
"availableTools": "Available Tools",
"noToolsAvailable": "No tools available"
}
},
"deleteServer": "Delete Server",
"deleteServerConfirm": "Are you sure you want to delete this server?"
},
"messages.divider": "Show divider between messages",
"messages.grid_columns": "Message grid display columns",

View File

@ -1026,7 +1026,9 @@
"inputSchema": "入力スキーマ",
"availableTools": "利用可能なツール",
"noToolsAvailable": "利用可能なツールはありません"
}
},
"deleteServer": "サーバーを削除",
"deleteServerConfirm": "このサーバーを削除してもよろしいですか?"
},
"messages.divider": "メッセージ間に区切り線を表示",
"messages.grid_columns": "メッセージグリッドの表示列数",

View File

@ -1026,7 +1026,9 @@
"inputSchema": "входные параметры",
"availableTools": "доступные инструменты",
"noToolsAvailable": "нет доступных инструментов"
}
},
"deleteServer": "Удалить сервер",
"deleteServerConfirm": "Вы уверены, что хотите удалить этот сервер?"
},
"messages.divider": "Показывать разделитель между сообщениями",
"messages.grid_columns": "Количество столбцов сетки сообщений",

View File

@ -1027,7 +1027,9 @@
"inputSchema": "输入参数",
"availableTools": "可用工具",
"noToolsAvailable": "没有可用工具"
}
},
"deleteServer": "删除服务器",
"deleteServerConfirm": "确定要删除此服务器吗?"
},
"messages.divider": "消息分割线",
"messages.grid_columns": "消息网格展示列数",

View File

@ -1026,7 +1026,9 @@
"inputSchema": "輸入參數",
"availableTools": "可用工具",
"noToolsAvailable": "沒有可用工具"
}
},
"deleteServer": "刪除伺服器",
"deleteServerConfirm": "確定要刪除此伺服器嗎?"
},
"messages.divider": "訊息間顯示分隔線",
"messages.grid_columns": "訊息網格展示列數",

View File

@ -1,3 +1,4 @@
import { DeleteOutlined, SaveOutlined } from '@ant-design/icons'
import { useMCPServers } from '@renderer/hooks/useMCPServers'
import { MCPServer, MCPTool } from '@renderer/types'
import { Button, Flex, Form, Input, Radio, Switch } from 'antd'
@ -159,9 +160,16 @@ const McpSettings: React.FC<Props> = ({ server }) => {
const onDeleteMcpServer = useCallback(
async (server: MCPServer) => {
try {
await window.api.mcp.removeServer(server)
deleteMCPServer(server.id)
window.message.success({ content: t('settings.mcp.deleteSuccess'), key: 'mcp-list' })
window.modal.confirm({
title: t('settings.mcp.deleteServer'),
content: t('settings.mcp.deleteServerConfirm'),
centered: true,
onOk: async () => {
await window.api.mcp.removeServer(server)
deleteMCPServer(server.id)
window.message.success({ content: t('settings.mcp.deleteSuccess'), key: 'mcp-list' })
}
})
} catch (error: any) {
window.message.error({
content: `${t('settings.mcp.deleteError')}: ${error.message}`,
@ -214,7 +222,10 @@ const McpSettings: React.FC<Props> = ({ server }) => {
<SettingContainer>
<SettingGroup style={{ marginBottom: 0 }}>
<SettingTitle>
<ServerName>{server?.name}</ServerName>
<Flex justify="space-between" align="center" gap={5} style={{ marginRight: 10 }}>
<ServerName className="text-nowrap">{server?.name}</ServerName>
<Button danger icon={<DeleteOutlined />} type="text" onClick={() => onDeleteMcpServer(server)} />
</Flex>
<Flex align="center" gap={16}>
<Switch
value={server.isActive}
@ -222,12 +233,9 @@ const McpSettings: React.FC<Props> = ({ server }) => {
loading={loadingServer === server.id}
onChange={onToggleActive}
/>
<Button type="primary" size="small" onClick={onSave} loading={loading} disabled={!isFormChanged}>
<Button type="primary" icon={<SaveOutlined />} onClick={onSave} loading={loading} disabled={!isFormChanged}>
{t('common.save')}
</Button>
<Button danger type="primary" size="small" onClick={() => onDeleteMcpServer(server)} loading={loading}>
{t('common.delete')}
</Button>
</Flex>
</SettingTitle>
<SettingDivider />
@ -288,7 +296,6 @@ const McpSettings: React.FC<Props> = ({ server }) => {
</>
)}
</Form>
{server.isActive && <MCPToolsSection tools={tools} />}
</SettingGroup>
</SettingContainer>

View File

@ -39,8 +39,10 @@ const NpxSearch: FC = () => {
_searchResults = searchResults
// Add new function to handle npm scope search
const handleNpmSearch = async () => {
if (!npmScope.trim()) {
const handleNpmSearch = async (scopeOverride?: string) => {
const searchScope = scopeOverride || npmScope
console.log('handleNpmSearch', searchScope)
if (!searchScope.trim()) {
window.message.warning({ content: t('settings.mcp.npx_list.scope_required'), key: 'mcp-npx-scope-required' })
return
}
@ -53,7 +55,7 @@ const NpxSearch: FC = () => {
try {
// Call npxFinder to search for packages
const packages = await npxFinder(npmScope)
const packages = await npxFinder(searchScope)
// Map the packages to our desired format
const formattedResults = packages.map((pkg) => {
@ -74,6 +76,8 @@ const NpxSearch: FC = () => {
window.message.info({ content: t('settings.mcp.npx_list.no_packages'), key: 'mcp-npx-no-packages' })
}
} catch (error: unknown) {
setSearchResults([])
_searchResults = []
if (error instanceof Error) {
window.message.error({
content: `${t('settings.mcp.npx_list.search_error')}: ${error.message}`,
@ -101,9 +105,9 @@ const NpxSearch: FC = () => {
placeholder={t('settings.mcp.npx_list.scope_placeholder')}
value={npmScope}
onChange={(e) => setNpmScope(e.target.value)}
onPressEnter={handleNpmSearch}
onPressEnter={() => handleNpmSearch(npmScope)}
/>
<Button icon={<SearchOutlined />} onClick={handleNpmSearch} disabled={searchLoading}>
<Button icon={<SearchOutlined />} onClick={() => handleNpmSearch(npmScope)} disabled={searchLoading}>
{t('settings.mcp.npx_list.search')}
</Button>
</Space.Compact>
@ -112,10 +116,8 @@ const NpxSearch: FC = () => {
<Tag
key={scope}
onClick={() => {
if (!searchLoading) {
setNpmScope(scope)
setTimeout(handleNpmSearch, 100)
}
setNpmScope(scope)
handleNpmSearch(scope)
}}
style={{ cursor: searchLoading ? 'not-allowed' : 'pointer' }}>
{scope}