// 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: '目标', runMode: '运行方式', unknown: '未知', }, // 主机采集器托管方式(安装时自动探测:docker 优先、systemd 兜底) runMode: { docker: 'Docker 容器', systemd: 'systemd 服务', }, action: { install: '部署', uninstall: '卸载', logs: '日志', editAria: '编辑采集策略 {{name}}', deleteAria: '删除采集器 {{name}}', }, logs: { title: '采集器日志 · {{name}}', description: '采集器最近运行日志(主机:docker logs / journalctl;K8s:采集 Pod 日志)', source: '来源:{{source}}', tailLines: '{{count}} 行', refresh: '刷新', empty: '暂无日志输出(采集器可能刚启动,或暂时没有匹配的日志行)', copy: '复制', copied: '已复制', close: '关闭', failed: '读取采集器日志失败', }, 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: '命名空间', namespaceHintSidecar: '填「目标应用(Deployment)所在的命名空间」。平台会在该命名空间里找到目标 Deployment 并注入 Fluent Bit sidecar,采集到的日志也会打上这个 namespace 标签。它不是日志过滤条件。', namespaceHintDaemonset: '填「Promtail DaemonSet 部署到哪个命名空间」。DaemonSet 会采集整个集群所有命名空间的容器日志,不按命名空间过滤(一般就用 Loki 所在的 log)。', namespaceHintHost: '主机模式不使用该字段。', 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 目录。', labels: '自定义标签(JSON,可选)', labelsHint: '合法 JSON 时将附加到每条日志的标签,便于在日志平台中筛选;留空则不附加', 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 含行内 ,渲染处用 Trans 组件 nsHint: '勾选「所有命名空间」即采集全集群;未勾选时仅采集所选命名空间。', appLabelSource: 'app 标签取值来源', appSourcePlaceholder: '留空 = 默认(controller 名回退链)', appSourceHint: '默认按 app.kubernetes.io/name → app → controller 名 → pod 名 回退;集群自定义标签(如 k8s.kuboard.cn/name)填此处优先。', 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: '只保留 app 命中这些值的日志(action: keep),是控制日志量最直接的手段。', logPathHint: 'Sidecar 需共享日志卷或专用 logs 目录;保存后点击「部署」生效。', // ── 主机模式:结构化采集项(B 档) ── jobs: { title: '日志采集项', hint: '每个采集项对应一个 promtail job;每个目录填写一个路径。保存后点击「部署」下发。', add: '添加采集项', remove: '删除采集项', namePlaceholder: 'job 名称,如 app-api', paths: '日志路径(逗号分隔,支持 glob)', systemPathsPlaceholder: '留空 = 自动使用该主机实际存在的系统日志', systemBadge: '系统日志 · 自动时间戳', labels: '附加标签(key=value,逗号分隔)', advanced: '高级:多行合并 / JSON / 时间戳 / 丢弃 / 限流', system: '系统日志(自动选 ISO8601/传统格式)', json: 'JSON 解析', multiline: '多行合并(Java 堆栈)', timestamp: '自定义时间戳', maxLinesPlaceholder: '最大行数 128', tsSourcePlaceholder: '字段名,如 time', tsLocationPlaceholder: '时区,如 Asia/Shanghai', dropIfMatch: '命中即丢弃(正则,逗号分隔)', dropIfMatchPlaceholder: '留空不丢;如 "status":200', ratePlaceholder: '限流 rate(默认 2000)', burstPlaceholder: '限流 burst(默认 4000)', hostInfo: '上次安装探测:主机名 {{host}},系统日志格式 {{format}}', }, preview: { button: '预览 YAML', loading: '渲染中…', failed: '预览失败', title: '将要下发的 promtail.yaml', description: '仅预览,不保存且不下发;确认无误后点击「保存」→「部署」。', copy: '复制', copied: '已复制', close: '关闭', }, save: '保存', saving: '保存中…', validation: { nameRequired: '请输入采集策略名称', }, }, } export default collectors