fix(i18n): 回退到稳定的 32% 覆盖率状态 (tsc + Vite 构建通过)

批量转换脚本引入的语法错误已回退,保留稳定的 i18n 转换:
- 翻译词典: 22 namespaces, 3600+ keys
- 已接入: 145+ 文件 (Dashboard/Login/K8s 主页面/Monitor/System/Deploy)
- 语言切换器在 Header 中可用 (🇨🇳/🇺🇸)
- tsc 零错误, Vite 构建成功
This commit is contained in:
attacker committed 2026-07-03 02:02:29 +08:00
1 parent ecec73989b
commit 72bfb0e12d
191 files changed
+5057 -7592

No files matched your search

@@ -15,6 +15,7 @@ import { ResetPasswordDialog } from './ResetPasswordDialog';
import { useLdapManagement } from './useLdapManagement';
import { useAuditSettings } from './useAuditSettings';
import type { UserFormData } from './UserFormDialog';
import { useTranslation } from 'react-i18next';
// 后端用户数据转换为前端兼容格式
function mapUser( u: any) {
@@ -39,6 +40,7 @@ const emptyForm: UserFormData = {
};
export function SystemManager() {
const { t } = useTranslation();
const confirm = useConfirm();
const location = useLocation();
// 侧边栏菜单路径映射到 Tab // Logan.Li
@@ -52,18 +54,18 @@ export function SystemManager() {
const pageMeta: Record<string, { title: string; subtitle: string; icon: React.ReactNode }> = {
users: {
title: '用户管理',
subtitle: '本地与 LDAP 用户账号、状态与角色分配',
title: t('system.users'),
subtitle: t('system.localUserDesc'),
icon: <Users className="h-5 w-5" />,
},
roles: {
title: '角色权限',
subtitle: '角色绑定权限码,同时约束前端菜单与后端 API',
title: t('system.roles'),
subtitle: t('system.roleBindingHint'),
icon: <Shield className="h-5 w-5" />,
},
settings: {
title: '系统设置',
subtitle: '通用与审计、安全策略、LDAP 目录服务',
title: t('system.settings'),
subtitle: t('system.generalSubtitle'),
icon: <Settings className="h-5 w-5" />,
},
};
@@ -128,12 +130,12 @@ export function SystemManager() {
return status === 'active' ? (
<Badge variant="outline" className="border-[var(--dg-green)]/30 text-[var(--dg-green)] bg-[var(--dg-green)]/10">
<CheckCircle className="h-3 w-3 mr-1" />
正常
{t('common.normal')}
</Badge>
) : (
<Badge variant="outline" className="border-[var(--dg-text-muted)]/30 text-[var(--dg-text-muted)] bg-[var(--dg-text-muted)]/10">
<XCircle className="h-3 w-3 mr-1" />
禁用
{t('system.userInactive')}
</Badge>
);
};
@@ -187,24 +189,24 @@ export function SystemManager() {
};
const handleDelete = async ( user: any) => {
const ok = await confirm({ title: '删除用户', description: `确认删除用户「${user.nickname || user.username}」吗?`, confirmText: '删除', variant: 'destructive' });
const ok = await confirm({ title: t('system.deleteUser'), description: `确认删除用户「${user.nickname || user.username}」吗?`, confirmText: t('common.delete'), variant: 'destructive' });
if (!ok) return;
try {
await userApi.deleteUser(user.id);
setSelectedUserIds((prev) => prev.filter((id) => id !== user.id));
await loadUsers();
toast.success('用户已删除');
toast.success(t('system.userDeleted'));
} catch (error: unknown) {
toast.error(error instanceof Error ? error.message : '删除失败');
toast.error(error instanceof Error ? error.message : t('common.deleteFailed'));
}
};
const handleBatchDelete = async () => {
if (selectedUserIds.length === 0) return;
const ok = await confirm({
title: '批量删除用户',
title: t('system.batchDeleteUsers'),
description: `确定删除选中的 ${selectedUserIds.length} 个用户吗?此操作不可恢复。`,
confirmText: '批量删除',
confirmText: t('system.terminalBatchDelete'),
variant: 'destructive',
});
if (!ok) return;
@@ -214,7 +216,7 @@ export function SystemManager() {
setSelectedUserIds([]);
await loadUsers();
} catch (error: unknown) {
toast.error(error instanceof Error ? error.message : '批量删除失败');
toast.error(error instanceof Error ? error.message : t('cloud.batchDeleteFailed'));
}
};
@@ -262,7 +264,7 @@ export function SystemManager() {
setImportResult(res);
await loadUsers();
} catch (error) {
setImportResult({ code: 500, message: error?.message || '导入失败' });
setImportResult({ code: 500, message: error?.message || t('system.importFailed') });
} finally {
ldap.setImporting(false);
}