fix(mcp): improve error message internationalization
- Add translateMcpBackendError utility to map backend errors to i18n keys - Update error handling in McpPanel, McpFormModal, and McpWizardModal - Internationalize stdio/http type selectors in Wizard - Implement three-tier fallback strategy: translation → raw error → default message - No backend changes required, fully frontend-based i18n implementation
This commit is contained in:
@@ -389,7 +389,11 @@ export default function SettingsModal({
|
||||
const filePath = await window.api.saveFileDialog(defaultName);
|
||||
|
||||
if (!filePath) {
|
||||
onNotify?.(`${t("settings.exportFailed")}: ${t("settings.selectFileFailed")}`, "error", 4000);
|
||||
onNotify?.(
|
||||
`${t("settings.exportFailed")}: ${t("settings.selectFileFailed")}`,
|
||||
"error",
|
||||
4000,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,10 @@ import { McpServer } from "../../types";
|
||||
import { mcpPresets } from "../../config/mcpPresets";
|
||||
import { buttonStyles, inputStyles } from "../../lib/styles";
|
||||
import McpWizardModal from "./McpWizardModal";
|
||||
import { extractErrorMessage } from "../../utils/errorUtils";
|
||||
import {
|
||||
extractErrorMessage,
|
||||
translateMcpBackendError,
|
||||
} from "../../utils/errorUtils";
|
||||
import { AppType } from "../../lib/tauri-api";
|
||||
import {
|
||||
validateToml,
|
||||
@@ -335,8 +338,9 @@ const McpFormModal: React.FC<McpFormModalProps> = ({
|
||||
await onSave(formId.trim(), server);
|
||||
} catch (error: any) {
|
||||
const detail = extractErrorMessage(error);
|
||||
const msg = detail || t("mcp.error.saveFailed");
|
||||
onNotify?.(msg, "error", detail ? 6000 : 4000);
|
||||
const mapped = translateMcpBackendError(detail, t);
|
||||
const msg = mapped || detail || t("mcp.error.saveFailed");
|
||||
onNotify?.(msg, "error", mapped || detail ? 6000 : 4000);
|
||||
} finally {
|
||||
setSaving(false);
|
||||
}
|
||||
|
||||
@@ -5,7 +5,10 @@ import { McpServer } from "../../types";
|
||||
import McpListItem from "./McpListItem";
|
||||
import McpFormModal from "./McpFormModal";
|
||||
import { ConfirmDialog } from "../ConfirmDialog";
|
||||
import { extractErrorMessage } from "../../utils/errorUtils";
|
||||
import {
|
||||
extractErrorMessage,
|
||||
translateMcpBackendError,
|
||||
} from "../../utils/errorUtils";
|
||||
// 预设相关逻辑已迁移到“新增 MCP”面板,列表此处无需引用
|
||||
import { buttonStyles } from "../../lib/styles";
|
||||
import { AppType } from "../../lib/tauri-api";
|
||||
@@ -89,10 +92,11 @@ const McpPanel: React.FC<McpPanelProps> = ({ onClose, onNotify, appType }) => {
|
||||
// 失败时回滚
|
||||
setServers(previousServers);
|
||||
const detail = extractErrorMessage(e);
|
||||
const mapped = translateMcpBackendError(detail, t);
|
||||
onNotify?.(
|
||||
detail || t("mcp.error.saveFailed"),
|
||||
mapped || detail || t("mcp.error.saveFailed"),
|
||||
"error",
|
||||
detail ? 6000 : 5000,
|
||||
mapped || detail ? 6000 : 5000,
|
||||
);
|
||||
}
|
||||
};
|
||||
@@ -120,10 +124,11 @@ const McpPanel: React.FC<McpPanelProps> = ({ onClose, onNotify, appType }) => {
|
||||
onNotify?.(t("mcp.msg.deleted"), "success", 1500);
|
||||
} catch (e: any) {
|
||||
const detail = extractErrorMessage(e);
|
||||
const mapped = translateMcpBackendError(detail, t);
|
||||
onNotify?.(
|
||||
detail || t("mcp.error.deleteFailed"),
|
||||
mapped || detail || t("mcp.error.deleteFailed"),
|
||||
"error",
|
||||
detail ? 6000 : 5000,
|
||||
mapped || detail ? 6000 : 5000,
|
||||
);
|
||||
}
|
||||
},
|
||||
@@ -139,10 +144,11 @@ const McpPanel: React.FC<McpPanelProps> = ({ onClose, onNotify, appType }) => {
|
||||
onNotify?.(t("mcp.msg.saved"), "success", 1500);
|
||||
} catch (e: any) {
|
||||
const detail = extractErrorMessage(e);
|
||||
const mapped = translateMcpBackendError(detail, t);
|
||||
onNotify?.(
|
||||
detail || t("mcp.error.saveFailed"),
|
||||
mapped || detail || t("mcp.error.saveFailed"),
|
||||
"error",
|
||||
detail ? 6000 : 5000,
|
||||
mapped || detail ? 6000 : 5000,
|
||||
);
|
||||
// 继续抛出错误,让表单层可以给到直观反馈(避免被更高层遮挡)
|
||||
throw e;
|
||||
|
||||
@@ -227,7 +227,7 @@ const McpWizardModal: React.FC<McpWizardModalProps> = ({
|
||||
className="w-4 h-4 text-emerald-500 bg-white dark:bg-gray-800 border-gray-200 dark:border-gray-700 focus:ring-emerald-500 dark:focus:ring-emerald-400 focus:ring-2"
|
||||
/>
|
||||
<span className="text-sm text-gray-900 dark:text-gray-100">
|
||||
stdio
|
||||
{t("mcp.wizard.typeStdio")}
|
||||
</span>
|
||||
</label>
|
||||
<label className="inline-flex items-center gap-2 cursor-pointer">
|
||||
@@ -241,7 +241,7 @@ const McpWizardModal: React.FC<McpWizardModalProps> = ({
|
||||
className="w-4 h-4 text-emerald-500 bg-white dark:bg-gray-800 border-gray-200 dark:border-gray-700 focus:ring-emerald-500 dark:focus:ring-emerald-400 focus:ring-2"
|
||||
/>
|
||||
<span className="text-sm text-gray-900 dark:text-gray-100">
|
||||
http
|
||||
{t("mcp.wizard.typeHttp")}
|
||||
</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user