feat: 品牌统一 LokiStack + 全站中英 i18n + 用户批量删除 + 主题定时切换与浅色侧栏

- 品牌: Go 模块/数据文件/二进制/构建部署资产全部 opsx→lokistack;前端 localStorage 命名空间迁移(读旧写新,含按用户 id 前缀迁移);修复 nginx upstream 与 Makefile 引用已改名服务的断裂
- i18n: react-i18next 落地,common + 11 个页面域命名空间全站中英(菜单/顶栏/登录/列表页/表单/确认弹窗/状态徽章);设置页语言即时切换;修复词典自注册导致的循环导入白屏
- 用户管理: 批量删除(POST /users/batch-delete,不删自己/最后管理员,部分失败不阻断)+ 行复选/全选/批量工具条
- 主题: 浅色侧栏(中性灰激活态)、四态模式(浅色/深色/跟随系统/定时切换,按时区判定)、顶栏太阳月亮二态、设置页紧凑分段选择器
- UI: 登录记住用户名、CardActionButton 统一五页卡片操作钮、shadcn Badge 替换手写徽章、语义色修正
- 清理: 移除主机 Web 终端(前后端)、k8s-helm/Helm 遗留代码与字段、README 重写精简
- 修复: 侧栏与日志告警 order 重复、路由标题 i18n key 未翻译、词典双逗号等
This commit is contained in:
opsx committed 2026-10-27 17:11:38 +08:00
1 parent 02d1bd87a7
commit f3733f0bfc
201 files changed
+5438 -2388

No files matched your search

