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", "inputSchema": "Input Schema",
"availableTools": "Available Tools", "availableTools": "Available Tools",
"noToolsAvailable": "No tools available" "noToolsAvailable": "No tools available"
} },
"deleteServer": "Delete Server",
"deleteServerConfirm": "Are you sure you want to delete this server?"
}, },
"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

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

View File

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

View File

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

View File

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

View File

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

View File

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