feat(i18n): add delete server confirmation messages in multiple languages
This commit is contained in:
parent
57ba91072d
commit
11c070a1d7
@ -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",
|
||||||
|
|||||||
@ -1026,7 +1026,9 @@
|
|||||||
"inputSchema": "入力スキーマ",
|
"inputSchema": "入力スキーマ",
|
||||||
"availableTools": "利用可能なツール",
|
"availableTools": "利用可能なツール",
|
||||||
"noToolsAvailable": "利用可能なツールはありません"
|
"noToolsAvailable": "利用可能なツールはありません"
|
||||||
}
|
},
|
||||||
|
"deleteServer": "サーバーを削除",
|
||||||
|
"deleteServerConfirm": "このサーバーを削除してもよろしいですか?"
|
||||||
},
|
},
|
||||||
"messages.divider": "メッセージ間に区切り線を表示",
|
"messages.divider": "メッセージ間に区切り線を表示",
|
||||||
"messages.grid_columns": "メッセージグリッドの表示列数",
|
"messages.grid_columns": "メッセージグリッドの表示列数",
|
||||||
|
|||||||
@ -1026,7 +1026,9 @@
|
|||||||
"inputSchema": "входные параметры",
|
"inputSchema": "входные параметры",
|
||||||
"availableTools": "доступные инструменты",
|
"availableTools": "доступные инструменты",
|
||||||
"noToolsAvailable": "нет доступных инструментов"
|
"noToolsAvailable": "нет доступных инструментов"
|
||||||
}
|
},
|
||||||
|
"deleteServer": "Удалить сервер",
|
||||||
|
"deleteServerConfirm": "Вы уверены, что хотите удалить этот сервер?"
|
||||||
},
|
},
|
||||||
"messages.divider": "Показывать разделитель между сообщениями",
|
"messages.divider": "Показывать разделитель между сообщениями",
|
||||||
"messages.grid_columns": "Количество столбцов сетки сообщений",
|
"messages.grid_columns": "Количество столбцов сетки сообщений",
|
||||||
|
|||||||
@ -1027,7 +1027,9 @@
|
|||||||
"inputSchema": "输入参数",
|
"inputSchema": "输入参数",
|
||||||
"availableTools": "可用工具",
|
"availableTools": "可用工具",
|
||||||
"noToolsAvailable": "没有可用工具"
|
"noToolsAvailable": "没有可用工具"
|
||||||
}
|
},
|
||||||
|
"deleteServer": "删除服务器",
|
||||||
|
"deleteServerConfirm": "确定要删除此服务器吗?"
|
||||||
},
|
},
|
||||||
"messages.divider": "消息分割线",
|
"messages.divider": "消息分割线",
|
||||||
"messages.grid_columns": "消息网格展示列数",
|
"messages.grid_columns": "消息网格展示列数",
|
||||||
|
|||||||
@ -1026,7 +1026,9 @@
|
|||||||
"inputSchema": "輸入參數",
|
"inputSchema": "輸入參數",
|
||||||
"availableTools": "可用工具",
|
"availableTools": "可用工具",
|
||||||
"noToolsAvailable": "沒有可用工具"
|
"noToolsAvailable": "沒有可用工具"
|
||||||
}
|
},
|
||||||
|
"deleteServer": "刪除伺服器",
|
||||||
|
"deleteServerConfirm": "確定要刪除此伺服器嗎?"
|
||||||
},
|
},
|
||||||
"messages.divider": "訊息間顯示分隔線",
|
"messages.divider": "訊息間顯示分隔線",
|
||||||
"messages.grid_columns": "訊息網格展示列數",
|
"messages.grid_columns": "訊息網格展示列數",
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user