diff --git a/lang-zh-CN.png b/lang-zh-CN.png new file mode 100644 index 0000000..8f3f7f0 Binary files /dev/null and b/lang-zh-CN.png differ diff --git a/main.js b/main.js index 6b57f35..a306b88 100644 --- a/main.js +++ b/main.js @@ -9,6 +9,68 @@ let mainWindow let tray const isDev = process.argv.includes('--dev') +// 主进程翻译 +const trayTranslations = { + 'zh-CN': { + showWindow: '显示主窗口', + switchApiConfig: '切换 API 配置', + exit: '退出', + tooltip: 'iFlow 设置编辑器' + }, + 'en-US': { + showWindow: 'Show Window', + switchApiConfig: 'Switch API Config', + exit: 'Exit', + tooltip: 'iFlow Settings Editor' + }, + 'ja-JP': { + showWindow: 'メインウィンドウを表示', + switchApiConfig: 'API 設定切替', + exit: '終了', + tooltip: 'iFlow 設定エディタ' + } +} + +function getTrayTranslation() { + const settings = readSettings() + const lang = settings?.language || 'zh-CN' + return trayTranslations[lang] || trayTranslations['zh-CN'] +} + +// 错误消息翻译 +const errorTranslations = { + 'zh-CN': { + configNotFound: '配置文件不存在', + configNotExist: '配置 "{name}" 不存在', + configAlreadyExists: '配置 "{name}" 已存在', + cannotDeleteDefault: '不能删除默认配置', + cannotRenameDefault: '不能重命名默认配置', + switchFailed: '切换API配置失败' + }, + 'en-US': { + configNotFound: 'Configuration file not found', + configNotExist: 'Configuration "{name}" does not exist', + configAlreadyExists: 'Configuration "{name}" already exists', + cannotDeleteDefault: 'Cannot delete default configuration', + cannotRenameDefault: 'Cannot rename default configuration', + switchFailed: 'Failed to switch API configuration' + }, + 'ja-JP': { + configNotFound: '設定ファイルが存在しません', + configNotExist: 'プロファイル "{name}" が存在しません', + configAlreadyExists: 'プロファイル "{name}" が既に存在します', + cannotDeleteDefault: 'デフォルトプロファイルは削除できません', + cannotRenameDefault: 'デフォルトプロファイルは名前変更できません', + switchFailed: 'API 設定の切替に失敗しました' + } +} + +function getErrorTranslation() { + const settings = readSettings() + const lang = settings?.language || 'zh-CN' + return errorTranslations[lang] || errorTranslations['zh-CN'] +} + // 创建系统托盘 function createTray() { // 获取图标路径 - 打包后需要从 extraResources 获取 @@ -30,7 +92,7 @@ function createTray() { trayIcon = trayIcon.resize({ width: 16, height: 16 }) tray = new Tray(trayIcon) - tray.setToolTip('iFlow 设置编辑器') + tray.setToolTip(getTrayTranslation().tooltip) updateTrayMenu() @@ -59,9 +121,10 @@ function updateTrayMenu() { click: () => switchApiProfileFromTray(name) })) + const t = getTrayTranslation() const contextMenu = Menu.buildFromTemplate([ { - label: '显示主窗口', + label: t.showWindow, click: () => { if (mainWindow) { mainWindow.show() @@ -71,12 +134,12 @@ function updateTrayMenu() { }, { type: 'separator' }, { - label: '切换 API 配置', + label: t.switchApiConfig, submenu: profileMenuItems }, { type: 'separator' }, { - label: '退出', + label: t.exit, click: () => { app.isQuitting = true app.quit() @@ -198,6 +261,10 @@ ipcMain.on('window-close', () => { } }) ipcMain.handle('is-maximized', () => mainWindow.isMaximized()) +// 监听语言切换以更新托盘菜单 +ipcMain.on('language-changed', () => { + updateTrayMenu() +}) // API 配置相关的字段 const API_FIELDS = ['selectedAuthType', 'apiKey', 'baseUrl', 'modelName', 'searchApiKey', 'cna'] // 读取设置文件 @@ -245,12 +312,13 @@ ipcMain.handle('list-api-profiles', async () => { ipcMain.handle('switch-api-profile', async (event, profileName) => { try { const settings = readSettings() + const t = getErrorTranslation() if (!settings) { - return { success: false, error: '配置文件不存在' } + return { success: false, error: t.configNotFound } } const profiles = settings.apiProfiles || {} if (!profiles[profileName]) { - return { success: false, error: `配置 "${profileName}" 不存在` } + return { success: false, error: t.configNotExist.replace('{name}', profileName) } } // 保存当前配置到 apiProfiles(如果当前配置存在) const currentProfile = settings.currentApiProfile || 'default' @@ -282,8 +350,9 @@ ipcMain.handle('switch-api-profile', async (event, profileName) => { ipcMain.handle('create-api-profile', async (event, name) => { try { const settings = readSettings() + const t = getErrorTranslation() if (!settings) { - return { success: false, error: '配置文件不存在' } + return { success: false, error: t.configNotFound } } if (!settings.apiProfiles) { settings.apiProfiles = { default: {} } @@ -295,7 +364,7 @@ ipcMain.handle('create-api-profile', async (event, name) => { } } if (settings.apiProfiles[name]) { - return { success: false, error: `配置 "${name}" 已存在` } + return { success: false, error: t.configAlreadyExists.replace('{name}', name) } } // 复制当前配置到新配置 const newConfig = {} @@ -315,15 +384,16 @@ ipcMain.handle('create-api-profile', async (event, name) => { ipcMain.handle('delete-api-profile', async (event, name) => { try { const settings = readSettings() + const t = getErrorTranslation() if (!settings) { - return { success: false, error: '配置文件不存在' } + return { success: false, error: t.configNotFound } } if (name === 'default') { - return { success: false, error: '不能删除默认配置' } + return { success: false, error: t.cannotDeleteDefault } } const profiles = settings.apiProfiles || {} if (!profiles[name]) { - return { success: false, error: `配置 "${name}" 不存在` } + return { success: false, error: t.configNotExist.replace('{name}', name) } } delete profiles[name] settings.apiProfiles = profiles @@ -348,18 +418,19 @@ ipcMain.handle('delete-api-profile', async (event, name) => { ipcMain.handle('rename-api-profile', async (event, oldName, newName) => { try { const settings = readSettings() + const t = getErrorTranslation() if (!settings) { - return { success: false, error: '配置文件不存在' } + return { success: false, error: t.configNotFound } } if (oldName === 'default') { - return { success: false, error: '不能重命名默认配置' } + return { success: false, error: t.cannotRenameDefault } } const profiles = settings.apiProfiles || {} if (!profiles[oldName]) { - return { success: false, error: `配置 "${oldName}" 不存在` } + return { success: false, error: t.configNotExist.replace('{name}', oldName) } } if (profiles[newName]) { - return { success: false, error: `配置 "${newName}" 已存在` } + return { success: false, error: t.configAlreadyExists.replace('{name}', newName) } } profiles[newName] = profiles[oldName] delete profiles[oldName] @@ -377,15 +448,16 @@ ipcMain.handle('rename-api-profile', async (event, oldName, newName) => { ipcMain.handle('duplicate-api-profile', async (event, sourceName, newName) => { try { const settings = readSettings() + const t = getErrorTranslation() if (!settings) { - return { success: false, error: '配置文件不存在' } + return { success: false, error: t.configNotFound } } const profiles = settings.apiProfiles || {} if (!profiles[sourceName]) { - return { success: false, error: `配置 "${sourceName}" 不存在` } + return { success: false, error: t.configNotExist.replace('{name}', sourceName) } } if (profiles[newName]) { - return { success: false, error: `配置 "${newName}" 已存在` } + return { success: false, error: t.configAlreadyExists.replace('{name}', newName) } } // 深拷贝配置 profiles[newName] = JSON.parse(JSON.stringify(profiles[sourceName])) diff --git a/package-lock.json b/package-lock.json index 18e2481..b3d9d29 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,16 @@ { "name": "iflow-settings-editor", - "version": "1.0.0", + "version": "1.5.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "iflow-settings-editor", - "version": "1.0.0", + "version": "1.5.1", "license": "MIT", + "dependencies": { + "vue-i18n": "^9.14.5" + }, "devDependencies": { "@icon-park/vue-next": "^1.4.2", "@vitejs/plugin-vue": "^6.0.6", @@ -22,7 +25,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -32,7 +34,6 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -42,7 +43,6 @@ "version": "7.29.2", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.29.0" @@ -68,7 +68,6 @@ "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -417,6 +416,50 @@ "vue": "3.x" } }, + "node_modules/@intlify/core-base": { + "version": "9.14.5", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.14.5.tgz", + "integrity": "sha512-5ah5FqZG4pOoHjkvs8mjtv+gPKYU0zCISaYNjBNNqYiaITxW8ZtVih3GS/oTOqN8d9/mDLyrjD46GBApNxmlsA==", + "license": "MIT", + "dependencies": { + "@intlify/message-compiler": "9.14.5", + "@intlify/shared": "9.14.5" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "9.14.5", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.14.5.tgz", + "integrity": "sha512-IHzgEu61/YIpQV5Pc3aRWScDcnFKWvQA9kigcINcCBXN8mbW+vk9SK+lDxA6STzKQsVJxUPg9ACC52pKKo3SVQ==", + "license": "MIT", + "dependencies": { + "@intlify/shared": "9.14.5", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/shared": { + "version": "9.14.5", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.14.5.tgz", + "integrity": "sha512-9gB+E53BYuAEMhbCAxVgG38EZrk59sxBtv3jSizNL2hEWlgjBjAw1AwpLHtNaeda12pe6W20OGEa0TwuMSRbyQ==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -524,7 +567,6 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, "license": "MIT" }, "node_modules/@malept/cross-spawn-promise": { @@ -1085,7 +1127,6 @@ "version": "3.5.32", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.32.tgz", "integrity": "sha512-4x74Tbtqnda8s/NSD6e1Dr5p1c8HdMU5RWSjMSUzb8RTcUQqevDCxVAitcLBKT+ie3o0Dl9crc/S/opJM7qBGQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.29.2", @@ -1099,7 +1140,6 @@ "version": "3.5.32", "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.32.tgz", "integrity": "sha512-ybHAu70NtiEI1fvAUz3oXZqkUYEe5J98GjMDpTGl5iHb0T15wQYLR4wE3h9xfuTNA+Cm2f4czfe8B4s+CCH57Q==", - "dev": true, "license": "MIT", "dependencies": { "@vue/compiler-core": "3.5.32", @@ -1110,7 +1150,6 @@ "version": "3.5.32", "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.32.tgz", "integrity": "sha512-8UYUYo71cP/0YHMO814TRZlPuUUw3oifHuMR7Wp9SNoRSrxRQnhMLNlCeaODNn6kNTJsjFoQ/kqIj4qGvya4Xg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.29.2", @@ -1128,18 +1167,22 @@ "version": "3.5.32", "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.32.tgz", "integrity": "sha512-Gp4gTs22T3DgRotZ8aA/6m2jMR+GMztvBXUBEUOYOcST+giyGWJ4WvFd7QLHBkzTxkfOt8IELKNdpzITLbA2rw==", - "dev": true, "license": "MIT", "dependencies": { "@vue/compiler-dom": "3.5.32", "@vue/shared": "3.5.32" } }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, "node_modules/@vue/reactivity": { "version": "3.5.32", "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.32.tgz", "integrity": "sha512-/ORasxSGvZ6MN5gc+uE364SxFdJ0+WqVG0CENXaGW58TOCdrAW76WWaplDtECeS1qphvtBZtR+3/o1g1zL4xPQ==", - "dev": true, "license": "MIT", "dependencies": { "@vue/shared": "3.5.32" @@ -1149,7 +1192,6 @@ "version": "3.5.32", "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.32.tgz", "integrity": "sha512-pDrXCejn4UpFDFmMd27AcJEbHaLemaE5o4pbb7sLk79SRIhc6/t34BQA7SGNgYtbMnvbF/HHOftYBgFJtUoJUQ==", - "dev": true, "license": "MIT", "dependencies": { "@vue/reactivity": "3.5.32", @@ -1160,7 +1202,6 @@ "version": "3.5.32", "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.32.tgz", "integrity": "sha512-1CDVv7tv/IV13V8Nip1k/aaObVbWqRlVCVezTwx3K07p7Vxossp5JU1dcPNhJk3w347gonIUT9jQOGutyJrSVQ==", - "dev": true, "license": "MIT", "dependencies": { "@vue/reactivity": "3.5.32", @@ -1173,7 +1214,6 @@ "version": "3.5.32", "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.32.tgz", "integrity": "sha512-IOjm2+JQwRFS7W28HNuJeXQle9KdZbODFY7hFGVtnnghF51ta20EWAZJHX+zLGtsHhaU6uC9BGPV52KVpYryMQ==", - "dev": true, "license": "MIT", "dependencies": { "@vue/compiler-ssr": "3.5.32", @@ -1187,7 +1227,6 @@ "version": "3.5.32", "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.32.tgz", "integrity": "sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg==", - "dev": true, "license": "MIT" }, "node_modules/@xmldom/xmldom": { @@ -2107,7 +2146,6 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, "license": "MIT" }, "node_modules/date-fns": { @@ -2654,7 +2692,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -2765,7 +2802,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, "license": "MIT" }, "node_modules/extract-zip": { @@ -3920,7 +3956,6 @@ "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" @@ -4080,7 +4115,6 @@ "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, "funding": [ { "type": "github", @@ -4220,7 +4254,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { @@ -4255,7 +4288,6 @@ "version": "8.5.9", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.9.tgz", "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==", - "dev": true, "funding": [ { "type": "opencollective", @@ -4702,7 +4734,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -5009,7 +5040,7 @@ "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -5159,7 +5190,6 @@ "version": "3.5.32", "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.32.tgz", "integrity": "sha512-vM4z4Q9tTafVfMAK7IVzmxg34rSzTFMyIe0UUEijUCkn9+23lj0WRfA83dg7eQZIUlgOSGrkViIaCfqSAUXsMw==", - "dev": true, "license": "MIT", "dependencies": { "@vue/compiler-dom": "3.5.32", @@ -5177,6 +5207,27 @@ } } }, + "node_modules/vue-i18n": { + "version": "9.14.5", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.14.5.tgz", + "integrity": "sha512-0jQ9Em3ymWngyiIkj0+c/k7WgaPO+TNzjKSNq9BvBQaKJECqn9cd9fL4tkDhB5G1QBskGl9YxxbDAhgbFtpe2g==", + "deprecated": "v9 and v10 no longer supported. please migrate to v11. about maintenance status, see https://vue-i18n.intlify.dev/guide/maintenance.html", + "license": "MIT", + "dependencies": { + "@intlify/core-base": "9.14.5", + "@intlify/shared": "9.14.5", + "@vue/devtools-api": "^6.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index af114ec..b6b3fab 100644 --- a/package.json +++ b/package.json @@ -91,5 +91,8 @@ "electron-builder": "^24.13.3", "vite": "^8.0.8", "vue": "^3.4.0" + }, + "dependencies": { + "vue-i18n": "^9.14.5" } } diff --git a/preload.js b/preload.js index 96ba334..4f3a38b 100644 --- a/preload.js +++ b/preload.js @@ -23,5 +23,10 @@ contextBridge.exposeInMainWorld('electronAPI', { // 托盘事件监听 onApiProfileSwitched: (callback) => { ipcRenderer.on('api-profile-switched', (event, profileName) => callback(profileName)) + }, + + // 语言切换通知 + notifyLanguageChanged: () => { + ipcRenderer.send('language-changed') } }) \ No newline at end of file diff --git a/src/App.vue b/src/App.vue index 420f588..6ca3a6e 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,17 +1,17 @@
-
暂无 MCP 服务器
-
点击上方按钮添加第一个服务器
+
{{ $t('mcp.noServers') }}
+
{{ $t('mcp.addFirstServer') }}
@@ -177,7 +177,7 @@ @@ -187,8 +187,8 @@
{{ showInputDialog.placeholder }}
- - + +
@@ -197,8 +197,8 @@
- - 新建 API 配置 + + {{ $t('api.createTitle') }}
- - + +
- +
- - + +
- - + +
- - + +
- - + +
- - + +
- - + +
@@ -255,7 +255,7 @@
- 编辑 API 配置 + {{ $t('api.editTitle') }}
- +
- - + +
- - + +
- - + +
- - + +
- - + +
- - + +
@@ -308,7 +308,7 @@
- {{ isEditingServer ? '编辑服务器' : '添加服务器' }} + {{ isEditingServer ? $t('mcp.editServer') : $t('mcp.addServer') }}
- - + +
- - + +
- - + +
- - + +
- - + +
- - + +
@@ -384,7 +384,7 @@
{{ showMessageDialog.title }}
{{ showMessageDialog.message }}
- +
@@ -392,7 +392,9 @@