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.title')}

+

{t('server.subtitle')}

{hasPermission('server:create') && ( - 选择导入方式 + {t('server.importMethod')} setCloudImportOpen(true)} > - 云主机导入 - 从云平台同步 + {t('server.cloudImport')} + {t('server.cloudImportHint')} setExcelImportOpen(true)} > - CSV导入 - hostname + IP 即可 + {t('server.csvImport')} + {t('server.csvImportHint')} @@ -419,7 +425,7 @@ export function ServerManager() { onClick={openCreateForm} > - 添加服务器 + {t('server.addServer')} )}
@@ -437,7 +443,7 @@ export function ServerManager() {
handleSearch(e.target.value)} className="pl-9 h-9 bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)] placeholder:text-[var(--dg-text-muted)]" @@ -445,20 +451,20 @@ export function ServerManager() {
{selectedServers.length > 0 && (
- 已选择 {selectedServers.length} 项 + {t('server.selected', { count: selectedServers.length })} {hasPermission('server:delete') && ( )}
@@ -487,14 +493,14 @@ export function ServerManager() { className="border-[var(--dg-border)]" /> - 主机名 - IP地址 - 公网IP - 状态 - 配置 - 使用率 - 标签 - 操作 + {t('server.hostname')} + {t('server.ipAddress')} + {t('server.publicIp')} + {t('common.status')} + {t('server.config')} + {t('server.usage')} + {t('server.tags')} + {t('common.actions')} @@ -502,13 +508,13 @@ export function ServerManager() { - 加载中... + {t('common.loading')} ) : servers.length === 0 ? ( - 暂无服务器数据 + {t('server.noData')} ) : ( @@ -532,7 +538,7 @@ export function ServerManager() { {/* 分页 */}
- 每页 + {t('server.perPage')} - 条 - 共 {total} 条 + {t('server.items')} + {t('server.totalItems', { count: total })}