diff --git a/frontend/src/components/server/ServerManager.tsx b/frontend/src/components/server/ServerManager.tsx index e54cc05..11c801c 100644 --- a/frontend/src/components/server/ServerManager.tsx +++ b/frontend/src/components/server/ServerManager.tsx @@ -1,4 +1,5 @@ import { useState, useEffect, useRef, useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; import { useQueryClient } from '@tanstack/react-query'; import { cn } from '@/lib/utils'; import { Card, CardContent } from '@/components/ui/card'; @@ -56,6 +57,7 @@ import { ServerTableRow } from './ServerTableRow'; import { usePermission } from '@/hooks/usePermission'; export function ServerManager() { + const { t } = useTranslation(); const confirm = useConfirm(); const queryClient = useQueryClient(); const { hasPermission } = usePermission(); @@ -215,18 +217,18 @@ export function ServerManager() { const handleDelete = async (id: string) => { const server = servers.find((s) => String(s.id) === String(id)); const ok = await confirm({ - title: '删除服务器', - description: `确定删除「${server?.hostname || id}」吗?此操作不可撤销。`, - confirmText: '删除', + title: t('server.deleteTitle'), + description: `${server?.hostname || id}`, + confirmText: t('common.delete'), variant: 'destructive', }); if (!ok) return; try { await deleteMutation.mutateAsync(id); - toast.success('服务器已删除'); + toast.success(t('server.deleted')); } catch (e) { - console.error('删除服务器失败:', e); - toast.error('删除失败'); + console.error('[ServerManager] delete failed:', e); + toast.error(t('server.deleteFailed')); } }; @@ -234,19 +236,19 @@ export function ServerManager() { const handleBatchDelete = async () => { if (selectedServers.length === 0) return; const ok = await confirm({ - title: '批量删除服务器', - description: `确定删除选中的 ${selectedServers.length} 台服务器吗?此操作不可撤销。`, - confirmText: '批量删除', + title: t('server.batchDeleteTitle'), + description: `${selectedServers.length}`, + confirmText: t('server.batchDelete'), variant: 'destructive', }); if (!ok) return; try { await batchDeleteMutation.mutateAsync(selectedServers.map((id) => Number(id))); - toast.success(`已删除 ${selectedServers.length} 台服务器`); + toast.success(t('server.deletedCount', { count: selectedServers.length })); setSelectedServers([]); } catch (e) { - console.error('批量删除失败:', e); - toast.error('批量删除失败'); + console.error('[ServerManager] batch delete failed:', e); + toast.error(t('server.batchDeleteFailed')); } }; @@ -320,11 +322,11 @@ export function ServerManager() { } else { await createMutation.mutateAsync(payload); } - toast.success(editingId ? '服务器已更新' : '服务器已创建'); + toast.success(editingId ? t('server.updated') : t('server.created')); setFormOpen(false); } catch (e) { - console.error('保存服务器失败:', e); - toast.error('保存失败,请重试'); + console.error('[ServerManager] save failed:', e); + toast.error(t('server.saveFailed')); } finally { setFormSaving(false); } @@ -333,10 +335,14 @@ export function ServerManager() { // 导出 CSV — 将当前服务器列表导出为 CSV 文件 // Logan.Li const handleExport = () => { if (servers.length === 0) { - toast.error('没有可导出的数据'); + toast.error(t('server.noExportData')); return; } - const headers = ['主机名', 'IP地址', '公网IP', '端口', '操作系统', 'CPU(核)', '内存(GB)', '磁盘(GB)', '状态', '标签']; + const headers = [ + t('server.csv.hostname'), t('server.csv.ip'), t('server.csv.publicIp'), t('server.csv.port'), + t('server.csv.os'), t('server.csv.cpu'), t('server.csv.memory'), t('server.csv.disk'), + t('server.csv.status'), t('server.csv.tags'), + ]; const rows = servers.map((s) => { const memGB = s.memory ? Math.round(Number(s.memory) / 1024) : 0; const tags = getTags(s).join(';'); @@ -353,7 +359,7 @@ export function ServerManager() { a.download = `servers_${new Date().toISOString().slice(0, 10)}.csv`; a.click(); URL.revokeObjectURL(url); - toast.success(`已导出 ${servers.length} 台服务器`); + toast.success(t('server.exported', { count: servers.length })); }; const colSpanCount = 8; @@ -363,8 +369,8 @@ export function ServerManager() { {/* Page Header */}
管理云平台服务器资产
+{t('server.subtitle')}