+135
View File
@@ -0,0 +1,135 @@
// collectors 命名空间 — 「日志采集」页面域中文文案。
// 注册说明:i18n 入口(src/i18n/index.ts)由框架统一维护,页面域词典在被页面组件
// 与入口处 resources 静态注册的 common 命名空间共存。
const collectors = {
page: {
title: '日志采集',
description: '为主机与集群配置日志采集策略,日志将推送到关联的 Loki',
addAction: '添加采集策略',
},
empty: {
title: '暂无采集策略',
description: '新建一个日志采集器,关联已部署的 Loki',
},
// 采集器类型徽章(卡片描述行)
typeLabel: {
hostPromtail: '主机 Promtail',
k8sDaemonset: 'Promtail DaemonSet',
k8sFluentbitSidecar: 'Fluent Bit Sidecar',
},
// 卡片字段标签
field: {
loki: '关联 Loki',
cluster: '集群',
host: '主机',
namespace: '命名空间',
logPath: '日志路径',
target: '目标',
unknown: '未知',
},
action: {
install: '部署',
uninstall: '卸载',
editAria: '编辑采集策略 {{name}}',
deleteAria: '删除采集器 {{name}}',
},
toast: {
loadOptionsFailed: '加载 Loki 部署/集群/主机数据失败',
installFailed: '部署采集器失败',
uninstallFailed: '卸载采集器失败',
deleteFailed: '删除采集器失败',
createFailed: '创建采集器失败',
saveFailed: '保存采集策略失败',
},
deleteConfirm: '确定要删除「{{name}}」吗?删除时将自动卸载采集端,此操作不可恢复。',
form: {
title: '添加采集策略',
name: '名称',
type: '采集器类型',
// 新建表单下拉里的类型选项(比卡片徽章多部署通道说明)
typeOption: {
hostPromtail: '主机 Promtail(SSH)',
k8sDaemonset: 'Kubernetes Promtail DaemonSet',
k8sFluentbitSidecar: 'Kubernetes Fluent Bit Sidecar',
},
lokiDeployment: '关联 Loki 部署',
lokiPlaceholder: '选择已部署的 Loki(推送目标)',
// 下拉项名称后的括号后缀(状态/IP),中英文括号形态不同
statusParen: '({{status}})',
hostParen: '({{ip}})',
host: '目标主机',
hostPlaceholder: '选择主机',
cluster: '目标集群',
clusterPlaceholder: '选择集群',
namespace: '命名空间',
nsPickCluster: '先选择集群',
nsLoading: '加载命名空间…',
nsPick: '选择命名空间',
nsEmpty: '暂无可读取的命名空间',
nsLoadFailed: '读取命名空间失败',
pickFromCluster: '从集群选择',
manualInput: '手动填写',
targetDeployment: '目标 Deployment',
wlPickNamespace: '先选择命名空间',
wlLoading: '加载 Deployment…',
wlPick: '选择 Deployment',
wlEmpty: '此命名空间暂无 Deployment',
wlLoadFailed: '读取 Deployment 失败',
wlReady: '(就绪 {{ready}}/{{total}})',
logPath: '采集日志路径',
logPathHostHint: '支持 glob 通配(如 /var/log/*.log /var/log/syslog);多个路径用逗号分隔',
logPathSidecarHint:
'填写业务写入的文件路径,如 /var/log/app/*.log。已有日志卷会自动共享;无日志卷时仅在专用 logs 目录创建共享卷。/tmp/test.log 等普通目录不会自动挂载。',
labels: '自定义标签(JSON,可选)',
labelsHint: '合法 JSON 时将附加到每条日志的标签,便于在 Loki/Grafana 中筛选;留空则不加',
submit: '创建并部署',
submitting: '创建中...',
validation: {
nameRequired: '请输入采集器名称',
lokiRequired: '请选择关联的 Loki 部署',
hostRequired: '请选择目标主机',
clusterRequired: '请选择目标集群',
namespaceRequired: '请选择命名空间',
targetDeploymentRequired: '请填写目标 Deployment 名称',
},
},
edit: {
title: '编辑采集策略',
namespaces: '采集命名空间',
allNamespaces: '全集群所有命名空间',
selectedCount: '已选 {{count}} 个',
allCheckbox: '所有命名空间(全集群采集)',
nsSearch: '搜索命名空间…',
loading: '加载中…',
nsListEmpty: '未取到命名空间列表(可手动输入)',
nsNoMatch: '无匹配',
nsLoadFailed: '加载命名空间失败',
// nsHint/appSourceHint/appIncludeHint 含行内 <code>,渲染处用 Trans 组件
nsHint:
'勾「所有命名空间」= 采集全集群;否则只采集勾选的命名空间。生成 Promtail 的 <code>kubernetes_sd_configs.namespaces</code> 白名单。',
appLabelSource: 'app 标签取值来源',
appSourcePlaceholder: '留空 = 默认(controller 名回退链)',
appSourceHint:
'默认按 <code>app.kubernetes.io/name → app → controller 名 → pod 名</code> 四级回退。若集群有自己的私有规范标签(如 <code>k8s.kuboard.cn/name</code>),填在这里会作为最高优先级,其余仍兜底。',
appSourcePreset: {
default: '默认:app.kubernetes.io/name → app → controller 名 → pod 名',
controllerName: 'controller_name(Pod 的 ReplicaSet 名,去 hash = Deployment 名)',
k8sAppName: 'app.kubernetes.io/name(Kubernetes 标准标签)',
app: 'app(常见简写)',
kuboard: 'k8s.kuboard.cn/name(Kuboard 注入)',
},
appInclude: '只采集这些 app(可选)',
appIncludePlaceholder: '留空 = 不限;多个用逗号分隔,如 cex-spot-api, cex-asset-api',
appIncludeHint:
'填了之后 Promtail 只保留 app 命中这些值的日志(<code>action: keep</code>),是控制日志量最直接的手段。值需与上面「app 标签取值来源」解析出的 app 一致。',
logPathHint: 'Sidecar 需使用业务容器的共享日志卷,或专用 logs 目录。保存后点击「部署」应用新配置。',
save: '保存',
saving: '保存中…',
validation: {
nameRequired: '请输入采集策略名称',
},
},
}
export default collectors