diff --git a/frontend/src/components/kubernetes/DeploymentDetail.tsx b/frontend/src/components/kubernetes/DeploymentDetail.tsx index af6730e..df9b96a 100644 --- a/frontend/src/components/kubernetes/DeploymentDetail.tsx +++ b/frontend/src/components/kubernetes/DeploymentDetail.tsx @@ -176,7 +176,7 @@ export function DeploymentDetail({ clusterCode, namespace, deploymentName, onBac - Pod 列表 ({pods.length}) + {i18n.t('k8s.deploymentDetail.podList')} ({pods.length}) {i18n.t("common.podLogs")} diff --git a/frontend/src/components/kubernetes/DeploymentEditAdvanced.tsx b/frontend/src/components/kubernetes/DeploymentEditAdvanced.tsx index 33baea1..48f74fc 100644 --- a/frontend/src/components/kubernetes/DeploymentEditAdvanced.tsx +++ b/frontend/src/components/kubernetes/DeploymentEditAdvanced.tsx @@ -281,7 +281,7 @@ export function DeploymentEditAdvanced({ clusterCode, namespace, deploymentName, diff --git a/frontend/src/components/kubernetes/DeploymentEditContainers.tsx b/frontend/src/components/kubernetes/DeploymentEditContainers.tsx index 0618b10..457a41f 100644 --- a/frontend/src/components/kubernetes/DeploymentEditContainers.tsx +++ b/frontend/src/components/kubernetes/DeploymentEditContainers.tsx @@ -202,7 +202,7 @@ export function DeploymentEditContainers({ clusterCode, namespace, deploymentNam diff --git a/frontend/src/components/kubernetes/DeploymentEditStorage.tsx b/frontend/src/components/kubernetes/DeploymentEditStorage.tsx index 380ae68..db2b73f 100644 --- a/frontend/src/components/kubernetes/DeploymentEditStorage.tsx +++ b/frontend/src/components/kubernetes/DeploymentEditStorage.tsx @@ -343,7 +343,7 @@ export function DeploymentEditStorage({ clusterCode, namespace, deploymentName, diff --git a/frontend/src/components/kubernetes/EventsPage.tsx b/frontend/src/components/kubernetes/EventsPage.tsx index eda828b..b785a38 100644 --- a/frontend/src/components/kubernetes/EventsPage.tsx +++ b/frontend/src/components/kubernetes/EventsPage.tsx @@ -165,12 +165,12 @@ export default function EventsPage() { {i18n.t('kubernetes.eventsPage.filterLabel')} {selectedReason && ( )} {selectedKind && ( )} @@ -240,7 +240,7 @@ export default function EventsPage() {

- 最新告警 ({summary.recent_warnings.length}) + {i18n.t('k8s.eventsPage.recentWarnings')} ({summary.recent_warnings.length})

{summary.recent_warnings.map((w: JsonData, i: number) => ( diff --git a/frontend/src/components/kubernetes/KubernetesClusterDialog.tsx b/frontend/src/components/kubernetes/KubernetesClusterDialog.tsx index 2f9a87c..be6d3d7 100644 --- a/frontend/src/components/kubernetes/KubernetesClusterDialog.tsx +++ b/frontend/src/components/kubernetes/KubernetesClusterDialog.tsx @@ -164,7 +164,7 @@ export function KubernetesClusterDialog({ /> {nameError &&

{nameError}

}

- 只允许英文、数字和连字符(-),首尾不能是连字符。名称将作为集群唯一标识。 + {i18n.t('k8s.clusterDialog.codeRule')}

@@ -243,7 +243,7 @@ export function KubernetesClusterDialog({ /> {!hasKubeConfig && (

- 粘贴 kubeconfig 内容后将自动解析 API Server 地址 + {i18n.t('k8s.clusterDialog.kubeconfigHint')}

)}
@@ -255,7 +255,7 @@ export function KubernetesClusterDialog({ onClick={() => { onOpenChange(false); }} className="border-[var(--dg-border)] text-[var(--dg-text-secondary)] hover:text-[var(--dg-text-primary)] hover:bg-[var(--dg-bg-hover)]" > - 取消 + {i18n.t('common.cancel')} @@ -280,7 +280,7 @@ export default function NamespaceManagementPage() { {i18n.t('common.deleteNamespaceWarn')} {deleteTarget} {i18n.t('common.allResources')}

- 此操作不可逆,所有 Deployment/Pod/Service/ConfigMap 等资源将被永久删除。 + {i18n.t('k8s.nsMgmt.confirmDeleteDesc')}

@@ -288,7 +288,7 @@ export default function NamespaceManagementPage() { diff --git a/frontend/src/components/kubernetes/PodFileBrowser.tsx b/frontend/src/components/kubernetes/PodFileBrowser.tsx index 668f30b..ae670da 100644 --- a/frontend/src/components/kubernetes/PodFileBrowser.tsx +++ b/frontend/src/components/kubernetes/PodFileBrowser.tsx @@ -119,7 +119,7 @@ export function PodFileBrowser({ const text = await kubernetesApi.readPodFileText(clusterCode, namespace, podName, filePath, container || undefined); setPreview({ file: fileName, content: text }); } catch (e) { - setPreview({ file: fileName, content: `读取失败: ${(e as JsonData).message}` }); + setPreview({ file: fileName, content: `${i18n.t('k8s.podFiles.readError')}: ${(e as JsonData).message}` }); } }; @@ -137,7 +137,7 @@ export function PodFileBrowser({ await kubernetesApi.uploadPodFile(clusterCode, namespace, podName, currentPath, file, container || undefined); loadFiles(currentPath); } catch (err) { - setError(`上传失败: ${(err as JsonData).message}`); + setError(`${i18n.t('k8s.podFiles.uploadError')}: ${(err as JsonData).message}`); } finally { setUploading(false); if (fileInputRef.current) fileInputRef.current.value = ''; @@ -211,7 +211,7 @@ export function PodFileBrowser({
- 端口: + {i18n.t('k8s.workload.portsLabel')}: {(c.ports || []).map((p: JsonData) => p.containerPort || p.port).join(', ') || '-'}
diff --git a/frontend/src/locales/en-US.json b/frontend/src/locales/en-US.json index cbb9b4c..98a7eba 100644 --- a/frontend/src/locales/en-US.json +++ b/frontend/src/locales/en-US.json @@ -662,7 +662,8 @@ "readWrite": "Read Write", "manageAll": "Manage All", "createNew": "Create New", - "saveSuccess": "Saved successfully" + "saveSuccess": "Saved successfully", + "daysSuffix": "days" }, "menu": { "aiAgentCli": "Agent CLI", @@ -2655,7 +2656,8 @@ "tokenPlaceholder": "Paste Service Account Token...", "tokenConfigured": "Configured, enter new value to override...", "addTitle": "Add Cluster", - "editTitle": "Edit Cluster" + "editTitle": "Edit Cluster", + "codeRule": "Only English letters, numbers, and hyphens(-) allowed. Cannot start or end with a hyphen. Serves as cluster unique identifier." }, "clusterOverview": { "nodeCount": "Nodes", @@ -3205,7 +3207,8 @@ "notReady": "Not Ready", "selectCluster": "Select Cluster", "subtitle": "Kubernetes cluster node status and resources", - "noData": "No node data" + "noData": "No node data", + "cores": "cores" }, "nsMgmt": { "status": "Status", @@ -3216,7 +3219,10 @@ "title": "Namespace Management", "quotaLimit": "Quota Limits", "nameExample": "e.g. my-app", - "quotaSubtitle": "{{code}} · Resource Quotas & Lifecycle" + "quotaSubtitle": "{{code}} · Resource Quotas & Lifecycle", + "dnsHint": "Name must comply with DNS-1123 (lowercase letters/numbers/hyphens)", + "confirmDeleteDesc": "This action is irreversible. All Deployments/Pods/Services/ConfigMaps will be permanently deleted.", + "confirmDelete": "Confirm Delete" }, "nsOverview": { "workloadReplicas": "Workload replica management", @@ -3688,7 +3694,9 @@ "confirmDeletePod": "Confirm Delete Pod", "deletePodDesc": "This operation cannot be undone", "image": "Image", - "deployment": "Deployment" + "deployment": "Deployment", + "memoryLabel": "Memory", + "portsLabel": "Ports" }, "workloadView": { "restartSent": "Restart command sent", @@ -3740,7 +3748,19 @@ "podLevel": "Pod Level", "podNameLabel": "Pod Name", "podManagePolicy": "Pod Management Policy", - "uploadFile": "Upload" + "uploadFile": "Upload", + "eventsPage": { + "reasonLabel": "Reason", + "kindLabel": "Kind", + "recentWarnings": "Recent Warnings" + }, + "podFiles": { + "readError": "Read failed", + "uploadError": "Upload failed" + }, + "bundleYaml": { + "unsupportedType": "Unsupported resource type: {{kind}} (only Deployment / Service supported)" + } }, "monitor": { "acknowledge": "Acknowledge", @@ -3808,7 +3828,10 @@ "alertChannelDialog": { "notTested": "Not Tested", "title": "Notification Channel Configuration", - "enableChannel": "Enable this channel" + "enableChannel": "Enable this channel", + "desc": "Manage alert notification channels (DingTalk/WeChat/Email/SMS/Webhook). Reference in alert rules after configuration.", + "createNew": "New", + "emptyChannels": "No notification channels. Add on the right." }, "alertChannelDialog2": { "editChannel": "Edit Channel", @@ -3901,7 +3924,9 @@ "alertList": "Alerts", "alertManager": { "trendTitle": "Alert Trends", - "last24hStats": "Past 24 hours alert statistics" + "last24hStats": "Past 24 hours alert statistics", + "notifyConfig": "Notification Config", + "createRule": "Create Rule" }, "alertMessage": "Message", "alertMgr2": { @@ -3948,7 +3973,12 @@ "deleteRule": "Delete Alert Rule", "deleteConfirm": "Delete this alert rule?", "deleted": "Alert rule deleted", - "condition": "Trigger Condition" + "condition": "Trigger Condition", + "batchDelete": "Batch Delete", + "emptyRules": "No alert rules", + "severityCritical": "Critical", + "severityWarning": "Warning", + "severityInfo": "Info" }, "alertSeverity": "Severity", "alertSource": "Source", @@ -4502,7 +4532,22 @@ "usedHint": "Used {{value}}", "clusterNodesHint": "Cluster {{value}} nodes", "slowQueriesHint": "Slow queries {{value}}", - "pointCount": "{{min}} — {{max}} · {{count}} pts" + "pointCount": "{{min}} — {{max}} · {{count}} pts", + "queryCount": "Log Count", + "totalCount": "Total", + "loadMore": "Load More", + "displayFields": "Display Fields", + "indexFields": "Indexed Fields", + "logQueryHint": "Log queries depend on datasource connections. Platform does not store log data.", + "labelBrowser": "Label Browser", + "selectedCount": "Selected", + "addAlertFromQuery": "Add current query as alert", + "emptyLogAlerts": "No log alerts. Click the bell icon in Loki/ES query page to create from current query.", + "useDefaultIndex": "Use datasource default", + "maxHistory": "Max 50 entries · Local storage", + "countSuffix": "entries", + "prometheusDs": "Prometheus Datasource", + "addDatasource": "Add Datasource" }, "logAlertBell": { "linked": "Alert Policy Linked", @@ -7832,7 +7877,27 @@ "deleteUserConfirmDesc": "Delete user \"{{name}}\"?", "batchDeleteUsersConfirmDesc": "Delete {{count}} selected users? This action cannot be undone.", "deleteCredConfirmDesc": "Delete \"{{name}}\"? This cannot be undone. Servers using this credential will lose connection.", - "deleteTermSessionsConfirmDesc": "Delete {{count}} selected terminal session records?" + "deleteTermSessionsConfirmDesc": "Delete {{count}} selected terminal session records?", + "newUser": "New User", + "password": "Password", + "local": "Local", + "batchImportCsv": "Batch Import Users (CSV)", + "csvImportDesc": "Upload a CSV file to batch create users. Download the template first, fill in and upload.", + "selectCsvFile": "Select CSV File", + "previewData": "Preview", + "moreEntries": "{{count}} more entries...", + "confirmImport": "Confirm Import ({{count}})", + "ldapImportTitle": "Import Users from LDAP", + "ldapImportDesc": "Retrieve user list from LDAP server, select users to import", + "foundUsers": "Found {{count}} users", + "noUserData": "No user data", + "selectedItems": "Selected {{selected}} / Total {{total}}", + "credentialEmpty": "No credentials. Click \"Add Credential\" to create", + "credentialSshKey": "SSH Private Key", + "credentialAkSk": "AK/SK (one pair per line, space or comma separated)", + "credentialEncryptedHint": "Credentials are encrypted with AES-256-GCM, decrypted only on server side", + "permissionAssign": "Permission Assignment", + "adminPassword": "Admin Password" }, "aiops": { "activeCount": "{{count}} active", diff --git a/frontend/src/locales/zh-CN.json b/frontend/src/locales/zh-CN.json index e927eb2..d3cf9e0 100644 --- a/frontend/src/locales/zh-CN.json +++ b/frontend/src/locales/zh-CN.json @@ -662,7 +662,8 @@ "readWrite": "读写", "manageAll": "管理全部", "createNew": "新建", - "saveSuccess": "保存成功" + "saveSuccess": "保存成功", + "daysSuffix": "天" }, "menu": { "aiAgentCli": "Agent CLI", @@ -2655,7 +2656,8 @@ "tokenPlaceholder": "粘贴 Service Account Token...", "tokenConfigured": "已配置,输入新值覆盖...", "addTitle": "添加集群", - "editTitle": "编辑集群" + "editTitle": "编辑集群", + "codeRule": "只允许英文、数字和连字符(-),首尾不能是连字符。名称将作为集群唯一标识。" }, "clusterOverview": { "nodeCount": "节点数", @@ -3205,7 +3207,8 @@ "notReady": "未就绪", "selectCluster": "选择集群", "subtitle": "Kubernetes 集群工作节点状态与资源", - "noData": "暂无节点数据" + "noData": "暂无节点数据", + "cores": "核" }, "nsMgmt": { "status": "状态", @@ -3216,7 +3219,10 @@ "title": "命名空间管理", "quotaLimit": "配额限制", "nameExample": "例如: my-app", - "quotaSubtitle": "{{code}} · 资源配额与生命周期管理" + "quotaSubtitle": "{{code}} · 资源配额与生命周期管理", + "dnsHint": "名称需符合 DNS-1123 标准(小写字母/数字/连字符)", + "confirmDeleteDesc": "此操作不可逆,所有 Deployment/Pod/Service/ConfigMap 等资源将被永久删除。", + "confirmDelete": "确认删除" }, "nsOverview": { "workloadReplicas": "工作负载副本管理", @@ -3688,7 +3694,9 @@ "confirmDeletePod": "确认删除 Pod", "deletePodDesc": "操作不可恢复", "image": "镜像", - "deployment": "Deployment" + "deployment": "Deployment", + "memoryLabel": "内存", + "portsLabel": "端口" }, "workloadView": { "restartSent": "重启指令已下发", @@ -3740,7 +3748,19 @@ "podLevel": "Pod 级别", "podNameLabel": "Pod 名称", "podManagePolicy": "Pod 管理策略", - "uploadFile": "上传" + "uploadFile": "上传", + "eventsPage": { + "reasonLabel": "原因", + "kindLabel": "类型", + "recentWarnings": "最新告警" + }, + "podFiles": { + "readError": "读取失败", + "uploadError": "上传失败" + }, + "bundleYaml": { + "unsupportedType": "不支持的资源类型: {{kind}}(仅支持 Deployment / Service)" + } }, "monitor": { "acknowledge": "确认告警", @@ -3808,7 +3828,10 @@ "alertChannelDialog": { "notTested": "未测试", "title": "通知渠道配置", - "enableChannel": "启用此渠道" + "enableChannel": "启用此渠道", + "desc": "管理告警通知渠道(钉钉/企业微信/邮件/短信/Webhook),配置后可在告警规则中引用", + "createNew": "新建", + "emptyChannels": "暂无通知渠道,请在右侧添加" }, "alertChannelDialog2": { "editChannel": "编辑渠道", @@ -3901,7 +3924,9 @@ "alertList": "告警列表", "alertManager": { "trendTitle": "告警趋势", - "last24hStats": "过去24小时告警统计" + "last24hStats": "过去24小时告警统计", + "notifyConfig": "通知配置", + "createRule": "新建规则" }, "alertMessage": "告警信息", "alertMgr2": { @@ -3948,7 +3973,12 @@ "deleteRule": "删除告警规则", "deleteConfirm": "确定删除此告警规则?", "deleted": "告警规则已删除", - "condition": "触发条件" + "condition": "触发条件", + "batchDelete": "批量删除", + "emptyRules": "暂无告警规则", + "severityCritical": "严重", + "severityWarning": "警告", + "severityInfo": "提示" }, "alertSeverity": "级别", "alertSource": "来源", @@ -4502,7 +4532,22 @@ "usedHint": "已用 {{value}}", "clusterNodesHint": "集群 {{value}} 节点", "slowQueriesHint": "慢查询 {{value}}", - "pointCount": "{{min}} — {{max}} · {{count}} 点" + "pointCount": "{{min}} — {{max}} · {{count}} 点", + "queryCount": "日志条数", + "totalCount": "总数", + "loadMore": "加载更多", + "displayFields": "显示字段", + "indexFields": "索引字段", + "logQueryHint": "日志查询依赖数据源连接,平台不存储海量日志本体", + "labelBrowser": "Label 浏览器", + "selectedCount": "已选", + "addAlertFromQuery": "将当前查询添加为告警", + "emptyLogAlerts": "暂无日志告警。在 Loki/ES 查询页点击右下角「叮当」可从当前查询快速创建。", + "useDefaultIndex": "使用数据源默认", + "maxHistory": "最多保存 50 条 · 本地存储", + "countSuffix": "条", + "prometheusDs": "Prometheus 数据源", + "addDatasource": "添加数据源" }, "logAlertBell": { "linked": "已关联告警策略", @@ -7832,7 +7877,27 @@ "deleteUserConfirmDesc": "确认删除用户「{{name}}」吗?", "batchDeleteUsersConfirmDesc": "确定删除选中的 {{count}} 个用户吗?此操作不可恢复。", "deleteCredConfirmDesc": "确定删除「{{name}}」吗?删除后无法恢复,关联的服务器将无法使用此凭据连接。", - "deleteTermSessionsConfirmDesc": "确认删除选中的 {{count}} 条终端会话记录?" + "deleteTermSessionsConfirmDesc": "确认删除选中的 {{count}} 条终端会话记录?", + "newUser": "新建用户", + "password": "密码", + "local": "本地", + "batchImportCsv": "批量导入用户(CSV)", + "csvImportDesc": "上传 CSV 文件批量创建用户。请先下载模板,按格式填写后上传。", + "selectCsvFile": "选择 CSV 文件", + "previewData": "预览", + "moreEntries": "还有 {{count}} 条...", + "confirmImport": "确认导入 ({{count}})", + "ldapImportTitle": "从 LDAP 导入用户", + "ldapImportDesc": "从 LDAP 服务器检索用户列表,选择需要导入的用户", + "foundUsers": "找到 {{count}} 个用户", + "noUserData": "暂无用户数据", + "selectedItems": "已选择 {{selected}} 项 / 共 {{total}} 项", + "credentialEmpty": "暂无凭据,点击「添加凭据」创建", + "credentialSshKey": "SSH 私钥", + "credentialAkSk": "AK/SK (每行一对,用空格或逗号分隔)", + "credentialEncryptedHint": "凭据内容使用 AES-256-GCM 加密存储,仅在服务器端解密使用", + "permissionAssign": "权限分配", + "adminPassword": "管理员密码" }, "aiops": { "activeCount": "{{count}} 个活跃",