|
|
@@ -1,1438 +1,1438 @@
|
|
|
-# -*- coding: utf-8 -*-
|
|
|
-"""中→英 翻译层 (2026-08-28 用户令: 英文版系统, 给东南亚客户).
|
|
|
-
|
|
|
-不是通用机翻 —— 是这套系统的**领域词表**。做法上有三条硬约束:
|
|
|
-
|
|
|
-1. **最长匹配优先**。"报警级"必须先于"报警"匹配, 否则译出 "Alarm级";
|
|
|
- "主轴承温度" 先于 "主轴承"。词表按 key 长度倒序编译成一条正则。
|
|
|
-2. **术语用行业通行译法, 不直译**。等效满发小时=EFLH 不是 "equivalent full hair";
|
|
|
- 限电=curtailment 不是 "power limit"; 定论=Confirmed 不是 "final verdict"。
|
|
|
-3. **数字与标识符不动**。台号 WTG29、报警码 3225、单位 MWh/kW/h 原样保留。
|
|
|
-
|
|
|
-覆盖策略: 先 UI 骨架(导航/标题/表头/按钮/指标名), 再判据与状态词, 再说明文字。
|
|
|
-未覆盖的中文会在 audit_untranslated() 里被列出来 —— 残留必须收敛到零, 因为
|
|
|
-给外方客户看的页面里出现半句中文, 比整页中文更糟。
|
|
|
-"""
|
|
|
-import re
|
|
|
-
|
|
|
-# ── 1 导航与页面骨架 ──
|
|
|
-NAV = {
|
|
|
- '观澜': 'Guanlan', '如东海上': 'Offshore Fleet',
|
|
|
- '风电智能分析决策': 'Wind Fleet Analytics and Decision Support',
|
|
|
- '风电智能': 'wind fleet intelligence',
|
|
|
- '总览': 'Overview', '电量算账': 'Energy Accounting', '部件问题': 'Component Issues',
|
|
|
- '振动融合分析': 'Vibration Fusion', '发电性能': 'Performance Curves',
|
|
|
- '故障统计': 'Fault Analytics', '检修决策': 'Maintenance Decisions',
|
|
|
- '检修助手': 'Maintenance Assistant', '汇报定制': 'Report Builder', '系统维护': 'Data Sources',
|
|
|
-}
|
|
|
-
|
|
|
-# ── 2 设备状态与判级 (windcms 两套并行体系) ──
|
|
|
-STATE = {
|
|
|
- '危险': 'Critical', '报警级': 'Alarm level', '报警': 'Alarm', '良好': 'Good', '优秀': 'Excellent',
|
|
|
- '不可判': 'Indeterminate', '监测不可用': 'Monitoring unavailable', '无监测': 'Not monitored',
|
|
|
- '定论·双模审': 'Confirmed · dual-model review', '定论': 'Confirmed',
|
|
|
- '准定论·预警': 'Near-confirmed · warning', '准定论': 'Near-confirmed',
|
|
|
- '预警·处置升急': 'Warning · escalate', '预警·处置规划': 'Warning · plan action', '预警': 'Warning',
|
|
|
- '候选·监视(复发)': 'Candidate · watch (recurring)', '候选·跟踪': 'Candidate · tracking',
|
|
|
- '候选观察': 'Candidate / watch', '候选': 'Candidate',
|
|
|
- '销案(定论)': 'Closed (confirmed)', '销案正常': 'Closed · normal', '销案': 'Closed',
|
|
|
- '监视(不开箱)': 'Watch (no teardown)', '监视': 'Watch', '观察(发电机侧)': 'Watch (generator side)',
|
|
|
- '观察': 'Watch', '参考': 'Reference', '未列': 'Not covered', '未收录': 'not covered',
|
|
|
- '正样本': 'Positive control', '仲裁输入': 'Arbitration input', '弱同向新证': 'Weak concurring evidence',
|
|
|
- '本体无新证': 'No new evidence on component', '复发候选(两轴合并)': 'Recurrence candidate (two axes merged)',
|
|
|
- '温度单轴保留': 'Temperature axis retained', '传感器项': 'Sensor issue', '可降': 'Downgradable',
|
|
|
- '降观察': 'Downgraded to watch', '在升': 'rising', '未闭环': 'not closed', '已闭环': 'closed loop',
|
|
|
- '筛查级': 'screening level', '双模审': 'dual-model review', '审级': 'review tier',
|
|
|
- 'lite审': 'lite review', '设备状态': 'Equipment state', '证据状态': 'Evidence state',
|
|
|
-}
|
|
|
-
|
|
|
-# ── 3 部件与系统 ──
|
|
|
-PART = {
|
|
|
- '主轴承(后)+集中润滑泵': 'Main bearing (rear) + centralised lubrication pump',
|
|
|
- '齿轮箱二级行星内齿圈': 'Gearbox 2nd-stage planetary ring gear',
|
|
|
- '齿轮箱谱线级未映射到部件': 'Gearbox · spectral line not mapped to component',
|
|
|
- '发电机引用同族见族主台': 'Generator · family reference, see lead unit',
|
|
|
- '主轴承后集中润滑泵': 'Rear main-bearing lubrication pump',
|
|
|
- '齿轮箱高速轴': 'Gearbox high-speed shaft', '齿轮箱中间轴': 'Gearbox intermediate shaft',
|
|
|
- '主控与传感网': 'Main controller and sensor network', '变桨与液压': 'Pitch and hydraulics',
|
|
|
- '塔架与基础': 'Tower and foundation', '塔架/结构': 'Tower / structure', '轮毂/叶片': 'Hub / blades',
|
|
|
- '叶片与叶根': 'Blades and blade roots', '集中润滑泵': 'Centralised lubrication pump',
|
|
|
- '电网/供电(外部)': 'Grid supply (external)', '风况(外部)': 'Wind conditions (external)',
|
|
|
- '无记录停机': 'Unattributed downtime', '运维操作': 'OandM actions', '未归类': 'Unclassified',
|
|
|
- '主轴承': 'Main bearing', '齿轮箱': 'Gearbox', '发电机': 'Generator', '变流器': 'Converter',
|
|
|
- '变桨': 'Pitch', '偏航': 'Yaw', '叶片': 'Blade', '塔架': 'Tower', '主控': 'Main controller',
|
|
|
- '轮毂': 'Hub', '油缸': 'Cylinder', '油泵': 'Pump', '测点': 'measurement point',
|
|
|
-}
|
|
|
-
|
|
|
-# ── 4 指标与口径 ──
|
|
|
-METRIC = {
|
|
|
- '等效满发小时': 'Equivalent full-load hours', '时间可用率': 'Time-based availability',
|
|
|
- '平均停机间隔': 'Mean time between outages', '上网电量': 'Net exported energy',
|
|
|
- '理论可发': 'Gross available energy', '实际上网': 'Net exported', '损失率': 'Loss ratio',
|
|
|
- '需行动机组': 'Units requiring action', '停机时长': 'Downtime hours', '停机事件数': 'Outage count',
|
|
|
- '设备类停机': 'Equipment downtime', '外部类停机': 'External downtime', '总停机': 'Total downtime',
|
|
|
- '影响台数': 'Units affected', '事件数': 'Events', '停机': 'Downtime', '损失': 'Loss',
|
|
|
- '限电·绑定': 'Curtailment (bound)', '限电命令·未绑定': 'Curtailment order (unbound)',
|
|
|
- '停机(调度令)': 'Dispatch-ordered stop', '低风待机': 'Low-wind standby', '正常发电': 'Normal production',
|
|
|
- '限电': 'Curtailment', '工况态': 'Operating state', '占比': 'share', '时长': 'duration',
|
|
|
- '条数': 'count', '次数': 'count', '台数': 'units', '全场': 'fleet', '本台': 'this unit',
|
|
|
- '数据覆盖': 'data coverage', '不满月': 'partial month', '窗内': 'in window', '窗末': 'window end',
|
|
|
- '证据窗': 'evidence window', '判级窗': 'grading window', '时间窗': 'Time window', '口径': 'basis',
|
|
|
-}
|
|
|
-
|
|
|
-# ── 5 动作与流程 ──
|
|
|
-ACTION = {
|
|
|
- '从证据到验收的决策链': 'decision chain from evidence to verification',
|
|
|
- '决策链进度盘': 'Decision chain status', '决策链': 'Decision chain',
|
|
|
- '证据': 'Evidence', '机制': 'Mechanism', '判级': 'Grading', '排期': 'Scheduling',
|
|
|
- '动作': 'Action', '验收': 'Verification', '卡在': 'held at', '下一步': 'Next step',
|
|
|
- '抢修': 'Corrective', '预防性维护': 'Preventive', '故障树': 'Fault tree', '排程': 'Scheduling',
|
|
|
- '工单': 'work order', '换件': 'replacement', '更换': 'replace', '检修': 'maintenance',
|
|
|
- '闭环': 'closed loop', '端到端闭环': 'end-to-end closed loop', '派工': 'dispatch work',
|
|
|
- '现场': 'site', '台账': 'ledger', '复测': 'retest', '核实': 'verify', '待审批': 'pending approval',
|
|
|
-}
|
|
|
-
|
|
|
-# ── 6 高频术语补齐 (2026-08-28 按渲染后残留统计倒排补, 长词在前靠正则长度排序保证) ──
|
|
|
-MORE = {
|
|
|
- # 测量与证据面
|
|
|
- '振动结论': 'vibration verdict', '振动信号': 'vibration signature', '振动线转录': 'from vibration line',
|
|
|
- '振动线未收录': 'not covered by vibration line', '振动线': 'vibration line', '振动分析': 'Vibration analysis',
|
|
|
- '振动': 'vibration', '温度通道': 'temperature channel', '温度轴': 'temperature axis',
|
|
|
- '温度判': 'temperature verdict', '温度候选': 'temperature candidate', '温度': 'temperature',
|
|
|
- '润滑柱塞': 'lubrication plunger', '润滑': 'lubrication', '油末样': 'last oil sample',
|
|
|
- '油新鲜': 'oil sample fresh', '油样轴': 'oil sample axis', '油液': 'oil analysis',
|
|
|
- '油脂水平低': 'grease level low', '油路与密封': 'oil circuit and seals', '末样': 'last sample',
|
|
|
- '无样': 'no sample', '取样': 'sampling', '化验': 'laboratory analysis', '华标': 'lab',
|
|
|
- # 窗与统计
|
|
|
- '窗区间': 'window range', '判级窗': 'grading window', '单次循环时长': 'cycle duration',
|
|
|
- '单次循环': 'cycle', '逐月': 'monthly', '月度': 'monthly', '现水平': 'current level',
|
|
|
- '轨迹': 'trend', '中位': 'median', '样本': 'sample', '总条数': 'total events',
|
|
|
- '记基线观察': 'baseline recorded, watching', '记基线': 'baseline recorded',
|
|
|
- '窗至': 'window through', '未提供': 'not provided', '数据时点': 'data as of',
|
|
|
- '个月': ' months', '天数': 'days', '占时': 'time share', '累计': 'cumulative',
|
|
|
- # 机制与判据
|
|
|
- '根因定到部件与失效模式': 'root cause identified to component and failure mode',
|
|
|
- '取样把根因定到部件与失效模式': 'sample to identify root cause to component and failure mode',
|
|
|
- '机制不清则排期与动作都无依据': 'without a mechanism, neither scheduling nor action has a basis',
|
|
|
- '同一判据是否回落': 'whether the same criterion falls back',
|
|
|
- '历史单不对应本次问题': 'historical orders do not correspond to this finding',
|
|
|
- '本轮动作执行后复测': 'retest after this round of action',
|
|
|
- '须向现场核实': 'requires site verification', '未定性': 'not characterised', '定性': 'characterisation',
|
|
|
- '未排': 'not scheduled', '未验': 'not verified', '已达': 'complete', '全通': 'all clear',
|
|
|
- '两者非同源': 'the two are not from the same source', '负面对照': 'negative control',
|
|
|
- '代理轴': 'proxy axis', '判别器': 'discriminator', '判据': 'criterion', '判': 'verdict',
|
|
|
- # 部件细分
|
|
|
- '叶根螺栓': 'blade-root bolts', '换栓': 'bolt replacement', '螺栓断裂': 'bolt fracture',
|
|
|
- '非螺栓断裂确诊': 'not a confirmed bolt fracture', '松动嫌疑': 'suspected loosening', '松动': 'loosening',
|
|
|
- '塔筒湿度': 'tower humidity', '湿度高告警': 'high-humidity alarm', '蓄能与压力调节': 'accumulator and pressure control',
|
|
|
- '蓄能': 'accumulator', '液压': 'hydraulics', '执行与位置反馈': 'actuation and position feedback',
|
|
|
- '驱动': 'drive', '轴承与': 'bearing and', '轴承': 'bearing', '逆变器通讯错误': 'inverter communication error',
|
|
|
- '点名该叶断裂': 'names this blade as fractured', '叶断裂': 'blade fracture',
|
|
|
- # 报表与流程
|
|
|
- '评估报告': 'assessment report', '分册另含': 'the volume also contains', '沙盘': 'scenario model',
|
|
|
- '情景': 'Scenario', '排查': 'investigation', '处置': 'action', '步骤': 'steps',
|
|
|
- '明细': 'detail', '综合': 'combined', '近况': 'recent status', '逐台情况': 'per-unit status',
|
|
|
- '融合矩阵': 'fusion matrix', '矩阵': 'matrix', '链盘': 'chain board', '能力边界': 'capability limits',
|
|
|
- '能力': 'capability', '色标': 'colour key', '收录台': 'units covered', '机制链': 'mechanism chain',
|
|
|
- '用户令': 'per client request', '语义类': 'semantic class', '四维': 'four-source',
|
|
|
- '风险': 'risk', '双轴': 'dual-axis', '外部': 'external', '记录': 'record', '源': 'source',
|
|
|
- '表': 'table', '级': ' level', '窗': 'window', '次': '', '条': '', '台': ' units',
|
|
|
- '第': 'No.', '月': '-', '日': '', '年': '', '前': 'fore', '后': 'aft', '侧': ' side',
|
|
|
- '与': ' and ', '无': 'none', '优': ' OK', '单': '', '末': 'last', '进': 'into',
|
|
|
- '部件': 'component', '机组': 'unit', '正常': 'normal', '本轮': 'this round',
|
|
|
- '不清则': 'without it, ', '都无依据': 'there is no basis', '执行后': 'after execution',
|
|
|
-}
|
|
|
-def _assert_quote_free():
|
|
|
- """译文不得含引号或反引号 (2026-08-28 活逮): 译文会被注入 JS 字符串与 HTML 属性,
|
|
|
- 一个撇号就让整块解析失败, 表现是"页面全空但每个 script 块单独检查都通过" — 极难定位。
|
|
|
- 构建期直接拦, 不留到运行时。"""
|
|
|
- bad = {k: v for k, v in TERMS.items()
|
|
|
- if isinstance(v, str) and any(c in v for c in ('\'', '"', '`', '\\', '&', '<', '>'))}
|
|
|
- if bad:
|
|
|
- raise ValueError(f'译文含引号/反斜杠, 会破坏注入上下文: {list(bad)[:5]}')
|
|
|
-
|
|
|
-
|
|
|
-GROUPS = [NAV, STATE, PART, METRIC, ACTION]
|
|
|
-TERMS = {}
|
|
|
-for g in GROUPS:
|
|
|
- TERMS.update(g)
|
|
|
-TERMS.update(MORE)
|
|
|
-# ── 8 第一阶段批量 (2026-08-28, 按渲染后残留频次倒排, 长词优先写以免被短词截断) ──
|
|
|
-TERMS.update({
|
|
|
- # 长复合词组先写 (正则按长度排序, 这里的顺序只影响可读性)
|
|
|
- '出带且过锚才算离群': 'outlier only if outside the band and past the anchor',
|
|
|
- '同型机群残差': 'residual vs same-type fleet', '物理绝对锚': 'physical absolute anchor',
|
|
|
- '四分位残差带': 'inter-quartile residual band', '控制参数一致性': 'Control-parameter consistency',
|
|
|
- '只作回测锚非现时': 'back-test anchor only, not current-state evidence',
|
|
|
- '不足或监测中断': 'insufficient or monitoring interrupted',
|
|
|
- '旁路过滤器齿': 'bypass filter · gearbox', '油压力高激活': 'oil pressure high · activated',
|
|
|
- '油压力过高': 'oil pressure too high', '各油水位检': 'oil/water level checks',
|
|
|
- '变压器绕组最高': 'transformer winding max', '变压器油温': 'transformer oil temperature',
|
|
|
- '变压器室': 'transformer room', '集线器通信错误': 'hub communication error',
|
|
|
- '同油温档带宽': 'bandwidth within the same oil-temperature bin',
|
|
|
- '就地操作模式': 'local operation mode', '电网故障穿越': 'grid fault ride-through',
|
|
|
- '转速传感器故障': 'speed sensor fault', '电池电压低': 'battery voltage low',
|
|
|
- '电网停电': 'grid outage', '降功率运行': 'derated operation', '此速率触': 'at this rate triggers',
|
|
|
- '测风故障计数': 'anemometer fault count', '风速计偏置': 'anemometer bias',
|
|
|
- '测风计数': 'anemometer count', '采样时间线': 'sampling timeline',
|
|
|
- '不随上方': 'independent of the selector above', '时可作现时': 'usable as current evidence when',
|
|
|
- '轻微偏离': 'slight deviation', '新出现待': 'newly appeared, pending',
|
|
|
- '基本确认': 'largely confirmed', '可继续使用': 'may remain in service',
|
|
|
- '机械刹车': 'mechanical brake', '油鼓风机': 'oil blower', '柜排风': 'cabinet exhaust',
|
|
|
- '塔振模块': 'tower vibration module', '电气滑环': 'electrical slip ring', '滑环故障': 'slip-ring fault',
|
|
|
- '缸检超时': 'cylinder check timeout', '缸超时': 'cylinder timeout', '比例阀': 'proportional valve',
|
|
|
- '通讯故障': 'communication fault', '油位过低': 'oil level too low', '油位低': 'oil level low',
|
|
|
- '自动重启': 'auto restart', '执行中': 'in progress', '双温差': 'dual temperature difference',
|
|
|
- '频发易修': 'frequent but quick to fix', '罕发难修': 'rare but slow to fix',
|
|
|
- '等效满发': 'equivalent full-load', '叶尖速比': 'tip-speed ratio', '天归一': 'per-day normalised',
|
|
|
- # 部件与测点
|
|
|
- '高速轴': 'high-speed shaft', '中间轴': 'intermediate shaft', '中速轴': 'intermediate-speed shaft',
|
|
|
- '行星': 'planetary', '齿圈': 'ring gear', '内圈': 'inner race', '外圈': 'outer race',
|
|
|
- '滑环': 'slip ring', '转子': 'rotor', '定子': 'stator', '主轴': 'main shaft', '主承': 'main bearing',
|
|
|
- '柱塞': 'plunger', '滤芯': 'filter element', '冷却器': 'cooler', '油管': 'oil line',
|
|
|
- '分配器': 'distributor', '桨叶': 'blade', '传动链': 'drivetrain', '塔筒': 'tower',
|
|
|
- '油温': 'oil temperature', '油样': 'oil sample', '总线': 'bus', '备件': 'spare parts',
|
|
|
- '两端': 'both ends', '配对差': 'paired difference', '中速': 'intermediate speed',
|
|
|
- '高速': 'high speed', '中间': 'intermediate',
|
|
|
- # 判据与统计
|
|
|
- '离群': 'outlier', '谱线': 'spectral line', '残差': 'residual', '灰域': 'shaded band',
|
|
|
- '四分位': 'quartile', '逐档': 'per bin', '最小档': 'smallest bin', '显著门': 'significance threshold',
|
|
|
- '归因': 'attribution', '观测面': 'observation face', '监测面': 'monitoring coverage',
|
|
|
- '没测到': 'not detected', '宽带': 'broadband', '全净': 'entirely clean', '干净': 'clean',
|
|
|
- '慢性': 'chronic', '持平': 'unchanged', '降至': 'fell to', '极差': 'range', '对数': 'log',
|
|
|
- '基线': 'baseline', '同族': 'same family', '引用同族': 'family reference', '族主': 'family lead',
|
|
|
- '新证': 'new evidence', '实测': 'measured', '实证': 'empirical evidence', '印证': 'corroboration',
|
|
|
- '检出': 'detection', '缺陷': 'defect', '疲劳': 'fatigue', '断裂': 'fracture', '过热': 'overheating',
|
|
|
- '欠发': 'under-performance', '故障率': 'fault rate', '可用率': 'availability', '象限': 'quadrant',
|
|
|
- '降序': 'descending', '噪声': 'noise', '特征': 'characteristic', '命中': 'match', '分组': 'grouping',
|
|
|
- '封顶': 'cap', '额定': 'rated', '功率': 'power', '风速': 'wind speed', '转速': 'rotor speed',
|
|
|
- '曲线': 'curve', '对风': 'yaw alignment', '对风良': 'yaw alignment OK', '对风报': 'yaw alignment alarm',
|
|
|
- '定向': 'orientation', '泄压': 'pressure relief', '加注': 'top-up', '紧固': 'tightening',
|
|
|
- '平均偏': 'mean deviation', '偏离': 'deviation', '偏置': 'bias',
|
|
|
- # 流程与界面
|
|
|
- '徽章': 'badge', '全位': 'all positions', '固定': 'fixed', '切换': 'switch', '映射到': 'mapped to',
|
|
|
- '映射': 'mapping', '聚合': 'aggregation', '典型': 'typical', '交叉': 'cross', '不参': 'excluded from',
|
|
|
- '可对': 'matchable', '不足': 'insufficient', '状态': 'status', '本件为': 'this item is',
|
|
|
- '可靠性': 'reliability', '重点值': 'key value', '宽限': 'grace', '边界': 'boundary',
|
|
|
- '调度令': 'dispatch order', '调度': 'dispatch', '监控': 'monitoring', '时序': 'time series',
|
|
|
- '用户裁': 'client decision', '用户逮': 'caught by client', '异常': 'anomaly', '悬停': 'hover',
|
|
|
- '能看': 'can see', '失败': 'failed', '手册': 'manual', '虚线': 'dashed', '差异': 'difference',
|
|
|
- '限制': 'limit', '问题': 'issue', '新发': 'newly found', '发电': 'generation', '设备类': 'equipment',
|
|
|
- '设备': 'equipment', '融合': 'fusion', '输入': 'input', '本场': 'this site', '节点': 'node',
|
|
|
- '决策': 'decision', '详情': 'detail', '业主': 'owner', '评估': 'assessment', '撤回': 'withdrawn',
|
|
|
- '取消': 'cancelled', '定案': 'settled', '原文': 'source text', '清洁': 'clean', '重点': 'priority',
|
|
|
- '分账': 'attribution', '作业': 'work', '原因': 'cause', '参数': 'parameter', '类别': 'category',
|
|
|
- '本页': 'this page', '分钟': ' min', '结构': 'structure', '码统计': 'code statistics',
|
|
|
- '取证': 'evidence retrieval', '哪些': 'which', '修复': 'repair', '保留': 'retained',
|
|
|
- '警告': 'warning', '故障': 'fault', '运行': 'operating', '恢复': 'recovered', '事件': 'event',
|
|
|
- '变化': 'change', '检测': 'detection', '强烈': 'strong', '等待': 'waiting', '跳闸': 'trip',
|
|
|
- '传感器': 'sensor', '本地': 'local', '不是': 'not', '上网': 'exported', '指标': 'indicator',
|
|
|
- '用户': 'client', '的异常': ' anomaly', '时间': 'time',
|
|
|
-})
|
|
|
-
|
|
|
-# ── 9 第二阶段批量 ──
|
|
|
-TERMS.update({
|
|
|
- '正是算法当初的检出台': 'these are exactly the units the algorithm flagged',
|
|
|
- '明显超出即分布非峰': 'a clear excess means the distribution is not single-peaked',
|
|
|
- '选组件再点击移出': 'click a block again to remove it', '全程零外发': 'nothing leaves the site',
|
|
|
- '考核的只有': 'the only item under equipment accountability is',
|
|
|
- '交易策略主导': 'driven by trading strategy', '正态抽样的': 'for a normal sample, the',
|
|
|
- '落在几离散': 'sit at a few discrete positions', '环内怎么坏的': 'how it fails inside',
|
|
|
- '简图分工': 'schematic scope', '出脂计量': 'grease output metering', '喷淋回箱': 'spray return to tank',
|
|
|
- '急性热失效': 'acute thermal failure', '散热风扇': 'cooling fan', '手动待机': 'manual standby',
|
|
|
- '自动解缆': 'automatic cable untwist', '长停远': 'long stop, distant', '泵超时': 'pump timeout',
|
|
|
- '压力偏高': 'pressure high', '油压偏高': 'oil pressure high', '器储压': 'accumulator charge',
|
|
|
- '高频短时': 'frequent · short', '低频长时': 'rare · long', '高频长时': 'frequent · long',
|
|
|
- '低频短时': 'rare · short', '重复触发': 'repeat triggering', '非硬件': 'not hardware',
|
|
|
- '常坏且难修': 'frequent and slow to fix', '少发好修': 'rare and quick to fix',
|
|
|
- '关键少数': 'the vital few', '点面积': 'bubble area', '圆面积': 'circle area',
|
|
|
- '柱高': 'bar height', '纵界': 'vertical divider', '分界': 'divider', '本底': 'background',
|
|
|
- '采样格': 'sampling interval', '模式四': 'mode quadrant', '逐段扣损': 'losses deducted step by step',
|
|
|
- '两数都对': 'both figures are correct', '谁的': 'whose', '哪一': 'which',
|
|
|
- '关键少数': 'the vital few', '同档差': 'within-bin difference', '尺子巡检': 'yardstick check',
|
|
|
- '下期计划': 'Next-period plan', '季节性': 'seasonality', '控制策略': 'control strategy',
|
|
|
- '需跟踪': 'under tracking', '首发码': 'first alarm code', '测量链': 'measurement chain',
|
|
|
- '可维修性': 'maintainability', '帕累托': 'Pareto', '总结': 'summary', '分析': 'analysis',
|
|
|
- '生成': 'generate', '控制': 'control', '桨距': 'pitch angle', '吊装': 'lifting',
|
|
|
- '执行': 'execution', '版本': 'version', '审核': 'review', '盲区': 'blind spot',
|
|
|
- '保持常规': 'keep routine', '记为': 'recorded as', '截图逮': 'caught in screenshot',
|
|
|
- '间隔': 'interval', '交易': 'trading', '实际': 'actual', '要求': 'requirement',
|
|
|
- '物理': 'physical', '电网': 'grid', '海上': 'offshore', '对比': 'comparison',
|
|
|
- '建议': 'recommendation', '分母': 'denominator', '门槛': 'threshold', '相对': 'relative',
|
|
|
- '发现': 'finding', '完整': 'complete', '计数': 'count', '本体': 'ontology', '命令': 'command',
|
|
|
- '微视图': 'micro-view', '叶根': 'blade root', '解缆': 'cable untwist', '解剖图': 'anatomy',
|
|
|
- '支路': 'branch', '油路': 'oil circuit', '冷却': 'cooling', '信号': 'signal', '趋势': 'trend',
|
|
|
- '发生': 'occurrence', '平均': 'mean', '根因': 'root cause', '不作': 'not used as',
|
|
|
- '顶部': 'top', '特性': 'characteristic', '期望': 'expected', '佐证': 'corroborating',
|
|
|
- '满发': 'full load', '合计': 'total', '统计': 'statistics', '万元': ' k CNY',
|
|
|
- # 2026-09-19 变桨面零位两口径 (用户令「停机段中位、满发段中位两者分列出」) 的用词
|
|
|
- '满发段': 'full-load segment', '顺桨停机段': 'feathered stop segment', '顺桨段': 'feathered segment',
|
|
|
- '顺桨': 'feathered', '并列参考': 'for reference',
|
|
|
- '天气': 'weather', '对象': 'object', '读纪律': 'reading discipline', '分支': 'branch',
|
|
|
- '失效': 'failure', '全程': 'full window', '入口': 'entry point', '不同': 'different',
|
|
|
- '转录': 'transcribed', '强度': 'severity', '管理': 'management', '行动': 'action',
|
|
|
- '内有': 'contains', '接线': 'wiring', '过多': 'excessive', '油位': 'oil level',
|
|
|
- '允许': 'permitted', '度高': ' high', '以切入': 'to cut in', '不可能': 'not possible',
|
|
|
- '冲击量': 'impact magnitude', '路径': 'path', '电压': 'voltage', '下限': 'lower limit',
|
|
|
- '上限': 'upper limit', '远程': 'remote', '载体': 'carrier', '机舱风': 'nacelle anemometer',
|
|
|
- '对照': 'control', '纯图形': 'graphic-only', '复核': 'cross-check', '偏高': 'high',
|
|
|
- '严重': 'severe', '建议尽快': 'recommend prompt', '观测': 'observation', '缓升': 'slow rise',
|
|
|
- '回落': 'fall back', '回归': 'return', '同批': 'same batch', '增益': 'gain',
|
|
|
- '梯度': 'gradient', '周期主导': 'cycle-dominated', '急性': 'acute', '长期': 'long-term',
|
|
|
- '总长': 'total length', '最大': 'max', '测风': 'wind measurement', '其他': 'other',
|
|
|
- '显示': 'display', '支持': 'support', '范式': 'template', '完成': 'complete',
|
|
|
- '情况': 'status', '周期': 'cycle', '周报': 'Weekly', '专题': 'Topic', '改为': 'changed to',
|
|
|
- '三段': 'three segments', '基于': 'based on', '离线': 'offline', '看组件': 'view block',
|
|
|
- '调整顺序': 'reorder', '环比': 'month-on-month', '理论': 'theoretical', '低于': 'below',
|
|
|
- '分解': 'breakdown', '之差': 'difference', '比值': 'ratio', '命令期': 'command period',
|
|
|
- '被压制': 'suppressed', '风况': 'wind conditions', '不计': 'excluded', '交通': 'access',
|
|
|
- '影响': 'impact', '段点': 'segment point', '属重复触发': 'is repeat triggering',
|
|
|
- '总数': 'total', '瓶颈': 'bottleneck', '一列': 'column', '标量': 'scalar', '引用': 'citation',
|
|
|
- '上报版': 'Group-report version', '轻量': 'Light', '标准': 'Standard', '声明': 'declared',
|
|
|
- '其余': 'remaining', '时效': 'currency', '电费': 'tariff', '修完': 'repaired',
|
|
|
- '展示': 'presentation', '原来': 'previously', '该类': 'this class', '维护面': 'maintenance surface',
|
|
|
- '更新': 'update', '技术依': 'technical basis', '归属': 'attribution', '定规范': 'specification',
|
|
|
- '实机': 'as-built', '什么': 'what', '缺失非': 'missing, not', '修过': 'repaired before',
|
|
|
- '卡撤': 'card removed', '点看': 'click to view', '确诊': 'confirmed diagnosis',
|
|
|
- '扭缆': 'cable twist', '原则': 'principle', '滚子': 'roller', '标注': 'annotation',
|
|
|
- '集中': 'centralised', '管路': 'piping', '往复': 'reciprocating', '脂桶': 'grease drum',
|
|
|
- '主管路': 'main line', '冲击': 'impact', '铁谱': 'ferrography', '推动': 'drive',
|
|
|
- '压力': 'pressure', '带宽': 'bandwidth', '列宽有限': 'column width limited',
|
|
|
- '不可读': 'not legible', '双环': 'dual ring', '上下': 'top/bottom', '右下': 'bottom-right',
|
|
|
- '抖动': 'chatter', '刷屏': 'flooding', '左上': 'top-left', '右上': 'top-right',
|
|
|
- '治理': 'remediation', '左下': 'bottom-left', '维持': 'maintain', '类不计': 'class excluded',
|
|
|
- '贡献': 'contribution', '页缺': 'page missing', '并列': 'side by side', '迁入': 'moved in',
|
|
|
- '排布': 'layout', '工作': 'work', '早三': 'earliest three', '这三': 'these three',
|
|
|
- '人员转运': 'personnel transfer', '语义本体': 'semantic ontology', '滚动': 'scroll',
|
|
|
- '内容会外发': 'content is sent externally', '云端': 'Cloud', '物理闸': 'physical gate',
|
|
|
- '同一': 'same', '只有': 'only', '没有': 'no', '里的': ' in ', '的六': ' six ',
|
|
|
-})
|
|
|
-
|
|
|
-# ── 10 第三阶段: 上屏长尾 (统计已剥 JS 注释, 只补真正会显示的) ──
|
|
|
-TERMS.update({
|
|
|
- '选组件再点击移出': 'click a block again to remove it', '两数都对': 'both figures are correct',
|
|
|
- '样龄过期': 'sample age expired', '有效监测': 'effective monitoring', '能量过剩': 'excess energy',
|
|
|
- '绕组三相': 'winding three-phase', '通讯模块': 'communication module', '旁路阀': 'bypass valve',
|
|
|
- '跟踪偏差': 'tracking deviation', '数加权': 'count-weighted', '同标尺': 'same scale',
|
|
|
- '不随本': 'independent of this', '零外发': 'no external transmission', '加热带': 'heating band',
|
|
|
- '通信线': 'communication line', '出力': 'output', '错误': 'error', '不等于': 'is not',
|
|
|
- '分布': 'distribution', '持续': 'sustained', '通道': 'channel', '峰值': 'peak',
|
|
|
- '时段': 'period', '稳定': 'stable', '复合': 'composite', '结论': 'conclusion',
|
|
|
- '关注': 'watch', '稳态': 'steady-state', '瞬态': 'transient', '可信度': 'confidence',
|
|
|
- '现状': 'current state', '波形': 'waveform', '内容': 'content', '发作': 'episode',
|
|
|
- '如何': 'how', '联动': 'linked', '复位': 'reset', '激活': 'activated', '桨角': 'pitch angle',
|
|
|
- '柜左': 'cabinet left', '限需': 'limit required', '塔振': 'tower vibration', '该叶': 'this blade',
|
|
|
- '手动': 'manual', '电机': 'motor', '端别': 'end', '载荷': 'load', '缺采': 'sampling gap',
|
|
|
- '不在': 'not in', '断供': 'supply interruption', '高位': 'elevated', '度夏': 'summer operation',
|
|
|
- '磨损': 'wear', '不可': 'cannot', '不给等': 'no grade given', '有过一': 'has had one',
|
|
|
- '的多': ' more', '不代': 'does not represent', '五态': 'five states', '平铺': 'flat layout',
|
|
|
- '展现的': 'presented', '筛选': 'filter', '系数': 'coefficient', '计算隐藏': 'computation hidden',
|
|
|
- '所选': 'selected', '九枚举': 'nine enumerated values', '好坏': 'good/bad',
|
|
|
- '两轴不可互相替代': 'the two axes are not interchangeable', '明确定': 'explicitly defined',
|
|
|
- '截断的': 'truncated', '记忆': 'memory', '实心点': 'solid point', '季节': 'season',
|
|
|
- '尺子': 'yardstick', '数量': 'count', '推理': 'reasoning', '全部': 'all', '分开': 'separate',
|
|
|
- '剖面': 'section', '剖面符号': 'section symbol', '竖矩形': 'vertical rectangle',
|
|
|
- '一眼看出': 'shows at a glance', '偏差': 'deviation', '长度即幅度': 'length equals magnitude',
|
|
|
- '跨行可比': 'comparable across rows', '端口': 'port', '打开': 'open', '最高': 'highest',
|
|
|
- '提示': 'hint', '模式归类': 'mode classification', '拆检': 'teardown inspection',
|
|
|
- '内窥': 'borescope', '靠内窥镜': 'via borescope', '轻度损伤': 'minor damage',
|
|
|
- '轻微损伤': 'slight damage', '中等持续': 'moderate sustained', '点蚀在': 'pitting at',
|
|
|
- '当时的': 'at the time', '同样没看出': 'likewise not detected', '缺口': 'gap',
|
|
|
- '西门子': 'OEM', '非链路静默': 'not link silence', '风能利用系数': 'power coefficient Cp',
|
|
|
- '转矩': 'torque', '分册': 'volume', '取每': 'take each', '高位稳定值': 'upper stable value',
|
|
|
- '阶跃': 'step change', '配置变更': 'configuration change', '清洗': 'cleansing',
|
|
|
- '行程': 'travel', '泵压': 'pump pressure', '切入段': 'cut-in segment', '语义色': 'semantic colour',
|
|
|
- '现值': 'current value', '返服': 'return to service', '对不对得上': 'whether they match',
|
|
|
- '胶囊': 'pill', '只作回测锚': 'back-test anchor only', '术语去黑话': 'plain-language terms',
|
|
|
- '翻译': 'translation', '黑话': 'jargon', '内部': 'internal', '缩写': 'abbreviation',
|
|
|
- '括注': 'parenthetical', '健康': 'healthy', '排除': 'excluded', '降为': 'downgraded to',
|
|
|
- '仪器': 'instrument', '规范': 'specification', '打头': 'leading', '即可': 'is sufficient',
|
|
|
- '保持架': 'cage', '时域转': 'time-domain to', '有效值': 'RMS', '倍轴频': '× shaft frequency',
|
|
|
- '轴频': 'shaft frequency', '分位': 'percentile', '宽频带总量': 'broadband total',
|
|
|
- '阶跃上升': 'step rise', '缓慢上升': 'slow rise', '回到常态': 'back to normal',
|
|
|
- '该批主': 'batch lead', '性组': ' group', '沿链': 'along the chain', '最高点': 'peak point',
|
|
|
- '成分主导': 'component-dominated', '突发': 'sudden', '主要': 'main', '位于': 'located at',
|
|
|
- '族分布堆叠': 'family distribution stack', '族分布': 'family distribution', '段宽': 'segment width',
|
|
|
- '总和恒': 'sum constant', '段内比例': 'within-segment share', '族构成': 'family composition',
|
|
|
- '最短': 'shortest', '保证可': 'ensures', '最多': 'at most', '汇报端口': 'reporting portal',
|
|
|
- '客户汇报': 'client reporting', '定制化': 'customised', '决定': 'determines',
|
|
|
- '六核心数': 'six headline figures', '用大字直出': 'shown in large type', '下沉到': 'pushed down to',
|
|
|
- '一屏也拿得到结论': 'the first screen already carries the conclusion', '每数字带': 'each figure carries',
|
|
|
- '结论可回溯到': 'conclusions trace back to', '组件': 'block', '主题': 'theme',
|
|
|
- '收尾': 'closing', '能量瀑布': 'energy waterfall', '用于定位电量流向': 'locates where energy went',
|
|
|
- '回答': 'answers', '分出': 'separates', '方向相反': 'opposite directions', '区分': 'distinguishes',
|
|
|
- '排序会误定': 'ranking would mis-set', '的历史例证': ' historical evidence',
|
|
|
- '证明这链是通的': 'proves the chain works end to end', '下期': 'next period',
|
|
|
- '推出的': 'derived', '套话': 'boilerplate', '性质': 'nature', '常驻': 'always on',
|
|
|
- '补充文字结论': 'adds a written conclusion', '供汇报使用': 'for reporting use',
|
|
|
- '空白': 'blank', '默认空': 'empty by default', '都去掉': 'all removed', '组合': 'combination',
|
|
|
- '一张图': 'one chart', '就是一块': 'is one block', '退化为': 'reduced to',
|
|
|
- '客户看到的是负担': 'the client sees a burden', '长度天然由客户': 'length is set by the client',
|
|
|
- '交互界面设计一下': 'interaction design', '区不浮动': 'fixed, not floating',
|
|
|
- '的叙事顺序分五组': 'grouped in five by report narrative order',
|
|
|
-})
|
|
|
-
|
|
|
-# ── 11 第四阶段: 整句界面文案 (按 HTML 标签切分后的中文段, 标签本身不入表) ──
|
|
|
-TERMS.update({
|
|
|
- '(本页按段做可靠性指标须成段, 能量账按逐条工况态算电量): 两个数都对, 不可互相相减。':
|
|
|
- ' (this page needs contiguous segments for reliability metrics; the energy account bills state by state). Both figures are correct and must not be subtracted from one another.',
|
|
|
- '短于 1h 的停机段': 'stops shorter than 1 h',
|
|
|
- '差额是': 'the difference is ',
|
|
|
- '限电前干净窗 — 2026 起交易策略主导, 曲线与控制参数含策略性少发不可作设备判据。本页含特性曲线与控制参数一致性两件, 同窗':
|
|
|
- 'Pre-curtailment clean window — from 2026 trading strategy dominates, so curves and control parameters contain strategic under-generation and cannot serve as equipment criteria. This page holds both characteristic curves and control-parameter consistency, on the same window.',
|
|
|
- '由另一本地模型基于': 'Reviewed by a second local model against ',
|
|
|
- '同一份证据': 'the same evidence',
|
|
|
- '复核上述答案。溯源核验仅校验数字与机组号是否越界, 本项校验结论是否有证据支撑。':
|
|
|
- '. The traceability check only verifies that figures and unit numbers stay within the evidence; this check asks whether the conclusion is supported at all.',
|
|
|
- '右下角的码不要按条数排优先级': 'Do not rank the bottom-right codes by event count',
|
|
|
- ' — 属重复触发, 非硬件故障。上面两张帕累托对照看即此图的两条投影。':
|
|
|
- ' — they are repeat triggering, not hardware faults. The two Pareto charts above are this figure projected onto each axis.',
|
|
|
- '总览内嵌页在快照版中不可用 (它由系统实时渲染)。本快照的分析内容在上方各标签页内, 数据已随快照固化。':
|
|
|
- 'The embedded overview is unavailable in the snapshot (it is rendered live by the system). The analysis in this snapshot is in the tabs above, with data frozen at capture time.',
|
|
|
- '海上机组 MDT 普遍偏高是': 'Offshore MDT is generally inflated by ',
|
|
|
- '交通窗口': 'vessel access windows',
|
|
|
- '决定的, 不等于维修本身慢 — 跨场比 MDT 须同为海上。':
|
|
|
- ', not by slow repair work — comparing MDT across sites requires both to be offshore.',
|
|
|
- '这是两个指标的设计差异不是错, 但两者不可直接相乘或互推。低风待机对损失的贡献仅 118 MWh(0.5%)':
|
|
|
- 'This is a design difference between two indicators, not an error, but they cannot be multiplied or derived from one another. Low-wind standby contributes only 118 MWh (0.5%) of losses.',
|
|
|
- '不是物理判据: 正常数据下必然通过。它的作用是当损失被高估到不可能时(台账数字虚高曾把损失写成超过全停上限)立刻拦下':
|
|
|
- 'Not a physical criterion: with sound data it always passes. Its purpose is to stop an impossible loss figure at once — an inflated ledger once recorded a loss larger than a full fleet stop.',
|
|
|
- '故障前能看见、换件后能看见恢复': 'visible before failure and visible as recovery after replacement',
|
|
|
- ', 这条链是通的; 闭环成功的台会从盘面消失。':
|
|
|
- ' — the chain works end to end, and units that close the loop drop off this board.',
|
|
|
- '点面积=影响台数(大=批次共性, 小=单台); 横界=条数中位, 纵界=10min(一个SCADA采样格)。':
|
|
|
- 'Bubble area = units affected (large = fleet-wide pattern, small = single unit); the vertical divider is the count median, the horizontal one 10 minutes — one SCADA sampling interval.',
|
|
|
- '明显超出即分布非单峰': 'a clear excess means the distribution is not single-peaked',
|
|
|
- ' — 与左图的分组互为印证; 落在期望附近的轴(额定桨角)则是连续分布。':
|
|
|
- ' — corroborating the grouping on the left; an axis near the expected value (rated pitch angle) is continuously distributed.',
|
|
|
- '四个观测面是': 'The four observation faces are ',
|
|
|
- '同一条机制链的四个面': 'four faces of a single mechanism chain',
|
|
|
- ', 不算四个独立源 — 加权时不可当多源印证。':
|
|
|
- ', not four independent sources — they must not be weighted as multi-source corroboration.',
|
|
|
- '要走六步。这张盘不讲某一台的故事, 用于确认': 'Six steps in all. This board tracks the fleet, not one unit; it confirms ',
|
|
|
- '当前需处置机组、各自所处环节、后续动作': 'which units need action, the step each is held at, and what comes next',
|
|
|
- '不成立 — 前 72h 有报警不等于该报警与本段停机有因果 (双模审 2026-08-28 逮)。':
|
|
|
- 'does not hold — an alarm within the preceding 72 h does not make it the cause of this stop (caught in dual-model review, 2026-08-28).',
|
|
|
- '本地模型依据需求选取组件, 并基于实测数据生成运行总结; 数据不出本地':
|
|
|
- 'A local model selects blocks from your request and writes an operations summary from measured data; nothing leaves this machine',
|
|
|
- '可靠性口径 ≥1h 段, 电量账为逐条工况态 — 两个数都对, 不可相减':
|
|
|
- 'reliability counts stops ≥1 h; the energy account bills state by state — both are correct and must not be subtracted',
|
|
|
- '统计期 / 残月 / 工单窗 / 判级性质 — 建议常驻, 没有边界的数字堆不能作汇报依据':
|
|
|
- 'Reporting period / partial months / work-order window / nature of the grading — recommended always on; a set of figures without its boundaries cannot serve as a reporting basis',
|
|
|
- '六个核心数: 上网电量 / 等效满发 / 可用率 / 损失率 / 停机间隔 / 需行动台':
|
|
|
- 'Six headline figures: net exported / equivalent full-load hours / availability / loss ratio / mean time between outages / units requiring action',
|
|
|
- '两侧不是两个独立源, 是同一条机制链的两端。':
|
|
|
- 'The two sides are not independent sources; they are two ends of one mechanism chain.',
|
|
|
- '工况态分解; 损失=同工况理论出力与实测之差。量级自检为防虚高的下限闸, 不是风资源判据':
|
|
|
- 'Operating-state decomposition; loss = theoretical output under the same conditions minus measured. The magnitude self-check is a floor gate against inflation, not a wind-resource criterion',
|
|
|
- '限电属交易与调度侧, 2026 起交易策略主导, 少发未必是弃风。':
|
|
|
- 'Curtailment sits with trading and dispatch; from 2026 trading strategy dominates, so reduced generation is not necessarily spilled wind.',
|
|
|
- '由振动/温度/润滑/油液四源融合得出; 行动等级由综合报告出具':
|
|
|
- 'derived by fusing vibration, temperature, lubrication and oil analysis; action levels are issued by the consolidated report',
|
|
|
- ' — 损失六成在交易与调度侧, 设备侧改善空间有限':
|
|
|
- ' — six tenths of losses sit with trading and dispatch; the scope for equipment-side improvement is limited',
|
|
|
- ' — 台账止 2024-11, 本期检修执行与闭环无法自动判定':
|
|
|
- ' — the ledger ends 2024-11, so maintenance execution and loop closure for this period cannot be determined automatically',
|
|
|
- '这是配置/版本差异的形状; 磨损或工况引起的会是连续散布。两轴各自成组且分组不同台':
|
|
|
- 'This is the shape of a configuration or version difference; wear or operating conditions would scatter continuously. The two axes group independently and the groups hold different units',
|
|
|
- '文档预览窗 — 从上面的组件库点选内容, 此处显示报告预览':
|
|
|
- 'Document preview — select blocks from the library above and the report appears here',
|
|
|
- '条数=发生频次, 不反映影响程度 — 高频短时报警码(信号抖动或重复触发)排序靠前':
|
|
|
- 'Count = frequency, not severity — high-frequency short-duration codes (signal chatter or repeat triggering) rank first',
|
|
|
- '格子颜色 = 设备状态 (业主口径, 与 windcms 报告同一套):':
|
|
|
- 'Cell colour = equipment state (owner convention, same set as the assessment report):',
|
|
|
- '海上作业天气窗 · 近12月可作业日 (公开再分析统计, 非派工依据)':
|
|
|
- 'Offshore weather windows · workable days over the last 12 months (public reanalysis statistics, not a dispatch basis)',
|
|
|
- '排期沙盘 · 四情景损失对比 (万元, 电价区间中值; 建议级待人裁)':
|
|
|
- 'Scheduling model · four-scenario loss comparison (k CNY, mid-point of the tariff range; advisory, pending human decision)',
|
|
|
- '主轴承集中润滑链: 润滑泵经管路到分配器, 分配器柱塞往复把脂定量送到前后主轴承':
|
|
|
- 'Main-bearing centralised lubrication: the pump feeds a distributor through piping, and the distributor plungers meter grease to the fore and aft main bearings',
|
|
|
- '变桨系统: 蓄能器储压经比例阀推动油缸, 油缸驱动变桨轴承转动桨叶; 滑环传电与信号':
|
|
|
- 'Pitch system: accumulator pressure drives the cylinder through a proportional valve, the cylinder turns the pitch bearing and blade; the slip ring carries power and signals',
|
|
|
- '过热类失效沿油路查(冷却/滤芯), 磨损类沿齿轮线查(振动/铁谱)。':
|
|
|
- 'Overheating failures are traced along the oil circuit (cooling, filters); wear failures along the gear line (vibration, ferrography).',
|
|
|
- '执行侧看桨距跟踪偏差, 三叶不一致指向单支路。':
|
|
|
- 'On the actuation side look at pitch tracking deviation; disagreement between the three blades points to a single branch.',
|
|
|
- '观测: 蓄能带宽/停机泄压 · 桨距跟踪偏差 · 三叶零位一致性 · 轴承润滑脂':
|
|
|
- 'Observed: accumulator bandwidth / shutdown pressure relief · pitch tracking deviation · three-blade zero consistency · bearing grease',
|
|
|
- '窗内无该部件工单 (工单数据止 2024-11, 2026 类窗必空 = 数据边界)':
|
|
|
- 'No work order for this component in the window (order data ends 2024-11, so any 2026 window is necessarily empty — a data boundary)',
|
|
|
- '每个源给出: 当前覆盖 / 末次更新 / 约定位置 / 摄入命令 / 更新频率 / 责任方。':
|
|
|
- 'Each source states: current coverage / last updated / agreed location / ingest command / update frequency / owner.',
|
|
|
- '转录自振动线, ': 'Transcribed from the vibration line, ',
|
|
|
- '不随上方时间窗变': 'independent of the time window above',
|
|
|
- '; 报警/工单/温度列才跟随所选窗。': '; only the alarm, work-order and temperature columns follow the selected window.',
|
|
|
- '本码无手册处置条目 (手册覆盖本场 161/322 码) — 需查图纸或联系厂商支持。':
|
|
|
- 'No manual procedure for this code (the manual covers 161 of 322 codes on this site) — consult drawings or contact OEM support.',
|
|
|
- '非厂商绑定 — 现场以铭牌与图纸复核; 参数 ID 与告警码是不同命名空间, 未按同号关联。':
|
|
|
- 'Not vendor-locked — verify on site against nameplates and drawings; parameter IDs and alarm codes are separate namespaces and are not linked by number.',
|
|
|
- '状态管理判级, 不代表确诊数量; 判据/谱线/计算过程不在本页 — 深潜走底部独立系统。':
|
|
|
- 'State-management grading; it is not a count of confirmed diagnoses. Criteria, spectral lines and computation are not on this page — use the dedicated system below for depth.',
|
|
|
- '语义本体 · 对象/机制/决策/约束 (Palantir 思路轻量自建; 判读纪律=写入闸, 违反写不进库)':
|
|
|
- 'Semantic ontology · objects / mechanisms / decisions / constraints (lightweight, Palantir-style; the reading discipline is enforced as a write gate — violations cannot enter the store)',
|
|
|
- '检修决策 · ontology 展现的窗口 (语义本体 + dsh 编排; 推理无界, 结论受闸)':
|
|
|
- 'Maintenance decisions · the ontology view (semantic ontology with orchestration; reasoning is open, conclusions are gated)',
|
|
|
- '融合 · 结构=reviewed vibration evidence and SCADA context=vibration evidence package (source-backed record, evidence review only; no rating is assigned here)':
|
|
|
- 'Fusion · reviewed vibration evidence and SCADA context',
|
|
|
- '判读纪律: 六个观测量=一条机制链 (C3 源数按观测面), 禁写多源印证; 判级只在 L1/审级产生, 本体转录带审级。':
|
|
|
- 'Reading discipline: six observed quantities form one mechanism chain (independent sources are counted by observation face); do not claim multi-source corroboration. Grades originate only in the analysis layer, and the ontology transcribes them with their review tier.',
|
|
|
-})
|
|
|
-
|
|
|
-# ── 12 第五阶段: 四维状态简写与模板碎片 (逐台判据描述由"模板+数值"拼成, 模板词入表即可覆盖) ──
|
|
|
-TERMS.update({
|
|
|
- # 四维评级的单字简写 — 逐台描述里出现最密, 不收就满屏碎字
|
|
|
- '蓄能与压力调节': 'accumulator and pressure control', '变桨轴承与轮毂润滑': 'pitch bearing and hub lubrication',
|
|
|
- '执行与位置反馈': 'actuation and position feedback', '油路与密封': 'oil circuit and seals',
|
|
|
- '四维': 'four axes', '停机泄压': 'shutdown pressure decay', '蓄能缸检超时': 'accumulator cylinder check timeout',
|
|
|
- '同油温档带宽': 'bandwidth in the same oil-temperature bin', '液压油温': 'hydraulic oil temperature',
|
|
|
- '曲线判风速': 'curve-derived wind speed', '绕组三相极差': 'winding three-phase range',
|
|
|
- '仪表/接线候选': 'instrumentation or wiring candidate', '记基线观': 'baseline recorded, watching',
|
|
|
- '配对差发电机轴承': 'paired difference, generator bearing', '配对差': 'paired difference',
|
|
|
- '驱动端': 'drive end', '非驱动端': 'non-drive end', '两端': 'both ends',
|
|
|
- '未映射到部件': 'not mapped to a component', '未映射': 'not mapped', '谱线级': 'spectral-line level',
|
|
|
- '引用同族': 'family reference', '见族主台': 'see family lead unit', '振动线转录': 'transcribed from vibration line',
|
|
|
- '监测面未覆盖': 'monitoring does not cover it', '没测到': 'not measured',
|
|
|
- '机械刹车温度': 'mechanical brake temperature', '塔筒振动': 'tower vibration',
|
|
|
- '强烈振动停机': 'severe-vibration stop', '叶片振动检测': 'blade vibration detection',
|
|
|
- '无有效监测': 'no effective monitoring', '不给等级': 'no grade assigned',
|
|
|
- '湿度高告警': 'high-humidity alarm', '通讯故障': 'communication fault',
|
|
|
- '工单点名该叶断裂': 'work order names this blade as fractured', '换栓': 'bolt replacement',
|
|
|
- '全批疲劳磨粒最高': 'highest fatigue particle count in the batch', '批内最高': 'highest in batch',
|
|
|
- '重点值': 'key values', '疲劳': 'fatigue', '磨粒': 'wear particles',
|
|
|
- '端别映射': 'end mapping', '未列台': 'unit not covered', '未列≠正常': 'not covered is not the same as healthy',
|
|
|
- '缺采': 'sampling gap', '前置': 'prerequisite', '未验': 'not verified',
|
|
|
- '慢性载荷冲击': 'chronic load impact', '行星级周期主导': 'planetary-stage cycle dominated',
|
|
|
- '梯度': 'gradient', '排名路径': 'ranking path', '持续路径': 'persistence path',
|
|
|
- '渐进磨损': 'progressive wear', '点蚀': 'pitting', '剥落': 'spalling',
|
|
|
- '标量冲击量': 'scalar impact magnitude', '可检出率': 'detection rate',
|
|
|
- '高温跑圈': 'high-temperature race creep', '轴损': 'shaft damage', '烧蚀': 'burn damage',
|
|
|
- '实证不可见': 'not empirically visible', '改看速度量或温度轴': 'use velocity or the temperature axis instead',
|
|
|
- '分布正中间': 'mid-distribution', '拆检前': 'before teardown',
|
|
|
- '因侧': 'cause side', '果侧': 'effect side', '因果时序闭合': 'cause-effect timing closes',
|
|
|
- '机制定性窗无关': 'mechanism characterisation is window-independent',
|
|
|
- '恶化态是窗相关判断': 'deterioration is a window-dependent judgement',
|
|
|
- '润滑断供': 'lubrication starvation', '泵本体': 'pump body', '柱塞两段式失效': 'two-stage plunger failure',
|
|
|
- '温度长期高位': 'sustained high temperature', '振动间歇尖峰': 'intermittent vibration spikes',
|
|
|
- '无归因停机': 'unattributed downtime', '长停远窗': 'long stop, distant window',
|
|
|
- '非链路静默': 'not link silence', '前6h无报警': 'no alarm in the preceding 6 h',
|
|
|
- '镜头口径': 'lens basis', '直测干净量': 'directly measured clean quantity',
|
|
|
- '只判形状': 'shape only', '绝对达成率须现场测风': 'absolute performance requires on-site anemometry',
|
|
|
- '禁眼估': 'no eyeballing', '逐档中位聚合': 'per-bin median aggregation',
|
|
|
- '已剥限电': 'curtailment removed', '只正常发电态': 'normal production only',
|
|
|
- '全场四分位': 'fleet inter-quartile', '四分位残差带': 'inter-quartile residual band',
|
|
|
- '出带且过锚才算离群': 'an outlier must leave the band and pass the anchor',
|
|
|
- '物理绝对锚': 'physical absolute anchor', '显著门': 'significance gate',
|
|
|
- '个月×台': ' unit-months', '月×台': ' unit-months', '月度聚合': 'monthly aggregation',
|
|
|
- '不随上方窗切换': 'independent of the window selector above',
|
|
|
- '两源时间几乎不重叠': 'the two sources barely overlap in time',
|
|
|
- '集团模板无本场记录': 'group template, no records for this site',
|
|
|
- '负面对照': 'negative control', '判据未乱报': 'the criterion did not misfire',
|
|
|
- '全场极齐': 'uniform across the fleet', '无泵压异常': 'no pump-pressure anomaly',
|
|
|
- '活动量代理': 'activity proxy', '非真磨损量': 'not true wear', '与状态位次数互核': 'cross-checked against status-bit counts',
|
|
|
- '非发作型': 'not episodic', '机舱位置通道拖偏': 'nacelle position channel drift',
|
|
|
- '数据质量': 'data quality', '非对风故障': 'not a yaw fault',
|
|
|
- '参数级分组见': 'parameter-level grouping, see ', '阶跃=配置变更': 'a step is a configuration change',
|
|
|
- '平移=工况': 'a shift is an operating condition', '两轴独立分组': 'the two axes group independently',
|
|
|
- '润滑柱塞各台设定本就不同': 'plunger settings differ by unit by design',
|
|
|
- '所以此列只展示不判级': 'so this column is shown without grading',
|
|
|
- '只有已定案的机制链才标色': 'only settled mechanism chains are coloured',
|
|
|
- '末次取样距今超': 'last sampled more than ', '此列看的是': 'this column shows ',
|
|
|
- '同一失效机制的多个观测面': 'multiple observation faces of one failure mechanism',
|
|
|
- '不是': ' are not ', '多源印证': 'multi-source corroboration',
|
|
|
- '融合时禁按源数加权': 'fusion must not weight by source count',
|
|
|
- '级小修全年窗宽': 'minor repairs have a year-round window',
|
|
|
- '吊装级受台风季约束': 'lifting work is constrained by typhoon season',
|
|
|
- '色深=可作业占比': 'colour depth is the workable share',
|
|
|
- '限值=行业常规': 'limits are industry norms', '非本场合同值': 'not this site contract values',
|
|
|
- '报': 'alarm', '良': 'good', '优': 'OK', '中位': 'median', '全场': 'fleet',
|
|
|
- '窗至': 'window to', '判': 'graded ', '共': 'total ', '段': ' segments',
|
|
|
- '轴': ' axis', '页': ' page', '类': ' class', '面': ' face', '点': ' point',
|
|
|
- '看': 'see ', '卡': 'held', '该': 'this ', '依': 'basis', '九': 'nine ',
|
|
|
- '多': 'more', '禁': 'do not ', '四': 'four ', '一': 'one ', '没': 'no ',
|
|
|
- '在': 'in ', '上': 'upper ', '当': 'when ', '时': ' at ', '现': 'current ',
|
|
|
- '至': 'to ', '只': 'only ', '待': 'pending ', '各': 'each ', '秒': ' s',
|
|
|
- '别': 'end', '达': 'reached', '倍': '×', '比': 'ratio', '角': ' angle',
|
|
|
- '态': ' state', '峰': 'peak', '律': ' law', '门': 'gate', '三': 'three ',
|
|
|
- '度': ' degree', '警': 'alarm', '可': 'can ', '数': 'count', '松': 'loose',
|
|
|
- '观': 'watch', '油': 'oil', '齿': 'gear', '口': 'basis', '反馈': 'feedback',
|
|
|
- '从': 'from ', '到': 'to ', '向': 'to ', '要': 'need ', '有': 'has ',
|
|
|
- '而': 'while ', '并': 'and ', '用': 'use ', '非': 'not ', '法': 'cannot ',
|
|
|
- '止于': 'ends at ', '调取': 'obtain', '走完': 'complete', '万': 'k',
|
|
|
- '长': 'long', '大': 'large', '新': 'new', '产': 'produce', '换': 'replace',
|
|
|
- '补': 'add', '跑': 'run', '放到': 'place in ', '内': 'within', '线': ' line',
|
|
|
- '场': ' site', '码': ' code', '季': 'quarterly', '半年': 'semi-annual', '半值': 'half of the ',
|
|
|
- '提供': 'provided', '需': 'requires ', '实为': 'actually ', '注意': 'note ',
|
|
|
- '至今': 'to date', '机构': 'institution', '两家': 'two providers', '到货': 'delivery',
|
|
|
- '重跑': 'rerun', '必重跑下游': 'downstream must be rerun', '的底座': ' as the base',
|
|
|
- '随运营': 'as operations proceed', '到位': 'in place', '自动刷新': 'auto refresh',
|
|
|
- '怎么做': 'how to', '衍生': 'derived', '如东风场': 'site', '风机': 'turbine',
|
|
|
- '约定位置': 'agreed location', '摄入命令': 'ingest command', '更新频率': 'update frequency',
|
|
|
- '责任方': 'owner', '当前覆盖': 'current coverage', '末次更新': 'last updated',
|
|
|
-})
|
|
|
-
|
|
|
-# ── 13 收尾: 维护端口与剩余整句 ──
|
|
|
-TERMS.update({
|
|
|
- '要补Data 就把新文件放到': 'to add data, place the new file in ',
|
|
|
- '要补数据就把新文件放到': 'to add data, place the new file in ',
|
|
|
- '再跑': ', then run ', '就把新文件放到': ', place the new file in ',
|
|
|
- '随运营滚动 — 新数据到位跑 ingest, 图谱与判级自动刷新':
|
|
|
- 'rolls with operations — once new data is in place, run ingest and the graph and grading refresh automatically',
|
|
|
- '相对稳定 — 换厂商资料/换版本/参数变更时才动, 改动需审':
|
|
|
- 'relatively stable — touched only when vendor documents, versions or parameters change, and changes require review',
|
|
|
- '注意度总': 'note that the total ', '核过确': 'verified as ', '六类': 'six classes',
|
|
|
- '当前止': 'currently ends at ', '缺口需现场补': 'the gap must be filled by site',
|
|
|
- '新一轮到货重跑': 'rerun when the next batch arrives',
|
|
|
- '振动线出件 → fusion 自动读': 'issued by the vibration line, read automatically by fusion',
|
|
|
- '在升(末三窗/早三窗≥1.3)与换件闭环两类实证入图谱':
|
|
|
- 'rising trend (last-three vs first-three windows) and replacement closed-loop evidence enter the graph',
|
|
|
- '补前这类信息只在链盘里, 图谱检索不到':
|
|
|
- 'before this, such information lived only on the chain board and was not retrievable from the graph',
|
|
|
- '每台六步进度/停滞环节/下一步 + 全场瓶颈汇总':
|
|
|
- 'six-step progress, stalled step and next action per unit, plus a fleet bottleneck summary',
|
|
|
- '补前只在运行期内存里, 图谱检索不到':
|
|
|
- 'before this it existed only in runtime memory and was not retrievable from the graph',
|
|
|
- '判级或工单更新后': 'after a grading or work-order update', '振动线每轮出件后': 'after each vibration-line issue',
|
|
|
- '换厂商资料时': 'when vendor documents change', '换版本时': 'when the version changes',
|
|
|
- '参数变更时': 'when parameters change', '补充资料时': 'when documents are added',
|
|
|
- '随码表/工单更新': 'with code-table and work-order updates', '月/事件驱动': 'monthly / event-driven',
|
|
|
- '事件驱动': 'event-driven', '需 windscada 服务在跑': 'requires the service to be running',
|
|
|
- '产物存在': 'artefact present', '数据源': 'data source', '摄入': 'ingest',
|
|
|
- '现场提供': 'site provided', '化验机构': 'laboratory', '振动线': 'vibration line',
|
|
|
- '图谱': 'knowledge graph', '本表': 'this table', '月表': 'monthly table',
|
|
|
- '数据边界': 'data boundary', '空≠无检修': 'empty does not mean no maintenance',
|
|
|
- '实机参数表': 'as-built parameter table', '判定规范': 'decision specification',
|
|
|
- '技术资料索引': 'technical document index', '图纸/原理': 'drawings and principles',
|
|
|
- '失效模式与原因树': 'failure modes and cause tree', '报警码表与处置手册': 'alarm code table and procedures',
|
|
|
- '预防性维护': 'preventive maintenance', '检修工单台账': 'maintenance work order ledger',
|
|
|
- '油液化验': 'oil analysis', '报警事件': 'alarm events', '月度衍生': 'monthly derived',
|
|
|
- '趋势与闭环证据': 'trend and closed-loop evidence', '决策链进度': 'decision chain progress',
|
|
|
- '振动评估报告': 'vibration assessment report',
|
|
|
-})
|
|
|
-
|
|
|
-# ── 14 末轮: 决策/振动/曲线三页残留 ──
|
|
|
-TERMS.update({
|
|
|
- '一台机组从': 'A unit runs from ', '发现异常': 'anomaly detected', '修完验收': 'repaired and verified',
|
|
|
- '这张盘不讲某一台的故事': 'this board tracks the fleet, not one unit',
|
|
|
- '瓶颈集中在一步': 'the bottleneck sits at a single step',
|
|
|
- '不是': 'is not ', '再多看点数据能解的': 'something more data can solve',
|
|
|
- '核实': 'verify', '向现场调取': 'obtain from site', '台账止于': 'ledger ends at ',
|
|
|
- '系统无法判定是否已派工': 'the system cannot tell whether work was dispatched',
|
|
|
- '非未执行': 'not the same as not done', '数据不足不可判': 'insufficient data, indeterminate',
|
|
|
- '这不是': 'this is not ', '偷懒': 'laziness', '历史单不对应本次问题': 'historical orders do not match this finding',
|
|
|
- '会造出假的完成态': 'would fabricate a completed state', '要填这一列': 'to fill this column',
|
|
|
- '须向现场要': 'requires site to provide ', '已走完全程并退出盘面': 'completed the full path and left the board',
|
|
|
- '端到端闭环实证': 'end-to-end closed-loop evidence', '立即修': 'repair now',
|
|
|
- '推迟': 'defer', '拖到失效': 'run to failure', '大部件成本': 'major component cost',
|
|
|
- '作业级': 'work class', '修理窗': 'repair window', '停机损失': 'downtime loss',
|
|
|
- '电费口径': 'tariff basis', '风险敞口': 'risk exposure', '等待月数': 'months waited',
|
|
|
- '随板块常显': 'always shown with the panel', '各列取数窗口不同': 'columns draw on different windows',
|
|
|
- '两格同时发红': 'both cells turn red', '不等于同时发生': 'does not mean they happened together',
|
|
|
- '不可当共时印证': 'must not be taken as simultaneous corroboration',
|
|
|
- '每格右侧曲线': 'the curve on the right of each cell', '逐月记忆轨迹': 'monthly trend memory',
|
|
|
- '实心点': 'solid point', '现窗': 'current window', '快照会丢形态': 'a snapshot loses the shape',
|
|
|
- '才看得出': 'only then can one see ', '塌': 'collapse', '回升': 'recovery', '翻转': 'reversal',
|
|
|
- '阴性不构成证据': 'a negative does not constitute evidence', '在知盲区上': 'over a known blind spot',
|
|
|
- '同理': 'likewise', '两条判读纪律': 'two reading rules', '随板块': 'with the panel',
|
|
|
- '格子颜色': 'cell colour', '徽章': 'badge', '业主口径': 'owner convention',
|
|
|
- '可信度': 'confidence', '九枚举': 'nine values', '两轴不可互相替代': 'the two axes are not interchangeable',
|
|
|
- '说的是': 'refers to ', '设定本就不同': 'settings differ by design', '此列只展示不判级': 'this column is shown without grading',
|
|
|
- '落位': 'position', '圆内数字': 'the number inside each circle', '连成一片': 'form a continuum',
|
|
|
- '成因须配置台账': 'the cause requires the configuration ledger', '档下的': ' within the bin',
|
|
|
- '标定偏移': 'calibration offset', '正态抽样': 'normal sampling', '自身的分辨力': 'its own resolving power',
|
|
|
- '削峰': 'peak shaving', '饱和点': 'saturation point', '三叶': 'three-blade',
|
|
|
- '集距': 'collective pitch', '不平衡': 'imbalance', '齿比': 'gear ratio',
|
|
|
- '两轴独立分组': 'the two axes group independently', '三组': 'three groups',
|
|
|
- '专项锚': 'dedicated anchor', '只出当期电量账': 'issues only the current-period energy account',
|
|
|
- '数字随上方窗切换': 'figures follow the window selector above',
|
|
|
- '唯一进设备考核的一段': 'the only segment under equipment accountability',
|
|
|
- '命令与实际功率对得上': 'command and actual power agree',
|
|
|
- '功率未被压制': 'power was not suppressed', '按责任归属': 'by accountability',
|
|
|
- '限电与调度令': 'curtailment and dispatch orders', '不进设备责任': 'not equipment accountability',
|
|
|
- '正常发电欠发与低风待机': 'under-generation in production and low-wind standby',
|
|
|
- '能量守恒核': 'energy conservation check', '全额定上限': 'all-rated ceiling',
|
|
|
- '量级自检': 'magnitude self-check', '最大一笔是限电不是故障': 'the largest item is curtailment, not faults',
|
|
|
- '限电命令面占比': 'curtailment command coverage', '移至独立板块': 'moved to a separate panel',
|
|
|
- '交付九分册一一对应': 'maps one-to-one onto the nine delivery volumes',
|
|
|
- '无 SCADA 轴': 'no SCADA axis', '分册蓝本': 'volume basis', '巡检': 'inspection',
|
|
|
- '独立页': 'dedicated page', '点机组号': 'click a unit number', '看全场': 'view fleet',
|
|
|
- '项占': ' items account for ', '直接比': 'comparing directly', '会读反': 'reads backwards',
|
|
|
- '最低但均': 'lowest yet averages ', '灰柱': 'grey bar', '本图': 'this figure',
|
|
|
- '量排': ' ranked by volume', '点击加入报告': 'click to add to the report',
|
|
|
- '再点击移出': 'click again to remove', '画布里已有': 'the canvas holds ',
|
|
|
- '悬停查看组件说明': 'hover for a description', '右侧': 'on the right', '调整顺序': 'to reorder',
|
|
|
-})
|
|
|
-
|
|
|
-# ── 15 收尾末轮 ──
|
|
|
-TERMS.update({
|
|
|
- '六步进度': 'six-step progress', '实线': 'solid line', '虚线': 'dashed line',
|
|
|
- '能解的': 'can solve', '有过': 'previously had ', '是针对本': 'addresses this ',
|
|
|
- '尺度': 'scale', '跨两个数量级': 'spanning two orders of magnitude', '弱源': 'weak source',
|
|
|
- '早修成本被': 'the cost of repairing early is ', '稀释': 'diluted',
|
|
|
- '晚修成本被': 'the cost of repairing late is ', '放大': 'amplified',
|
|
|
- '窗口与船期': 'access windows and vessel scheduling', '船期': 'vessel scheduling',
|
|
|
- '总表': 'master table', '自动翻绿': 'turns green automatically', '会话': 'session',
|
|
|
- '五级来源': 'five-level source', '取最新版不写死日期': 'always takes the latest version, no hard-coded date',
|
|
|
- '定谳链': 'settled-verdict chain', '以上': ' and above', '两轴': 'two axes',
|
|
|
- '取严合并': 'merged on the stricter of the two', '厂商资料': 'vendor documents',
|
|
|
- '现场反馈修正': 'site feedback corrections', '它是判据的地基': 'it underpins the criteria',
|
|
|
- '变更须过审': 'changes require review', '运行期计算': 'computed at runtime',
|
|
|
- '两类': 'two classes', '入图谱': 'into the knowledge graph', '厂商/技术': 'vendor / technical',
|
|
|
- '分步处置': 'step-by-step procedure', '点击查看': 'click to view', '点击': 'click ',
|
|
|
- '在已知盲区上': 'over a known blind spot', '见列头': 'see column headers',
|
|
|
- '同时发生': 'simultaneous', '才看得出': 'only then is it visible: ',
|
|
|
- '类机制签名': 'mechanism-class signature', '签名': 'signature',
|
|
|
- '落在几个离散位置上': 'sit at a few discrete positions', '离散位置': 'discrete positions',
|
|
|
- '偏差达中位的': 'deviation reaches the median by ', '正态期望': 'normal expectation',
|
|
|
- '筛查': 'screening', '固定判别窗': 'fixed discrimination window',
|
|
|
- '风速计偏高': 'anemometer reads high', '残差带': 'residual band',
|
|
|
- '可辨门': 'discrimination gate', '标定漂移': 'calibration drift',
|
|
|
- '判别窗': 'discrimination window', '一致': 'consistent', '刷屏': 'flooding',
|
|
|
- '数量级': 'orders of magnitude', '中值': 'mid-value', '地基': 'foundation',
|
|
|
- '取严': 'take the stricter', '合并': 'merge', '列头': 'column header',
|
|
|
- '知盲区': 'known blind spot', '离散': 'discrete', '期望': 'expectation',
|
|
|
- '计高': 'reads high', '偏高': 'reads high', '带': ' band', '门': ' gate',
|
|
|
- '过审': 'review', '取最新版': 'latest version', '不写死': 'not hard-coded',
|
|
|
- '期计算': ' computed', '五级': 'five-level', '来源': 'source',
|
|
|
-})
|
|
|
-
|
|
|
-# ── 16 地道化: 高可见句子整条重写 + 中文标点 ──
|
|
|
-# 用户令: 要英文技术文档的自然表达, 不是逐词替换出来的中式英语。
|
|
|
-# 逐词替换必然产出中文语序 ("bar height=均count, is not -total"), 高可见文案必须整句重写。
|
|
|
-PUNCT = {
|
|
|
- '。': '. ', ',': ', ', '、': ', ', ';': '; ', ':': ': ',
|
|
|
- '(': ' (', ')': ') ',
|
|
|
- # 「」《》 在英文里没有对应形态, 且引号会被闸拦 (会破坏注入上下文) — 去掉即可, 语义不丢
|
|
|
- '「': ' ', '」': ' ', '《': ' ', '》': ' ',
|
|
|
- '★': '* ', '⇒': ' leads to ', '~': '~', '·': ' · ', '|': ' | ',
|
|
|
-}
|
|
|
-TERMS.update(PUNCT)
|
|
|
-TERMS.update({
|
|
|
- # 窗声明
|
|
|
- '本页全部数字随上方窗切换': 'all figures on this page follow the window selector above',
|
|
|
- '本页含两个窗': 'this page uses two different windows',
|
|
|
- '固定窗 · 不随上方切换': 'fixed window — independent of the selector above',
|
|
|
- '窗内 2026-07 数据不满月': '2026-07 is a partial month',
|
|
|
- '月度图已按天归一': 'monthly figures are normalised per day',
|
|
|
- # 能量账
|
|
|
- '理论可发 (实际+损失)': 'gross available (net exported + losses)',
|
|
|
- '实际上网 · 等效满发': 'net exported · equivalent full-load hours',
|
|
|
- '能量守恒核 · 理论 < 全额定上限': 'energy conservation check — gross available below the all-rated ceiling',
|
|
|
- '限电 (命令与实际功率对得上)': 'curtailment (command matches actual power)',
|
|
|
- '限电命令期 · 功率未被压制': 'curtailment order in force, power not suppressed',
|
|
|
- '故障与检修停机': 'faults and maintenance downtime',
|
|
|
- '正常发电时的欠发': 'under-generation while producing',
|
|
|
- # 故障统计
|
|
|
- '柱高=日均条数, 不是月总数': 'bars show events per day, not the monthly total',
|
|
|
- '本窗 2026-07 数据不满月(灰虚线柱), 直接比月总数会读反':
|
|
|
- '2026-07 is a partial month (grey dashed bar) — comparing raw monthly totals would reverse the reading',
|
|
|
- '实测: 2026-07 总数最低但日均': 'measured: 2026-07 has the lowest total but the second-highest daily rate at ',
|
|
|
- '条/日 = 全窗前列': ' events per day',
|
|
|
- '关键少数: 前': 'the vital few — the top ', '项占 80%': ' items account for 80%',
|
|
|
- '共 12 项, 合计': 'of 12 codes, ', '前三': 'top three',
|
|
|
- '条数=发生频次, 不反映影响程度': 'count is frequency, not severity',
|
|
|
- # 决策链
|
|
|
- '一台机组从「发现异常」到「修完验收」要走六步': 'A unit moves through six steps, from anomaly detected to repaired and verified',
|
|
|
- '要补数据就把新文件放到「约定位置」再跑「摄入命令」': 'To add data, place the file in the stated location and run its ingest command',
|
|
|
- '这张盘不讲某一台的故事, 用于确认': 'This board tracks the fleet rather than a single unit, showing ',
|
|
|
- '已达': 'complete', '数据不足不可判': 'insufficient data', '未达': 'not reached',
|
|
|
- '瓶颈集中在一步, 不是「再多看点数据」能解的':
|
|
|
- 'the bottleneck sits at one step and more data will not clear it',
|
|
|
- '的下一步': ' — next step: ',
|
|
|
- '定性: 现场/取样把根因定到部件与失效模式':
|
|
|
- 'characterise on site or by sampling: identify the root cause down to component and failure mode',
|
|
|
- '核实: 向现场调取 2025~2026 工单': 'obtain 2025–26 work orders from site',
|
|
|
- # 维护端口
|
|
|
- '数据维护面': 'Data sources', '个源': ' registered',
|
|
|
- '每个源给出: 当前覆盖 / 末次更新 / 约定位置 / 摄入命令 / 更新频率 / 责任方。':
|
|
|
- 'Each source lists coverage, last update, location, ingest command, refresh cadence and owner. ',
|
|
|
- '要补数据就把新文件放到「约定位置」再跑「摄入命令」。':
|
|
|
- 'To add data, place the file in the stated location and run its ingest command. ',
|
|
|
- '随运营滚动 — 新数据到位跑摄入, 图谱与判级自动刷新':
|
|
|
- 'Rolls with operations: once new data lands, run the ingest command and the graph and grading refresh automatically',
|
|
|
- '相对稳定 — 换厂商资料或现场反馈修正时才动; 它是判据的地基, 变更须过审':
|
|
|
- 'Relatively stable: changed only when vendor documents or site feedback require it. These underpin the criteria, so changes go through review',
|
|
|
- '怎么补数据': 'How to add data', '当前覆盖': 'Coverage', '末次更新': 'Last updated',
|
|
|
- '更新频率': 'Cadence', '责任方': 'Owner', '数据层': 'Data layer', '机理层': 'Domain layer',
|
|
|
- '放到': 'place in ', '跑': 'run ',
|
|
|
-})
|
|
|
-
|
|
|
-# ── 17 精修: 用源码里的准确原文入表 (之前凭印象写 key, 有细微出入所以没命中) ──
|
|
|
-TERMS.update({
|
|
|
- '随运营滚动 — 新数据到位后跑摄入, 本体与判级自动刷新':
|
|
|
- 'Rolls with operations: when new data lands, run its ingest command and the ontology and grading refresh automatically',
|
|
|
- '要补数据就把新文件放到': 'To add data, place the file in the ', '再跑': ' and run the ',
|
|
|
- '约定位置': 'stated location', '摄入命令': 'ingest command',
|
|
|
- '数据线': 'analytics team', '现场': 'site', '振动线': 'vibration team',
|
|
|
- '化验机构': 'laboratory', '厂商/技术': 'vendor / engineering',
|
|
|
- 'windscada → 图谱': 'analytics to knowledge graph', '振动线 → 图谱': 'vibration team to knowledge graph',
|
|
|
- # 常见中式残片
|
|
|
- '总table': 'master table', '注意度': 'note that ', '实为': 'is in fact ',
|
|
|
- '级事件': '-level event', '不work order': 'is not a work order',
|
|
|
- '六类source': 'six source classes', '核过确': 'verified as ', '需site补': 'requires site to supply ',
|
|
|
- '新一round到货aft rerun': 'rerun when the next batch arrives',
|
|
|
- '自动翻绿': 'turns green automatically', '两家': 'two providers',
|
|
|
- '取严合and': 'merged on the stricter of the two', '两 axis': 'two axes',
|
|
|
- '来source': 'source', '五 level': 'five levels', '自动取最new版': 'always takes the latest version',
|
|
|
- '不写死期': 'no hard-coded date', '以upper': ' and above',
|
|
|
- '会话': 'session', '期计算': ' computed at runtime', '两 class': 'two classes',
|
|
|
- '分 steps action': 'step-by-step procedures', '分steps': 'step-by-step',
|
|
|
-})
|
|
|
-
|
|
|
-# ── 7 量词/连接词/动词 (最后补, 都是短词; 长词已在前面命中所以不会被截断) ──
|
|
|
-TERMS.update({
|
|
|
- '非行业': 'not the industry-standard ', '真窗': 'actual window', '真': 'actual ',
|
|
|
- '近90日固定': 'last 90 days, fixed', '所选时间窗': 'selected time window',
|
|
|
- '判级窗': 'Grading window', '五态': 'five states', '温度月轨迹': 'monthly temperature trend',
|
|
|
- '剔除口径': 'excl. basis', '剔除': 'excluding', '不含调度令': 'excl. dispatch orders',
|
|
|
- '不含': 'excl. ', '含': 'incl. ', '另计': 'counted separately', '另': 'also ',
|
|
|
- '起': '', '个': '', '处': '', '份': '', '轮': ' round', '步': ' steps',
|
|
|
- '共': 'total ', '约': 'approx. ', '仅': 'only ', '已': '', '未': 'not ',
|
|
|
- '按': 'by ', '见': 'see ', '据': 'per ', '经': 'via ', '含义': 'meaning',
|
|
|
- '全真': 'all verified', '引用id数': 'cited ids', '溯源核验': 'Traceability check',
|
|
|
- '用时': 'elapsed', '模型': 'model', '推理中': 'reasoning', '空闲': 'idle',
|
|
|
- '提问': 'Ask', '查询': 'Query', '查': 'Go', '常查': 'Common', '报警码': 'Alarm code',
|
|
|
- '失效模式': 'failure mode', '手册分步处置': 'manual step-by-step procedure',
|
|
|
- '历史工单': 'historical work orders', '年度任务': 'annual task', '系统': 'system',
|
|
|
- '本体确定性查询': 'Deterministic ontology query',
|
|
|
- '结果': 'result', '手册与工单source-backed record': 'verbatim from manuals and work orders',
|
|
|
- '不经模型': 'no model involved', '预设': 'Preset', '章节': 'section', '受众': 'Audience',
|
|
|
- '场站内部': 'Internal', '上报集团': 'For group reporting', '全量': 'full', '脱敏': 'redacted',
|
|
|
- '打印': 'Print', '存': 'Save as', '导出': 'Export', '组件库': 'Block library',
|
|
|
- '画布': 'canvas', '文档预览': 'Document preview', '报告': 'report', '运行分析': 'Operations Analysis',
|
|
|
- '统计期': 'Reporting period', '数据源': 'Data sources', '出件': 'issued',
|
|
|
- '覆盖': 'coverage', '末次更新': 'last updated', '位置': 'location', '摄入': 'ingest',
|
|
|
- '责任': 'owner', '频率': 'frequency', '说明': 'note', '存在': 'present',
|
|
|
- '数据': 'Data', '机理': 'Domain model', '层': 'layer', '名': 'name',
|
|
|
-})
|
|
|
-
|
|
|
-_RE = None
|
|
|
-
|
|
|
-
|
|
|
-def _compile():
|
|
|
- global _RE
|
|
|
- keys = sorted(TERMS, key=len, reverse=True) # 最长匹配优先
|
|
|
- _RE = re.compile('|'.join(re.escape(k) for k in keys))
|
|
|
- return _RE
|
|
|
-
|
|
|
-
|
|
|
-# 单字量词只在数字后才是量词: ' 行' 当 key 会切进 行动等级/行星级 (实测切成 "rows 动等
|
|
|
-# level"), 加前导空格也锁不住 "/ 行动"。词表是纯字符串匹配, 表达不了上下文条件, 故后处理。
|
|
|
-_RE_ROWS = re.compile(r'(?<=\d)\s*行(?![\w\u4e00-\u9fff])')
|
|
|
-# 量词 '条' 同理: 数字后面是量词该译, 但收成单字条目会切碎 条件 / 条款 / 一条链。
|
|
|
-_RE_CNT = re.compile(r'(?<=\d)\s*条(?![\w\u4e00-\u9fff])')
|
|
|
-
|
|
|
-
|
|
|
-def translate(s):
|
|
|
- """替换已知术语; 未知中文原样留下, 由 audit_untranslated 收口。
|
|
|
-
|
|
|
- ★词间补空格 (2026-08-28 实测): 中文没有词界, 两个相邻中文词各自被替换后英文会直接粘连 —
|
|
|
- "分析"+"决策" → "analysisdecision"。替换时看后一个字符, 若替换结果以字母结尾且下一个
|
|
|
- 字符也是字母/中文, 补一个空格。这只缓解粘连, 治不了"部分覆盖"本身: 未译的中文词
|
|
|
- 仍会夹在英文中间 ("风电智能analysis"), 所以覆盖率必须推到接近满值才可交付。
|
|
|
- """
|
|
|
- if not isinstance(s, str) or not s:
|
|
|
- return s
|
|
|
- r = _RE or _compile()
|
|
|
-
|
|
|
- def _sub(m):
|
|
|
- v = TERMS[m.group(0)]
|
|
|
- nxt = s[m.end():m.end() + 1]
|
|
|
- if v and v[-1].isascii() and v[-1].isalnum() and nxt and (nxt.isalnum() or nxt == '(' or '\u4e00' <= nxt <= '\u9fff'):
|
|
|
- return v + ' '
|
|
|
- return v
|
|
|
- out = _RE_CNT.sub(' events', _RE_ROWS.sub(' rows', r.sub(_sub, s)))
|
|
|
- # 数字上下文量词: 只有紧跟数字时才是量词, 收成单字条目会切碎 次数/第一/年度/个别/台账
|
|
|
- out = _RE_TIMES.sub(' times ', out)
|
|
|
- out = _RE_UNITS.sub(' units ', out)
|
|
|
- out = _RE_YEAR.sub('', out)
|
|
|
- out = _RE_ITEMS.sub(' ', out)
|
|
|
- out = _RE_STEP.sub('No.', out)
|
|
|
- out = _RE_STEPN.sub(' steps ', out)
|
|
|
- out = _RE_TOTAL.sub('total ', out)
|
|
|
- out = _RE_IN_N.sub('in ', out)
|
|
|
- # 上面几条一律补尾空格防粘连 (实测 "6 stepshandling"), 再压掉行内多余空格。
|
|
|
- # 只压 空格/tab, 不碰换行 —— 产物里有靠换行分段的文本。
|
|
|
- out = re.sub(r'(?<=\S)[ \t]{2,}', ' ', out)
|
|
|
- # ★混杂回退 (2026-08-30 用户在检修助手排查步骤里逮到): 词表对长尾技术文本
|
|
|
- # (手册排查步骤、告警处置) 不可能穷举, 部分覆盖会把整句切成中英混杂 ——
|
|
|
- # "更换机侧BCU控制器" → "replace 机侧BCUcontrol 器", 读不通且显得系统劣质。
|
|
|
- # 判据不靠列举而靠自适应: 译完仍留下**过半**原有中文 ⇒ 这段根本没覆盖,
|
|
|
- # 整段退回原文。完整的中文至少是句能读的话, 客户看得出这是未翻译区。
|
|
|
- zh0 = sum(1 for c in s if '\u4e00' <= c <= '\u9fff')
|
|
|
- if zh0 >= 6:
|
|
|
- zh1 = sum(1 for c in out if '\u4e00' <= c <= '\u9fff')
|
|
|
- if zh1 / zh0 > 0.5:
|
|
|
- return s
|
|
|
- return out
|
|
|
-
|
|
|
-
|
|
|
-def tr_deep(o):
|
|
|
- if isinstance(o, str):
|
|
|
- return translate(o)
|
|
|
- if isinstance(o, dict):
|
|
|
- return {translate(k) if isinstance(k, str) else k: tr_deep(v) for k, v in o.items()}
|
|
|
- if isinstance(o, list):
|
|
|
- return [tr_deep(v) for v in o]
|
|
|
- return o
|
|
|
-
|
|
|
-
|
|
|
-def audit_untranslated(text, top=40):
|
|
|
- """列出仍未译的中文片段, 按出现次数排 — 迭代补词表用。"""
|
|
|
- import collections
|
|
|
- frags = re.findall(r'[一-鿿]+', text or '')
|
|
|
- return collections.Counter(frags).most_common(top)
|
|
|
-
|
|
|
-
|
|
|
-_assert_quote_free()
|
|
|
-
|
|
|
-# ── 18 图表说明与告警码 ────────────────────────────────────────────
|
|
|
-# 来源: 单文件版下钻浮层。这批文案此前从未进过残留统计 —— 统计只走了十个 tab 的
|
|
|
-# 页面文本, 而浮层要点击才出现。口径漏了一层, 补测 15 个浮层扫出 45 词 629 字。
|
|
|
-# 取值全部从预烤 JSON 的 fig.note / fig.unit / fig.title 抓原文, 不凭印象写 key。
|
|
|
-TERMS.update({
|
|
|
- # 图例整句 (整句先于逐词匹配, 避免拼出中文语序)
|
|
|
- '灰带=全场四分位区间, 深线=全场中位, 红线=本台':
|
|
|
- 'Grey band = fleet interquartile range; dark line = fleet median; red line = this unit',
|
|
|
- '灰带=全场四分位区间': 'Grey band = fleet interquartile range',
|
|
|
- '振动判级交叉轴: 温度=同机制果侧观测(观测面≠源数)':
|
|
|
- 'Vibration grading cross-check: temperature is an effect-side observation of the same '
|
|
|
- 'mechanism (an observation face is not an independent source)',
|
|
|
- '数据=TCM 六窗标量': 'Data: TCM six-window scalars',
|
|
|
- '窗内合计': 'Total in window',
|
|
|
- '判据:': 'Criterion:',
|
|
|
- # 统计与图元
|
|
|
- '稳健离群度': 'robust outlier score', '六窗比': 'six-window ratio',
|
|
|
- '末窗/首窗': 'last window / first window', '六窗标量': 'six-window scalars',
|
|
|
- '四分位区间': 'interquartile range', '全场中位': 'fleet median',
|
|
|
- '灰带': 'grey band', '深线': 'dark line', '红线': 'red line',
|
|
|
- '均值': 'mean', '稳健': 'robust', '档带宽': 'band width', '档': 'band',
|
|
|
- '月样本中位': 'monthly sample median', '月样本': 'monthly sample',
|
|
|
- '产物转录': 'transcribed from analysis outputs', '源数': 'source count',
|
|
|
- '上升': 'rising', '定向查': 'targeted check', '报警门': 'alarm gate',
|
|
|
- # 量与单位
|
|
|
- '秒/日': 's/day', '泵': 'pump', '制动': 'brake',
|
|
|
- '月度条数': 'monthly count', '报警月度条数': 'alarm count per month',
|
|
|
- # 测点与系统
|
|
|
- '偏航润滑泵运行时长': 'yaw lubrication pump runtime',
|
|
|
- '桨叶零位偏差': 'blade zero-position deviation',
|
|
|
- '齿轮箱中速轴温度': 'gearbox IMS bearing temperature',
|
|
|
- '齿轮箱高速轴温度': 'gearbox HSS bearing temperature',
|
|
|
- '变压器绕组最高温度': 'transformer winding peak temperature',
|
|
|
- '主控与传感网系统': 'main controller and sensor network',
|
|
|
- '蓄能失效候选': 'accumulator failure candidate', '蓄能行为': 'accumulator behaviour',
|
|
|
- '振动分析摘要': 'vibration analysis summary', '振动标量': 'vibration scalars',
|
|
|
- '偏航系统': 'yaw system', '变桨系统': 'pitch system', '偏航失败': 'yaw failure',
|
|
|
- '发电机侧': 'generator side', '发电态': 'generating', '风传感': 'wind sensing',
|
|
|
- '变桨分册': 'pitch volume',
|
|
|
- # 告警码名称 (top: ... 里出现)
|
|
|
- '自动解缆停机': 'automatic cable untwist stop',
|
|
|
- '偏航制动液压压力异常': 'yaw brake hydraulic pressure fault',
|
|
|
- '偏航失败-等待': 'yaw failure - waiting', '偏航失败-停止': 'yaw failure - stop',
|
|
|
- '偏航电机过热': 'yaw motor overheat',
|
|
|
- '偏航变流器警告过多': 'excessive yaw converter warnings',
|
|
|
- '变流器降功率运行(DG)': 'converter derated operation (DG)',
|
|
|
- '变流器跳闸(自动重启)': 'converter trip (auto-restart)',
|
|
|
- 'ABB变流器PU通讯故障': 'ABB converter PU communication fault',
|
|
|
- 'UPS电池电压低': 'UPS battery voltage low',
|
|
|
- 'FT1超声波风速计故障': 'FT1 ultrasonic anemometer fault',
|
|
|
- '液压监控·轮毂(变桨)压': 'hydraulic monitoring - hub (pitch) pressure',
|
|
|
- '变桨轴承润滑(执行中)': 'pitch bearing lubrication (running)',
|
|
|
- '变桨泵运行超时停机': 'pitch pump runtime timeout stop',
|
|
|
- '液压油温异常': 'hydraulic oil temperature fault',
|
|
|
- '液压油位异常': 'hydraulic oil level fault',
|
|
|
- '轮毂部件松动': 'hub component loose',
|
|
|
- '风速计偏高候选(A类)': 'anemometer reads-high candidate (class A)',
|
|
|
- '风速计偏置': 'anemometer bias',
|
|
|
-})
|
|
|
-_assert_quote_free()
|
|
|
-
|
|
|
-# '条' 原映射空串, 使 "窗内合计 40 条; top:" 译成 "Total in window 40 ; top:" — 英文这里
|
|
|
-# 需要一个名词把数字接住, 空串留下悬空的分号。'次'/'起' 保持省略 (英文计数惯例不同)。
|
|
|
-TERMS['条'] = 'events'
|
|
|
-_assert_quote_free()
|
|
|
-
|
|
|
-# ── 19 图例硬编码文案 ──────────────────────────────────────────────
|
|
|
-# 这批不在 fig.note 里, 是 drawFig 渲染时拼进 SVG/HTML 的固定图例 —— 从源码 grep 会淹没在
|
|
|
-# Python 注释里, 故改从浮层 DOM 的文本节点直接抓, 只有 11 个串。key 保留 < 原形:
|
|
|
-# hook 拦的是 innerHTML 写入前的字符串, 那时实体还没解码。
|
|
|
-TERMS.update({
|
|
|
- '条=本台/全场中位 (竖线=1× 基准, 右端封顶 2.5×); 色按 z (稳健离群度): 绿<2 · 橙2~3 · 红≥3':
|
|
|
- 'Bar = this unit / fleet median (vertical line = 1x reference, right end capped at 2.5x); '
|
|
|
- 'colour by z (robust outlier score): green under 2 · orange 2 to 3 · red 3 and above',
|
|
|
- '谱级深潜与逐窗趋势 → 振动融合板块·振动分析入口 (windcms)':
|
|
|
- 'Spectrum-level deep dive and per-window trend → Vibration Fusion section · '
|
|
|
- 'vibration analysis entry point (windcms)',
|
|
|
- '峭度': 'kurtosis', 'ISO烈度': 'ISO severity', '烈度': 'severity',
|
|
|
- '速度有效值': 'velocity RMS', '零位偏差': 'zero-position deviation', '零位': 'zero position',
|
|
|
- '竖线': 'vertical line', '右端封顶': 'right end capped at', '封顶': 'capped',
|
|
|
- '色按': 'colour by', '基准': 'reference',
|
|
|
- '绿': 'green', '橙': 'orange', '红': 'red',
|
|
|
- '谱级深潜': 'spectrum-level deep dive', '深潜': 'deep dive',
|
|
|
- '逐窗趋势': 'per-window trend', '逐窗': 'per-window', '板块': 'section',
|
|
|
- # 测点与工况 (浮层标题)
|
|
|
- '(发电态P>500kW)': '(generating, P over 500 kW)', '·均值 月度': '· mean, monthly',
|
|
|
- '本台 vs 全场': 'this unit vs fleet', '记基线观察': 'baseline recorded, monitoring',
|
|
|
- '温度候选(定向查)': 'temperature candidate (targeted check)',
|
|
|
- '发电机驱动端(DE)轴承温度': 'generator drive-end (DE) bearing temperature',
|
|
|
- '发电机非驱动端(NDE)轴承温度': 'generator non-drive-end (NDE) bearing temperature',
|
|
|
- '后主轴承温度(齿轮箱侧)': 'rear main bearing temperature (gearbox side)',
|
|
|
- '液压油温': 'hydraulic oil temperature',
|
|
|
- '(发电机侧)': '(generator side)', '(转子侧)': '(rotor side)',
|
|
|
- '(功率 0-1600 kW 档)': '(power band 0-1600 kW)',
|
|
|
- '(功率 1601-2000 kW 档)': '(power band 1601-2000 kW)',
|
|
|
- # 告警码 (第二批)
|
|
|
- '齿轮油温度警告': 'gear oil temperature warning', '齿轮油温度高': 'gear oil temperature high',
|
|
|
- '高速轴发电机侧齿轮轴承温': 'HSS generator-side gear bearing temperature',
|
|
|
- 'FT1超声波风速计通讯故': 'FT1 ultrasonic anemometer communication fault',
|
|
|
- '一次风速计故障': 'primary anemometer fault', '一次风向标失效': 'primary wind vane failure',
|
|
|
-})
|
|
|
-_assert_quote_free()
|
|
|
-
|
|
|
-# 上面那次单字回归测试顺带暴露的既有裂缝 (单字 '进' 把 "进行" 切成 "into 行")
|
|
|
-TERMS.update({'进行': 'carry out', '行动等级': 'action level', '等级': 'level'})
|
|
|
-_assert_quote_free()
|
|
|
-
|
|
|
-# ── 20 删除汉字单字条目 ────────────────────────────────────────────
|
|
|
-# 2026-08-30 用户在检修助手的排查步骤里逮到: "检查机侧BCU控制器" 被译成
|
|
|
-# "检Go 机 side BCUcontrol 器"。根因是词表里有约 110 个**汉字单字**条目
|
|
|
-# (查→Go / 卡→held / 侧→side / 换→replace / 上→upper / 步→steps ...):
|
|
|
-# 它们在词表收录了的长词里被最长匹配保护住, 一旦碰到**未收录的长词**就把词切碎。
|
|
|
-#
|
|
|
-# 这类长尾技术文本(手册排查步骤、告警处置)不可能穷举收词, 所以靠"补长词"堵不住。
|
|
|
-# 判断: **半译比不译更糟** —— "检Go 机 side" 读不通且显得系统劣质,
|
|
|
-# 而完整的 "检查机侧" 至少是句能读的话, 客户看得出这是未翻译区而非系统出错。
|
|
|
-# 故删除所有汉字单字, 只保留标点与符号映射 (那些无歧义)。
|
|
|
-_CJK1 = [k for k in TERMS if len(k) == 1 and '一' <= k <= '鿿']
|
|
|
-for _k in _CJK1:
|
|
|
- del TERMS[_k]
|
|
|
-_RE = None # 词表变了, 强制重编译
|
|
|
-
|
|
|
-# 单字按钮的收尾: 删除汉字单字条目后, 界面上孤立的单字按钮(查/看)不再被译。
|
|
|
-# 解法不是把单字加回来(那会重新切碎长词), 而是把按钮文案本身改成双字词。
|
|
|
-TERMS.update({'查询': 'Query', '查看': 'View', '常用': 'Common', '未知告警码': 'Unknown alarm code'})
|
|
|
-_RE = None
|
|
|
-
|
|
|
-# ── 21 告警码链模板与码名 ──────────────────────────────────────────
|
|
|
-# 用户: 还有很多字没改过来。实测预烤 JSON 里含中文的串 6131 个 —— 全译出 3021,
|
|
|
-# 整段回退 878 (23918 字), 部分残留 2232 (14166 字)。残留高度集中在**模板化**的
|
|
|
-# 告警码链与失效模式链上, 所以补模板词的边际收益远高于补零散长句。
|
|
|
-TERMS.update({
|
|
|
- # 模板 (每条告警码链都出现, 频次见注释)
|
|
|
- '告警类型': 'alarm type', # 120
|
|
|
- '码表故障原因': 'code-table fault cause', # 60
|
|
|
- '本场报警': 'site alarms', # 130
|
|
|
- '预防性任务': 'preventive task', '预防链': 'preventive chain',
|
|
|
- '系统级': 'system-level', '按实证': 'by observed', '出现量排序': 'ranked by volume',
|
|
|
- '未归属': 'unassigned', '气动': 'pneumatic', '液压/气动失效': 'hydraulic or pneumatic failure',
|
|
|
- '码表未收录': 'not in code table',
|
|
|
- # 告警码名称 — 偏航
|
|
|
- '触发偏航限位传感器': 'yaw limit sensor triggered',
|
|
|
- '偏航圈数值超出范围': 'yaw turn count out of range',
|
|
|
- '偏航润滑油脂油位低': 'yaw grease level low',
|
|
|
- '偏航轴承润滑脂油位低': 'yaw bearing grease level low',
|
|
|
- '偏航轴承的润滑不可能': 'yaw bearing lubrication not possible',
|
|
|
- '偏航刹车压力传感器错误': 'yaw brake pressure sensor error',
|
|
|
- '偏航齿盘压力传感器错误': 'yaw ring-gear pressure sensor error',
|
|
|
- '偏航刹车压力错误': 'yaw brake pressure error',
|
|
|
- '偏航齿盘压力错误': 'yaw ring-gear pressure error',
|
|
|
- '太多的偏航变流器警告': 'too many yaw converter warnings',
|
|
|
- '太多偏航刹车': 'too many yaw brake applications',
|
|
|
- '强制偏航一圈': 'forced yaw one turn',
|
|
|
- '无润滑时,偏航轴承': 'no lubrication, yaw bearing',
|
|
|
- '无润滑,偏航系统': 'no lubrication, yaw system',
|
|
|
- # 风传感
|
|
|
- '风向标阻塞-冰冻': 'wind vane blocked - iced', '风向标阻塞': 'wind vane blocked',
|
|
|
- '有效性-风速低': 'validity - low wind speed',
|
|
|
- # 塔架
|
|
|
- '塔筒紧停开关故障': 'tower emergency-stop switch fault',
|
|
|
- '检测到塔筒振动频率变化': 'tower vibration frequency shift detected',
|
|
|
- '机舱紧急开关故障': 'nacelle emergency switch fault',
|
|
|
- '触发应急开关': 'emergency switch triggered',
|
|
|
- '叶轮不平衡': 'rotor imbalance',
|
|
|
- # 变压器
|
|
|
- '变压器散热器断路器跳开': 'transformer radiator breaker tripped',
|
|
|
- '变压器油温高': 'transformer oil temperature high',
|
|
|
- '变压器油位过低': 'transformer oil level too low',
|
|
|
- '变压器油压力过高': 'transformer oil pressure too high',
|
|
|
- '变压器油泵跳开': 'transformer oil pump tripped',
|
|
|
- # 运行与控制
|
|
|
- '由于功率提升延迟引起的停机': 'stop due to power ramp-up delay',
|
|
|
- '最大转速等待时间超时': 'maximum speed wait timeout',
|
|
|
- '在本地操作中的风机': 'turbine in local control',
|
|
|
- '逾时直流回路充电': 'DC-link charging timeout',
|
|
|
- '避雷器压敏电阻误差': 'surge arrester varistor error',
|
|
|
- '变流器冷却机模式': 'converter cooler mode',
|
|
|
- '软件更新停机': 'software update stop', '手动空转停机': 'manual idling stop',
|
|
|
- '主制动器切出': 'main brake cut out', '功率控制误差': 'power control error',
|
|
|
- '启动失败': 'start failure',
|
|
|
-})
|
|
|
-_RE = None
|
|
|
-
|
|
|
-# ── 22 高频残留收口 ────────────────────────────────────────────────
|
|
|
-# 按"部分残留串里的未译片段频次"定优先级 (比逐条读产物高效): 1091 种片段里
|
|
|
-# 前 55 种覆盖了大部分残留串。单字量词不做词条 (会切碎长词), 一律走数字上下文正则。
|
|
|
-_RE_TIMES = re.compile(r'(?<=\d)\s*次(?!数|序|要|级)')
|
|
|
-_RE_UNITS = re.compile(r'(?<=\d)\s*台(?!账|风|阶)')
|
|
|
-_RE_YEAR = re.compile(r'(?<=\d)\s*年(?![\w一-鿿])')
|
|
|
-_RE_ITEMS = re.compile(r'(?<=\d)\s*个(?!别|人|体|案|性)')
|
|
|
-_RE_STEP = re.compile(r'第\s*(?=\d)')
|
|
|
-_RE_STEPN = re.compile(r'(?<=\d)\s*步(?!骤)')
|
|
|
-_RE_TOTAL = re.compile(r'共\s*(?=\d)')
|
|
|
-_RE_IN_N = re.compile(r'分\s*(?=\d)') # 分 6 步 → in 6 steps; 挡不住的 分析/分级 是双字词, 词表先命中
|
|
|
-# '个' 后面允许跟中文 (5 个模块), 但挡掉 个别/个人/个体/个案/个性 这些真词
|
|
|
-TERMS.update({
|
|
|
- # 高频双字/多字 (数字 = 出现在多少个残留串里)
|
|
|
- '检查': 'check', # 175
|
|
|
- '资料': 'documentation', # 160
|
|
|
- '处理': 'handling', # 127
|
|
|
- '培训课件': 'training material', # 125
|
|
|
- '变频器': 'frequency converter', # 92
|
|
|
- '油脂': 'grease', # 75
|
|
|
- '是否': 'whether', # 72
|
|
|
- '线路': 'circuit', # 59
|
|
|
- '技术资料': 'technical documentation', # 52
|
|
|
- '停滞于': 'stalled at', # 50
|
|
|
- '软件': 'software', '模块': 'module', '卡钳': 'caliper', '年度': 'annual',
|
|
|
- '任务': 'task', '编码器': 'encoder', '涉码': 'codes involved', '密封': 'seal',
|
|
|
- '回转支承的安装': 'slewing bearing installation', '维修和': 'maintenance and',
|
|
|
- '指南': 'guide', '清理': 'cleaning', '螺栓': 'bolt', '征兆码': 'symptom code',
|
|
|
- '六步': 'six steps', '相关': 'related', '各': 'each ',
|
|
|
- # 常见搭配 (双字以上才收, 避免切碎)
|
|
|
- '检查项': 'check item', '处理步骤': 'handling steps', '检查内容': 'what to check',
|
|
|
- '维修': 'maintenance', '安装': 'installation', '更换': 'replacement',
|
|
|
- '紧固': 'tightening', '润滑': 'lubrication', '清洗': 'cleaning',
|
|
|
- '目视': 'visual', '测量': 'measurement', '记录': 'record',
|
|
|
-})
|
|
|
-_RE = None
|
|
|
-
|
|
|
-# 量词+名词在英文里是一个词: 中文「38 台机组」= 38 turbines, 量词要被吞掉而不是各译各的
|
|
|
-# (放宽 lookahead 后实测出 "38 unitsunit" 这种重复)。词表先于数字正则执行, 故收在这里生效。
|
|
|
-TERMS.update({
|
|
|
- '台机组': 'turbines', '台风机': 'turbines', '台机': 'turbines',
|
|
|
- '个失效模式': 'failure modes', '个模块': 'modules', '个部件': 'components',
|
|
|
- '步处理': 'handling steps', '次动作': 'actions', '个系统': 'systems',
|
|
|
- '条告警': 'alarms', '项任务': 'tasks', '类失效模式': 'failure-mode classes',
|
|
|
-})
|
|
|
-_RE = None
|
|
|
-
|
|
|
-# ── 23 领域名词与判据措辞收口 ──────────────────────────────────────
|
|
|
-# 排名口径修正后的 top: 先过脱敏 (文档名/业主名客户看不到, 不占补词预算),
|
|
|
-# 再只看"部分残留" (回退段落里的词词表其实已收)。剩下的才是真缺口。
|
|
|
-TERMS.update({
|
|
|
- # 判据与推断措辞
|
|
|
- '树深两层不外推': 'tree depth two layers, no extrapolation beyond',
|
|
|
- '定位仍需图纸与': 'localisation still requires drawings and',
|
|
|
- '需查图纸或厂商支持': 'requires drawings or vendor support',
|
|
|
- '需查图纸或厂商': 'requires drawings or vendor',
|
|
|
- '本码无手册处置条目': 'no handling entry for this code in the manual',
|
|
|
- '手册覆盖本场': 'manual coverage for this site',
|
|
|
- '非我方推断': 'not our inference', '因果来自': 'causality from', '归纳自': 'derived from',
|
|
|
- '方向归一': 'direction normalised', '轴同时非常态': 'axes abnormal simultaneously',
|
|
|
- '技术依据': 'technical basis', '窗止': 'window ends',
|
|
|
- # 电气与部件
|
|
|
- '支撑示意图': 'support diagram', '电气接口图': 'electrical interface diagram',
|
|
|
- '原理图': 'schematic', '图纸': 'drawing', '主控图纸': 'main controller drawing',
|
|
|
- '吊具图纸': 'lifting gear drawing', '开关柜': 'switchgear', '环网柜通讯': 'ring main unit comms',
|
|
|
- '供电元件': 'power supply component', '变流元件': 'converter component',
|
|
|
- '散热片': 'heat sink', '散热': 'cooling', '通风': 'ventilation', '板卡': 'board',
|
|
|
- '超声波': 'ultrasonic', '刹车': 'brake', '气象站': 'met station',
|
|
|
- '各部件资料': 'per-component documentation',
|
|
|
- '故障逻辑及处理': 'fault logic and handling',
|
|
|
- # 运维措辞
|
|
|
- '技改': 'retrofit', '出质保整改': 'end-of-warranty rectification',
|
|
|
- '全年维护': 'annual maintenance', '供给': 'supply', '走到': 'reaches',
|
|
|
- '完成三个叶片防雷导通测试': 'complete lightning-continuity test on all three blades',
|
|
|
-})
|
|
|
-_RE = None
|
|
|
-
|
|
|
-TERMS.update({'厂商支持': 'vendor support', '厂商': 'vendor', '主控': 'main controller'})
|
|
|
-_RE = None
|
|
|
-
|
|
|
-# ── 24 界面文案系统性英文化 (第一批) ────────────────────────────────
|
|
|
-# 用户令: 把系统整个重新生成一遍, 不要打补丁式翻译。
|
|
|
-# 做法不是改 serve.py 源码 —— 那里的中文串同时是 UI 文案与**数据键**
|
|
|
-# (d['停机'] 之类取值用的), 源码替换会让取值落空。改为把 UI 文案一次性补全进词表,
|
|
|
-# 显示层因此全英文, 逻辑层的键不动。以下按出现频次批量补, 不再逐条追补。
|
|
|
-TERMS.update({
|
|
|
- # 判据与结论措辞
|
|
|
- '依据': 'basis', '判别': 'discriminator', '单位': 'unit', '外部类': 'external class',
|
|
|
- '倍中位': '× median', '当前在升': 'rising metrics awaiting confirmation', '待现场核实': 'field confirmation required',
|
|
|
- '仅记录': 'recorded only', '未见异常': 'no anomaly found', '证据窗末': 'evidence window ends',
|
|
|
- '存在需现场核实或处置的异常': 'anomalies requiring field confirmation or action',
|
|
|
- '纪律': 'discipline', '可用数据': 'available data', '一级指标': 'primary indicator',
|
|
|
- '级归综合报告线': 'escalated to the consolidated report line',
|
|
|
- '进设备考核的只有': 'counted against equipment performance:',
|
|
|
- '限电属交易与调度侧': 'curtailment belongs to trading and dispatch, not equipment',
|
|
|
- # 部件与测点
|
|
|
- '主轴承前': 'main bearing front', '主轴承后': 'main bearing rear', '齿轮': 'gear', '齿箱': 'gearbox',
|
|
|
- '行星级': 'planetary stage', '一级行星': 'first planetary stage', '行星架': 'planet carrier',
|
|
|
- '高速轴转子侧': 'HSS rotor side', '传动链三部件': 'three drivetrain components',
|
|
|
- '润滑油': 'lubricating oil', '油冷': 'oil cooling', '绕组': 'winding',
|
|
|
- '元器件名称': 'component name', '设备侧': 'equipment side', '运行侧': 'operations side',
|
|
|
- # 时窗与统计
|
|
|
- '列窗': 'column window', '日期': 'date', '近90日': 'last 90 days', '近30日': 'last 30 days',
|
|
|
- '月中位': 'monthly median', '逐日中位': 'daily median', '单次时长': 'duration per event',
|
|
|
- '停机总时长h': 'total downtime h', '占停机': 'share of downtime', '停机段': 'downtime segment',
|
|
|
- '日均条数': 'events per day', '条/日': 'events/day', '影响台': 'units affected',
|
|
|
- '台级top': 'unit-level top', '全场四分位区间': 'fleet interquartile range',
|
|
|
- '月duty(秒/日)': 'monthly duty (s/day)',
|
|
|
- # 界面动作与状态
|
|
|
- '有问题的系统': 'systems with findings', '无问题不出图': 'no chart when nothing is flagged',
|
|
|
- '任一契约通道': 'any contracted channel', '工作台': 'workspace', '附录': 'appendix',
|
|
|
- '故障名称': 'fault name', '故障四象限': 'fault quadrant', '安全风险预测': 'safety risk outlook',
|
|
|
- '特性曲线多镜头': 'performance curve, multiple views', '一级显示': 'top-level view',
|
|
|
- '问题为空': 'question is empty', '启动': 'start', '卡在哪一步': 'where it stalled',
|
|
|
- '已选组件再次点击移出': 'click a selected component again to remove it',
|
|
|
- '已取消': 'withdrawn', '阴性': 'negative',
|
|
|
- # 模型档位说明
|
|
|
- '单台状态查询与快速核证': 'single-unit status and quick verification',
|
|
|
- '多台横向比对与机制推断': 'cross-unit comparison and mechanism inference',
|
|
|
- '复杂推理与交叉审核': 'complex reasoning and cross-review',
|
|
|
- '台内即时查询': 'in-unit instant query',
|
|
|
- '一个SCADA采样格': 'one SCADA sampling interval',
|
|
|
- '个码': ' codes',
|
|
|
-})
|
|
|
-_RE = None
|
|
|
-
|
|
|
-
|
|
|
-# ── 全局一致替换 (原生英文生成) ────────────────────────────────────
|
|
|
-# 2026-08-31 用户令: 不要打补丁式翻译, 整个系统重新生成一遍。
|
|
|
-#
|
|
|
-# 运行时 hook 的本质是"中文系统外面套一层英文": 它只译写入 DOM 的那一刻的文本,
|
|
|
-# JS 逻辑与 JSON 数据键仍是中文, 于是长尾永远补不完, 且源码里满是中文。
|
|
|
-# 改为**生成时对整页做全局替换** —— 关键在"全局一致":
|
|
|
-# onclick="TAB='总览'" 与 if(TAB==='总览') 同时变成 'Overview', 比较照样成立;
|
|
|
-# __SNAP__ 里的键 "停机" 与取值处 d['停机'] 同时变成 'Downtime', 取值照样命中。
|
|
|
-# 逻辑不破的前提是**同一张表、同一次替换、不做任何上下文判断**。
|
|
|
-#
|
|
|
-# 与 translate() 的区别: 这里不做混杂回退 —— 整页替换时"译完还剩中文"是常态
|
|
|
-# (长尾未覆盖), 回退会把整页退回中文。
|
|
|
-# ── 永不翻译的标识符 ──────────────────────────────────────────────
|
|
|
-# 这些中文串在系统里同时充当**数据键**: 后端构造 d['列窗']=... , 前端再 d.列窗 取回。
|
|
|
-# 译了其中任何一侧, 取值就落空 —— 2026-08-31 用户实报"报告点不开、选项点不开"的根因。
|
|
|
-# 它们在界面上的英文化由前端渲染层负责, 不在这一层做。
|
|
|
-NEVER_TRANSLATE = {
|
|
|
- '报警', '列窗', '级', '工单', '链盘', '振动结论', '矩阵', '能力', '设备状态',
|
|
|
- '总条数', '定论', '预警', '停机', '停机(调度令)', '限电·绑定', '主轴承后', '主轴承前',
|
|
|
- '换件闭环 (检出→换件→恢复)', '状态', '天数', '依据', '表', '部件', '停机时长h',
|
|
|
- '外部', '故障', '类别', '日期', '原因', '排查', '处置', '占停机',
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-def translate_all(s):
|
|
|
- """对整页文本做最长匹配的全局一致替换; 不回退、不做上下文判断。"""
|
|
|
- if not isinstance(s, str) or not s:
|
|
|
- return s
|
|
|
- r = _RE or _compile()
|
|
|
-
|
|
|
- def _sub(m):
|
|
|
- w = m.group(0)
|
|
|
- if w in NEVER_TRANSLATE: # 同时充当数据键 → 原样保留
|
|
|
- return w
|
|
|
- v = TERMS[w]
|
|
|
- nxt = s[m.end():m.end() + 1]
|
|
|
- if v and v[-1].isascii() and v[-1].isalnum() and nxt and (
|
|
|
- nxt.isalnum() or nxt == '(' or '\u4e00' <= nxt <= '\u9fff'):
|
|
|
- return v + ' '
|
|
|
- return v
|
|
|
- out = r.sub(_sub, s)
|
|
|
- out = _RE_CNT.sub(' events', _RE_ROWS.sub(' rows', out))
|
|
|
- out = _RE_TIMES.sub(' times ', out)
|
|
|
- out = _RE_UNITS.sub(' units ', out)
|
|
|
- out = _RE_YEAR.sub('', out)
|
|
|
- out = _RE_ITEMS.sub(' ', out)
|
|
|
- out = _RE_STEP.sub('No.', out)
|
|
|
- out = _RE_STEPN.sub(' steps ', out)
|
|
|
- out = _RE_TOTAL.sub('total ', out)
|
|
|
- out = _RE_IN_N.sub('in ', out)
|
|
|
- return re.sub(r'(?<=\S)[ \t]{2,}', ' ', out)
|
|
|
-
|
|
|
-
|
|
|
-# ── 源码级英文化 (保护数据键) ──────────────────────────────────────
|
|
|
-# translate_all 无差别替换会炸: `${r.停机时长h}` → `${r.Downtime hours h}`,
|
|
|
-# 属性名带空格即 JS 语法错误 (2026-08-31 实测 237 处风险点)。
|
|
|
-#
|
|
|
-# 正确的切分不是"UI 文案 vs 数据键"这种语义判断 (自动判不准), 而是**语法位置**:
|
|
|
-# .中文 属性访问 —— 键, 不译 (数据里的键也是中文, 两边必须一致)
|
|
|
-# ['中文'] 下标访问 —— 同上
|
|
|
-# "中文": 对象字面量/JSON 的键 —— 同上
|
|
|
-# 其余位置的中文都是要显示的文本, 一律译。
|
|
|
-#
|
|
|
-# 比较值不在保护之列且必须不保护: TAB==='总览' 与 onclick="TAB='总览'" 同时被译成
|
|
|
-# 'Overview', 比较照样成立 —— 一致性来自"同一张表替换所有出现处"。
|
|
|
-_PROT = [
|
|
|
- re.compile(r'\.[一-鿿][一-鿿A-Za-z0-9_]*'), # .属性
|
|
|
- re.compile(r'\[\s*[\'"][^\'"]*[一-鿿][^\'"]*[\'"]\s*\]'), # ['键']
|
|
|
- re.compile(r'[\'"][一-鿿][^\'"]{0,40}[\'"]\s*:'), # "键":
|
|
|
- # Python 关键字参数名 dict(倍中位=...) —— 译了就是非法标识符 (实逮 × median=)。
|
|
|
- # 限定在 ( 或 , 之后, 避免误伤字符串里的 "灰带=全场四分位区间" 这类显示文案。
|
|
|
- re.compile(r'(?<=[(,])\s*[一-鿿][一-鿿A-Za-z0-9_]*(?=\s*=(?!=))'),
|
|
|
- # 多行调用的续行: 关键字参数落在行首, 前面既不是 ( 也不是 , (逐行处理看不到上一行)
|
|
|
- re.compile(r'^[一-鿿][一-鿿A-Za-z0-9_]*(?=\s*=(?!=))'),
|
|
|
- # 中文函数名/变量名定义
|
|
|
- re.compile(r'(?<=def )[一-鿿][一-鿿A-Za-z0-9_]*'),
|
|
|
-]
|
|
|
-
|
|
|
-
|
|
|
-def to_english_source(src):
|
|
|
- """把一份含中文的页面源码转成英文, 保留数据键不动。"""
|
|
|
- if not isinstance(src, str) or not src:
|
|
|
- return src
|
|
|
- keep = []
|
|
|
-
|
|
|
- def hide(m):
|
|
|
- keep.append(m.group(0))
|
|
|
- return '\x00%d\x00' % (len(keep) - 1)
|
|
|
-
|
|
|
- for rx in _PROT:
|
|
|
- src = rx.sub(hide, src)
|
|
|
- src = translate_all(src)
|
|
|
- return re.sub(r'\x00(\d+)\x00', lambda m: keep[int(m.group(1))], src)
|
|
|
-
|
|
|
-# ── 25 显示文案整句原生英文 ────────────────────────────────────────
|
|
|
-# 用户: 别再用"改中文成英文"的方式, 要让英文在生成时就是原生文案。
|
|
|
-# 逐词映射拼出来的句子读着像翻译 (中文语序 + 术语堆叠); 这一批按**整句**写英文技术文档
|
|
|
-# 的表达, 整句条目在最长匹配下优先于任何词级条目, 所以它们直接决定成品读感。
|
|
|
-TERMS.update({
|
|
|
- # 状态与提示
|
|
|
- '载入中…': 'Loading…', '加载中…': 'Loading…', '进度': 'Progress',
|
|
|
- '本地模型编排中…': 'Local model working…',
|
|
|
- '未标窗': 'window not stated', '窗内无报警': 'no alarms in this window',
|
|
|
- '← 卡在这里': '← stalled here', '(+约 30 秒)': '(+ approx. 30 s)',
|
|
|
- '轻量 8B · 约 10 秒': 'Light 8B · approx. 10 s',
|
|
|
- '标准 27B · 约 30 秒': 'Standard 27B · approx. 30 s',
|
|
|
- '打印 / 存 PDF': 'Print / Save as PDF',
|
|
|
- '部件与证据': 'Component and evidence',
|
|
|
- '换前': 'before replacement', '换后': 'after replacement',
|
|
|
- '补机制定性': 'mechanism characterisation pending',
|
|
|
- '油液采样节奏': 'Oil sampling cadence', '限电侧': 'Curtailment side',
|
|
|
- '在升·待处置对账': 'Rising and pending action — reconciliation',
|
|
|
- # 链接
|
|
|
- '该问题页 →': 'Open this issue →',
|
|
|
- '该台完整问题页 →': 'Full issue page for this unit →',
|
|
|
- '完整问题页 (全部曲线与工单史) →': 'Full issue page — all curves and work-order history →',
|
|
|
- # 整句 (决定读感的部分)
|
|
|
- '只显示有问题的系统; 无问题不出图':
|
|
|
- 'Only systems with findings are shown; nothing is charted when nothing is flagged',
|
|
|
- '按各台最严重系统状态着色 · 悬停看台号':
|
|
|
- "Coloured by each unit's most severe system state · hover for the unit",
|
|
|
- '点击加入报告, 再次点击移出 · 画布里已有':
|
|
|
- 'Click to add to the report, click again to remove · already on the canvas',
|
|
|
- '还没有生成 — 在上面的交互窗输入报告要求。':
|
|
|
- 'Nothing generated yet — state what the report should cover in the panel above.',
|
|
|
- '上报版 — 判据门槛与特征频率已脱敏':
|
|
|
- 'Reporting version — criterion thresholds and characteristic frequencies redacted',
|
|
|
- '上报版隐去判据门槛与特征频率':
|
|
|
- 'the reporting version omits criterion thresholds and characteristic frequencies',
|
|
|
- '系统失效模式按实证量排 + 部件级原因':
|
|
|
- 'System failure modes ranked by observed volume, with component-level causes',
|
|
|
- '— 瓶颈集中在一步, 不是"再多看点数据"能解的':
|
|
|
- '— the bottleneck sits at a single step; more data will not clear it',
|
|
|
- '"无记录停机"不是没有故障, 是没归上因。':
|
|
|
- 'Unattributed downtime does not mean there was no fault — it means the cause was never assigned.',
|
|
|
- '右下角报警码属重复触发, 不应按条数排定优先级。':
|
|
|
- 'Codes in the lower right are repeat triggers, not faults; ranking them by count would misdirect the work.',
|
|
|
- '限电不是"低风时段收到的空令"':
|
|
|
- 'Curtailment is not an empty instruction issued during low wind',
|
|
|
- '可用率与损失率分母不同': 'availability and loss rate rest on different denominators',
|
|
|
- '这几台正是算法当初的检出台 ⇒ 故障前能看见、换件后能看见恢复。':
|
|
|
- 'These are the units the method flagged at the time — visible before the failure, '
|
|
|
- 'and visible recovering after replacement.',
|
|
|
- '该部件在本窗无 SCADA 曲线 (振动谱级证据走 windcms)':
|
|
|
- 'No SCADA curve for this component in this window; spectral evidence is handled in the CMS module',
|
|
|
- '— 台账止 2024-11, 本期检修执行与闭环无法自动判定':
|
|
|
- '— the ledger ends 2024-11, so execution and closure in the current period cannot be determined automatically',
|
|
|
- '台账 2020~2024-11, 本报告不对本期检修执行下结论':
|
|
|
- 'Ledger covers 2020 to 2024-11; this report draws no conclusion about maintenance execution in the current period',
|
|
|
- '— 四源里油液长期 stale, 只能作回测锚':
|
|
|
- '— of the four sources, oil is chronically stale and serves only as a retrospective anchor',
|
|
|
- '— 损失六成在交易与调度侧, 设备侧改善空间有限':
|
|
|
- '— six tenths of the loss sits with trading and dispatch; the equipment side has limited headroom',
|
|
|
- '(证据: 已定案)': '(evidence: established)',
|
|
|
- '(证据: 待现场核实 / 已记为基线下窗观察)':
|
|
|
- '(evidence: field confirmation required / recorded as baseline, watch next window)',
|
|
|
- '(传动链: 主承前·主承后·齿轮箱·发电机两端)':
|
|
|
- '(drivetrain: main bearing front and rear, gearbox, both generator ends)',
|
|
|
- '(主承前·主承后·齿轮箱三级·发电机DE/NDE; 悬停看逐件等级)':
|
|
|
- '(main bearing front and rear, three gearbox stages, generator DE and NDE; hover for per-component grade)',
|
|
|
- '回收 25~26 工单': 'recover the 2025–26 work orders',
|
|
|
- # ★含场名的标题必须脱敏
|
|
|
- '如东海上风电场 · 运行分析报告': 'Offshore wind farm · operations analysis report',
|
|
|
-})
|
|
|
-_RE = None
|
|
|
-
|
|
|
-# ── 26 工单与检修记录文本 ──────────────────────────────────────────
|
|
|
-# 残留的大头不是界面文案而是**数据内容** —— 工单描述、巡检项、消缺记录。
|
|
|
-# 数据库里存的就是中文, 英文版没有第二份数据源, 所以只能靠词表覆盖。
|
|
|
-# 按可消字数排序批量补 (top 60 覆盖了大半)。
|
|
|
-TERMS.update({
|
|
|
- '为该台该': "for this unit's", '轴无非常态': 'no abnormality on this axis',
|
|
|
- '日常': 'routine', '缺失': 'missing', '损坏': 'damage', '定检': 'scheduled inspection',
|
|
|
- '监测': 'monitoring', '消除': 'cleared', '消缺': 'defect clearance', '新增': 'added',
|
|
|
- '卫生': 'cleaning', '机舱卫生': 'nacelle cleaning', '机舱底部卫生': 'nacelle floor cleaning',
|
|
|
- '机舱': 'nacelle', '风扇': 'fan', '逆变器': 'inverter', '通讯': 'communication',
|
|
|
- '震动': 'vibration', '告警': 'alarm',
|
|
|
- # 检修项目
|
|
|
- '防雷导通测试': 'lightning continuity test', '导通测试': 'continuity test',
|
|
|
- '完成三个叶片防雷导通测试': 'lightning continuity test completed on all three blades',
|
|
|
- '光纤整改及升降机维护': 'fibre rectification and lift maintenance',
|
|
|
- '光纤改造': 'fibre upgrade', '升降机维护': 'lift maintenance',
|
|
|
- '垫片加装': 'shim installation', '水扩容': 'coolant top-up',
|
|
|
- '接地漏电': 'earth leakage', '平台盖板': 'platform cover',
|
|
|
- '主断路器': 'main breaker', '集油瓶': 'oil collection bottle',
|
|
|
- '不间断电源旁路': 'UPS bypass', '号五防钥匙': 'interlock key',
|
|
|
- '松散物体': 'loose objects', '到松散物体': 'loose objects found',
|
|
|
- '到有松散物体': 'loose objects present',
|
|
|
- # 位置描述
|
|
|
- '机侧第一个': 'machine side, first', '机侧第三个': 'machine side, third',
|
|
|
- '机侧第五个': 'machine side, fifth', '网侧第一个': 'grid side, first',
|
|
|
- # 数据来源与口径
|
|
|
- '数值按需逐份解析': 'values parsed per report as required',
|
|
|
- '非第三方独立源': 'not an independent third-party source',
|
|
|
-})
|
|
|
-_RE = None
|
|
|
-
|
|
|
-# ── 27 报告块库标签 ────────────────────────────────────────────────
|
|
|
-# 用户截图逮到块库满屏中英混杂 (monthly generation 表 / 部件停机表 / 故障Pareto / basis 与boundary)。
|
|
|
-# 这些是前端硬编码标签, 但其中的 故障/表/与 等词同时是数据键, 落在 NEVER_TRANSLATE 里,
|
|
|
-# 于是词级替换绕不过去。解法: 收**整句**条目 —— 最长匹配优先, 整句先命中就不会再拆到单词层。
|
|
|
-TERMS.update({
|
|
|
- '逐月发电表': 'Monthly generation table',
|
|
|
- '逐月上网 / 损失 / 损失率 / 等效满发, 含数据覆盖率':
|
|
|
- 'Monthly export, loss, loss rate and equivalent full-load hours, with data coverage',
|
|
|
- '交易调度侧 / 设备侧 / 运行侧 三段占比 — 回答':
|
|
|
- 'Trading and dispatch, equipment, operations — the three-way split, answering',
|
|
|
- 'MTBF × MDT 部件象限, 分出': 'MTBF against MDT by component, separating',
|
|
|
- '部件停机表': 'Component downtime table',
|
|
|
- '逐部件停机时长 / 事件数 / MTBF / MDT / 影响台数':
|
|
|
- 'Downtime, event count, MTBF, MDT and units affected, per component',
|
|
|
- '已归因 vs 无记录停机的占比 — 无记录不等于没有故障':
|
|
|
- 'Attributed versus unattributed downtime — unattributed does not mean fault-free',
|
|
|
- '故障帕累托': 'Fault Pareto',
|
|
|
- '按条数降序 + 累计 80% 线, 找关键少数':
|
|
|
- 'Ranked by count with a cumulative 80% line, to find the vital few',
|
|
|
- '条数 × 单次时长, 区分重复触发与实际停机 — 按条数排序会误定优先级':
|
|
|
- 'Count against duration per event, separating repeat triggers from real downtime — '
|
|
|
- 'ranking by count alone misdirects priority',
|
|
|
- '按天归一的日均条数, 数据不满月单独标注':
|
|
|
- 'Events per day, normalised; partial months flagged separately',
|
|
|
- '需跟踪台的部件 / 证据源 / 六步进度 / 卡在哪一步':
|
|
|
- 'Units under tracking: component, evidence source, six-step progress, and where it stalled',
|
|
|
- '证据→机制→判级→排期→动作→验收 六步的瓶颈分布':
|
|
|
- 'Where the six steps stall: evidence, mechanism, grading, scheduling, action, acceptance',
|
|
|
- '检出 → 换件 → 复测回落的历史例证, 证明这条链是通的':
|
|
|
- 'Detection, replacement, retest — historical cases showing the chain closes',
|
|
|
- '由数据推出的行动项, 不是套话':
|
|
|
- 'Action items derived from the data, not boilerplate',
|
|
|
- '口径与边界': 'Basis and boundaries',
|
|
|
- '本地模型基于实测数据生成的运行总结 — 为图表补充文字结论, 供汇报使用':
|
|
|
- 'An operating summary written by the local model from measured data — a written '
|
|
|
- 'conclusion to accompany the charts',
|
|
|
- '先输入报告要求': 'State what the report should cover',
|
|
|
- '挑组件 + 写总结, 全程零外发':
|
|
|
- 'selecting blocks and writing the summary — nothing leaves the site',
|
|
|
- '月度运营分析': 'Monthly operations review', '周报': 'Weekly', '设备专题': 'Equipment topic',
|
|
|
- '年度总结': 'Annual review', '块库': 'Block library',
|
|
|
- '点击加入报告, 再次点击移出 · 画布里已有': 'Click to add, click again to remove · on the canvas:',
|
|
|
-})
|
|
|
-_RE = None
|
|
|
+# -*- coding: utf-8 -*-
|
|
|
+"""中→英 翻译层 (2026-08-28 用户令: 英文版系统, 给东南亚客户).
|
|
|
+
|
|
|
+不是通用机翻 —— 是这套系统的**领域词表**。做法上有三条硬约束:
|
|
|
+
|
|
|
+1. **最长匹配优先**。"报警级"必须先于"报警"匹配, 否则译出 "Alarm级";
|
|
|
+ "主轴承温度" 先于 "主轴承"。词表按 key 长度倒序编译成一条正则。
|
|
|
+2. **术语用行业通行译法, 不直译**。等效满发小时=EFLH 不是 "equivalent full hair";
|
|
|
+ 限电=curtailment 不是 "power limit"; 定论=Confirmed 不是 "final verdict"。
|
|
|
+3. **数字与标识符不动**。台号 WTG29、报警码 3225、单位 MWh/kW/h 原样保留。
|
|
|
+
|
|
|
+覆盖策略: 先 UI 骨架(导航/标题/表头/按钮/指标名), 再判据与状态词, 再说明文字。
|
|
|
+未覆盖的中文会在 audit_untranslated() 里被列出来 —— 残留必须收敛到零, 因为
|
|
|
+给外方客户看的页面里出现半句中文, 比整页中文更糟。
|
|
|
+"""
|
|
|
+import re
|
|
|
+
|
|
|
+# ── 1 导航与页面骨架 ──
|
|
|
+NAV = {
|
|
|
+ '观澜': 'Guanlan', '如东海上': 'Offshore Fleet',
|
|
|
+ '风电智能分析决策': 'Wind Fleet Analytics and Decision Support',
|
|
|
+ '风电智能': 'wind fleet intelligence',
|
|
|
+ '总览': 'Overview', '电量算账': 'Energy Accounting', '部件问题': 'Component Issues',
|
|
|
+ '振动融合分析': 'Vibration Fusion', '发电性能': 'Performance Curves',
|
|
|
+ '故障统计': 'Fault Analytics', '检修决策': 'Maintenance Decisions',
|
|
|
+ '检修助手': 'Maintenance Assistant', '汇报定制': 'Report Builder', '系统维护': 'Data Sources',
|
|
|
+}
|
|
|
+
|
|
|
+# ── 2 设备状态与判级 (windcms 两套并行体系) ──
|
|
|
+STATE = {
|
|
|
+ '危险': 'Critical', '报警级': 'Alarm level', '报警': 'Alarm', '良好': 'Good', '优秀': 'Excellent',
|
|
|
+ '不可判': 'Indeterminate', '监测不可用': 'Monitoring unavailable', '无监测': 'Not monitored',
|
|
|
+ '定论·双模审': 'Confirmed · dual-model review', '定论': 'Confirmed',
|
|
|
+ '准定论·预警': 'Near-confirmed · warning', '准定论': 'Near-confirmed',
|
|
|
+ '预警·处置升急': 'Warning · escalate', '预警·处置规划': 'Warning · plan action', '预警': 'Warning',
|
|
|
+ '候选·监视(复发)': 'Candidate · watch (recurring)', '候选·跟踪': 'Candidate · tracking',
|
|
|
+ '候选观察': 'Candidate / watch', '候选': 'Candidate',
|
|
|
+ '销案(定论)': 'Closed (confirmed)', '销案正常': 'Closed · normal', '销案': 'Closed',
|
|
|
+ '监视(不开箱)': 'Watch (no teardown)', '监视': 'Watch', '观察(发电机侧)': 'Watch (generator side)',
|
|
|
+ '观察': 'Watch', '参考': 'Reference', '未列': 'Not covered', '未收录': 'not covered',
|
|
|
+ '正样本': 'Positive control', '仲裁输入': 'Arbitration input', '弱同向新证': 'Weak concurring evidence',
|
|
|
+ '本体无新证': 'No new evidence on component', '复发候选(两轴合并)': 'Recurrence candidate (two axes merged)',
|
|
|
+ '温度单轴保留': 'Temperature axis retained', '传感器项': 'Sensor issue', '可降': 'Downgradable',
|
|
|
+ '降观察': 'Downgraded to watch', '在升': 'rising', '未闭环': 'not closed', '已闭环': 'closed loop',
|
|
|
+ '筛查级': 'screening level', '双模审': 'dual-model review', '审级': 'review tier',
|
|
|
+ 'lite审': 'lite review', '设备状态': 'Equipment state', '证据状态': 'Evidence state',
|
|
|
+}
|
|
|
+
|
|
|
+# ── 3 部件与系统 ──
|
|
|
+PART = {
|
|
|
+ '主轴承(后)+集中润滑泵': 'Main bearing (rear) + centralised lubrication pump',
|
|
|
+ '齿轮箱二级行星内齿圈': 'Gearbox 2nd-stage planetary ring gear',
|
|
|
+ '齿轮箱谱线级未映射到部件': 'Gearbox · spectral line not mapped to component',
|
|
|
+ '发电机引用同族见族主台': 'Generator · family reference, see lead unit',
|
|
|
+ '主轴承后集中润滑泵': 'Rear main-bearing lubrication pump',
|
|
|
+ '齿轮箱高速轴': 'Gearbox high-speed shaft', '齿轮箱中间轴': 'Gearbox intermediate shaft',
|
|
|
+ '主控与传感网': 'Main controller and sensor network', '变桨与液压': 'Pitch and hydraulics',
|
|
|
+ '塔架与基础': 'Tower and foundation', '塔架/结构': 'Tower / structure', '轮毂/叶片': 'Hub / blades',
|
|
|
+ '叶片与叶根': 'Blades and blade roots', '集中润滑泵': 'Centralised lubrication pump',
|
|
|
+ '电网/供电(外部)': 'Grid supply (external)', '风况(外部)': 'Wind conditions (external)',
|
|
|
+ '无记录停机': 'Unattributed downtime', '运维操作': 'OandM actions', '未归类': 'Unclassified',
|
|
|
+ '主轴承': 'Main bearing', '齿轮箱': 'Gearbox', '发电机': 'Generator', '变流器': 'Converter',
|
|
|
+ '变桨': 'Pitch', '偏航': 'Yaw', '叶片': 'Blade', '塔架': 'Tower', '主控': 'Main controller',
|
|
|
+ '轮毂': 'Hub', '油缸': 'Cylinder', '油泵': 'Pump', '测点': 'measurement point',
|
|
|
+}
|
|
|
+
|
|
|
+# ── 4 指标与口径 ──
|
|
|
+METRIC = {
|
|
|
+ '等效满发小时': 'Equivalent full-load hours', '时间可用率': 'Time-based availability',
|
|
|
+ '平均停机间隔': 'Mean time between outages', '上网电量': 'Net exported energy',
|
|
|
+ '理论可发': 'Gross available energy', '实际上网': 'Net exported', '损失率': 'Loss ratio',
|
|
|
+ '需行动机组': 'Units requiring action', '停机时长': 'Downtime hours', '停机事件数': 'Outage count',
|
|
|
+ '设备类停机': 'Equipment downtime', '外部类停机': 'External downtime', '总停机': 'Total downtime',
|
|
|
+ '影响机组数': 'Units affected', '事件数': 'Events', '停机': 'Downtime', '损失': 'Loss',
|
|
|
+ '限电·绑定': 'Curtailment (bound)', '限电命令·未绑定': 'Curtailment order (unbound)',
|
|
|
+ '停机(调度令)': 'Dispatch-ordered stop', '低风待机': 'Low-wind standby', '正常发电': 'Normal production',
|
|
|
+ '限电': 'Curtailment', '工况态': 'Operating state', '占比': 'share', '时长': 'duration',
|
|
|
+ '条数': 'count', '次数': 'count', '台数': 'units', '全场': 'fleet', '本台': 'this unit',
|
|
|
+ '数据覆盖': 'data coverage', '不满月': 'partial month', '窗内': 'in window', '窗末': 'window end',
|
|
|
+ '证据窗': 'evidence window', '判级时间窗': 'grading time window', '时间窗': 'Time window', '口径': 'basis',
|
|
|
+}
|
|
|
+
|
|
|
+# ── 5 动作与流程 ──
|
|
|
+ACTION = {
|
|
|
+ '从证据到验收的决策链': 'decision chain from evidence to verification',
|
|
|
+ '决策链进度盘': 'Decision chain status', '决策链': 'Decision chain',
|
|
|
+ '证据': 'Evidence', '机制': 'Mechanism', '判级': 'Grading', '排期': 'Scheduling',
|
|
|
+ '动作': 'Action', '验收': 'Verification', '卡在': 'held at', '下一步': 'Next step',
|
|
|
+ '抢修': 'Corrective', '预防性维护': 'Preventive', '故障树': 'Fault tree', '排程': 'Scheduling',
|
|
|
+ '工单': 'work order', '换件': 'replacement', '更换': 'replace', '检修': 'maintenance',
|
|
|
+ '闭环': 'closed loop', '端到端闭环': 'end-to-end closed loop', '派工': 'dispatch work',
|
|
|
+ '现场': 'site', '台账': 'ledger', '复测': 'retest', '核实': 'verify', '待审批': 'pending approval',
|
|
|
+}
|
|
|
+
|
|
|
+# ── 6 高频术语补齐 (2026-08-28 按渲染后残留统计倒排补, 长词在前靠正则长度排序保证) ──
|
|
|
+MORE = {
|
|
|
+ # 测量与证据面
|
|
|
+ '振动结论': 'vibration verdict', '振动信号': 'vibration signature', '振动线转录': 'from vibration line',
|
|
|
+ '振动线未收录': 'not covered by vibration line', '振动线': 'vibration line', '振动分析': 'Vibration analysis',
|
|
|
+ '振动': 'vibration', '温度通道': 'temperature channel', '温度轴': 'temperature axis',
|
|
|
+ '温度判': 'temperature verdict', '温度候选': 'temperature candidate', '温度': 'temperature',
|
|
|
+ '润滑柱塞': 'lubrication plunger', '润滑': 'lubrication', '油末样': 'last oil sample',
|
|
|
+ '油新鲜': 'oil sample fresh', '油样轴': 'oil sample axis', '油液': 'oil analysis',
|
|
|
+ '油脂水平低': 'grease level low', '油路与密封': 'oil circuit and seals', '末样': 'last sample',
|
|
|
+ '无样': 'no sample', '取样': 'sampling', '化验': 'laboratory analysis', '华标': 'lab',
|
|
|
+ # 窗与统计
|
|
|
+ '时间窗区间': 'time-window range', '判级时间窗': 'grading time window', '单次循环时长': 'cycle duration',
|
|
|
+ '单次循环': 'cycle', '逐月': 'monthly', '月度': 'monthly', '现水平': 'current level',
|
|
|
+ '轨迹': 'trend', '中位': 'median', '样本': 'sample', '总条数': 'total events',
|
|
|
+ '记基线观察': 'baseline recorded, watching', '记基线': 'baseline recorded',
|
|
|
+ '窗至': 'window through', '未提供': 'not provided', '数据时点': 'data as of',
|
|
|
+ '个月': ' months', '天数': 'days', '占时': 'time share', '累计': 'cumulative',
|
|
|
+ # 机制与判据
|
|
|
+ '根因定到部件与失效模式': 'root cause identified to component and failure mode',
|
|
|
+ '取样把根因定到部件与失效模式': 'sample to identify root cause to component and failure mode',
|
|
|
+ '机制不清则排期与动作都无依据': 'without a mechanism, neither scheduling nor action has a basis',
|
|
|
+ '同一判据是否回落': 'whether the same criterion falls back',
|
|
|
+ '历史单不对应本次问题': 'historical orders do not correspond to this finding',
|
|
|
+ '本轮动作执行后复测': 'retest after this round of action',
|
|
|
+ '须向现场核实': 'requires site verification', '未定性': 'not characterised', '定性': 'characterisation',
|
|
|
+ '未排': 'not scheduled', '未验': 'not verified', '已达': 'complete', '全通': 'all clear',
|
|
|
+ '两者非同源': 'the two are not from the same source', '负面对照': 'negative control',
|
|
|
+ '代理轴': 'proxy axis', '判别器': 'discriminator', '判据': 'criterion', '判': 'verdict',
|
|
|
+ # 部件细分
|
|
|
+ '叶根螺栓': 'blade-root bolts', '换栓': 'bolt replacement', '螺栓断裂': 'bolt fracture',
|
|
|
+ '非螺栓断裂确诊': 'not a confirmed bolt fracture', '松动嫌疑': 'suspected loosening', '松动': 'loosening',
|
|
|
+ '塔筒湿度': 'tower humidity', '湿度高告警': 'high-humidity alarm', '蓄能与压力调节': 'accumulator and pressure control',
|
|
|
+ '蓄能': 'accumulator', '液压': 'hydraulics', '执行与位置反馈': 'actuation and position feedback',
|
|
|
+ '驱动': 'drive', '轴承与': 'bearing and', '轴承': 'bearing', '逆变器通讯错误': 'inverter communication error',
|
|
|
+ '点名该叶断裂': 'names this blade as fractured', '叶断裂': 'blade fracture',
|
|
|
+ # 报表与流程
|
|
|
+ '评估报告': 'assessment report', '分册另含': 'the volume also contains', '沙盘': 'scenario model',
|
|
|
+ '情景': 'Scenario', '排查': 'investigation', '处置': 'action', '步骤': 'steps',
|
|
|
+ '明细': 'detail', '综合': 'combined', '近况': 'recent status', '逐台情况': 'per-unit status',
|
|
|
+ '融合矩阵': 'fusion matrix', '矩阵': 'matrix', '链盘': 'chain board', '能力边界': 'capability limits',
|
|
|
+ '能力': 'capability', '色标': 'colour key', '收录台': 'units covered', '机制链': 'mechanism chain',
|
|
|
+ '用户令': 'per client request', '语义类': 'semantic class', '四维': 'four-source',
|
|
|
+ '风险': 'risk', '双轴': 'dual-axis', '外部': 'external', '记录': 'record', '源': 'source',
|
|
|
+ '表': 'table', '级': ' level', '窗': 'window', '次': '', '条': '', '台': ' units',
|
|
|
+ '第': 'No.', '月': '-', '日': '', '年': '', '前': 'fore', '后': 'aft', '侧': ' side',
|
|
|
+ '与': ' and ', '无': 'none', '优': ' OK', '单': '', '末': 'last', '进': 'into',
|
|
|
+ '部件': 'component', '机组': 'unit', '正常': 'normal', '本轮': 'this round',
|
|
|
+ '不清则': 'without it, ', '都无依据': 'there is no basis', '执行后': 'after execution',
|
|
|
+}
|
|
|
+def _assert_quote_free():
|
|
|
+ """译文不得含引号或反引号 (2026-08-28 活逮): 译文会被注入 JS 字符串与 HTML 属性,
|
|
|
+ 一个撇号就让整块解析失败, 表现是"页面全空但每个 script 块单独检查都通过" — 极难定位。
|
|
|
+ 构建期直接拦, 不留到运行时。"""
|
|
|
+ bad = {k: v for k, v in TERMS.items()
|
|
|
+ if isinstance(v, str) and any(c in v for c in ('\'', '"', '`', '\\', '&', '<', '>'))}
|
|
|
+ if bad:
|
|
|
+ raise ValueError(f'译文含引号/反斜杠, 会破坏注入上下文: {list(bad)[:5]}')
|
|
|
+
|
|
|
+
|
|
|
+GROUPS = [NAV, STATE, PART, METRIC, ACTION]
|
|
|
+TERMS = {}
|
|
|
+for g in GROUPS:
|
|
|
+ TERMS.update(g)
|
|
|
+TERMS.update(MORE)
|
|
|
+# ── 8 第一阶段批量 (2026-08-28, 按渲染后残留频次倒排, 长词优先写以免被短词截断) ──
|
|
|
+TERMS.update({
|
|
|
+ # 长复合词组先写 (正则按长度排序, 这里的顺序只影响可读性)
|
|
|
+ '出带且过锚才算离群': 'outlier only if outside the band and past the anchor',
|
|
|
+ '同型机群残差': 'residual vs same-type fleet', '物理绝对锚': 'physical absolute anchor',
|
|
|
+ '四分位残差带': 'inter-quartile residual band', '控制参数一致性': 'Control-parameter consistency',
|
|
|
+ '只作回测锚非现时': 'back-test anchor only, not current-state evidence',
|
|
|
+ '不足或监测中断': 'insufficient or monitoring interrupted',
|
|
|
+ '旁路过滤器齿': 'bypass filter · gearbox', '油压力高激活': 'oil pressure high · activated',
|
|
|
+ '油压力过高': 'oil pressure too high', '各油水位检': 'oil/water level checks',
|
|
|
+ '变压器绕组最高': 'transformer winding max', '变压器油温': 'transformer oil temperature',
|
|
|
+ '变压器室': 'transformer room', '集线器通信错误': 'hub communication error',
|
|
|
+ '同油温档带宽': 'bandwidth within the same oil-temperature bin',
|
|
|
+ '就地操作模式': 'local operation mode', '电网故障穿越': 'grid fault ride-through',
|
|
|
+ '转速传感器故障': 'speed sensor fault', '电池电压低': 'battery voltage low',
|
|
|
+ '电网停电': 'grid outage', '降功率运行': 'derated operation', '此速率触': 'at this rate triggers',
|
|
|
+ '测风故障计数': 'anemometer fault count', '风速计偏置': 'anemometer bias',
|
|
|
+ '测风计数': 'anemometer count', '采样时间线': 'sampling timeline',
|
|
|
+ '不随上方': 'independent of the selector above', '时可作现时': 'usable as current evidence when',
|
|
|
+ '轻微偏离': 'slight deviation', '新出现待': 'newly appeared, pending',
|
|
|
+ '基本确认': 'largely confirmed', '可继续使用': 'may remain in service',
|
|
|
+ '机械刹车': 'mechanical brake', '油鼓风机': 'oil blower', '柜排风': 'cabinet exhaust',
|
|
|
+ '塔振模块': 'tower vibration module', '电气滑环': 'electrical slip ring', '滑环故障': 'slip-ring fault',
|
|
|
+ '缸检超时': 'cylinder check timeout', '缸超时': 'cylinder timeout', '比例阀': 'proportional valve',
|
|
|
+ '通讯故障': 'communication fault', '油位过低': 'oil level too low', '油位低': 'oil level low',
|
|
|
+ '自动重启': 'auto restart', '执行中': 'in progress', '双温差': 'dual temperature difference',
|
|
|
+ '频发易修': 'frequent but quick to fix', '罕发难修': 'rare but slow to fix',
|
|
|
+ '等效满发': 'equivalent full-load', '叶尖速比': 'tip-speed ratio', '天归一': 'per-day normalised',
|
|
|
+ # 部件与测点
|
|
|
+ '高速轴': 'high-speed shaft', '中间轴': 'intermediate shaft', '中速轴': 'intermediate-speed shaft',
|
|
|
+ '行星': 'planetary', '齿圈': 'ring gear', '内圈': 'inner race', '外圈': 'outer race',
|
|
|
+ '滑环': 'slip ring', '转子': 'rotor', '定子': 'stator', '主轴': 'main shaft', '主承': 'main bearing',
|
|
|
+ '柱塞': 'plunger', '滤芯': 'filter element', '冷却器': 'cooler', '油管': 'oil line',
|
|
|
+ '分配器': 'distributor', '桨叶': 'blade', '传动链': 'drivetrain', '塔筒': 'tower',
|
|
|
+ '油温': 'oil temperature', '油样': 'oil sample', '总线': 'bus', '备件': 'spare parts',
|
|
|
+ '两端': 'both ends', '配对差': 'paired difference', '中速': 'intermediate speed',
|
|
|
+ '高速': 'high speed', '中间': 'intermediate',
|
|
|
+ # 判据与统计
|
|
|
+ '离群': 'outlier', '谱线': 'spectral line', '残差': 'residual', '灰域': 'shaded band',
|
|
|
+ '四分位': 'quartile', '逐档': 'per bin', '最小档': 'smallest bin', '显著门': 'significance threshold',
|
|
|
+ '归因': 'attribution', '观测面': 'observation face', '监测面': 'monitoring coverage',
|
|
|
+ '没测到': 'not detected', '宽带': 'broadband', '全净': 'entirely clean', '干净': 'clean',
|
|
|
+ '慢性': 'chronic', '持平': 'unchanged', '降至': 'fell to', '极差': 'range', '对数': 'log',
|
|
|
+ '基线': 'baseline', '同族': 'same family', '引用同族': 'family reference', '族主': 'family lead',
|
|
|
+ '新证': 'new evidence', '实测': 'measured', '实证': 'empirical evidence', '印证': 'corroboration',
|
|
|
+ '检出': 'detection', '缺陷': 'defect', '疲劳': 'fatigue', '断裂': 'fracture', '过热': 'overheating',
|
|
|
+ '欠发': 'under-performance', '故障率': 'fault rate', '可用率': 'availability', '象限': 'quadrant',
|
|
|
+ '降序': 'descending', '噪声': 'noise', '特征': 'characteristic', '命中': 'match', '分组': 'grouping',
|
|
|
+ '封顶': 'cap', '额定': 'rated', '功率': 'power', '风速': 'wind speed', '转速': 'rotor speed',
|
|
|
+ '曲线': 'curve', '对风': 'yaw alignment', '对风良': 'yaw alignment OK', '对风报': 'yaw alignment alarm',
|
|
|
+ '定向': 'orientation', '泄压': 'pressure relief', '加注': 'top-up', '紧固': 'tightening',
|
|
|
+ '平均偏': 'mean deviation', '偏离': 'deviation', '偏置': 'bias',
|
|
|
+ # 流程与界面
|
|
|
+ '徽章': 'badge', '全位': 'all positions', '固定': 'fixed', '切换': 'switch', '映射到': 'mapped to',
|
|
|
+ '映射': 'mapping', '聚合': 'aggregation', '典型': 'typical', '交叉': 'cross', '不参': 'excluded from',
|
|
|
+ '可对': 'matchable', '不足': 'insufficient', '状态': 'status', '本件为': 'this item is',
|
|
|
+ '可靠性': 'reliability', '重点值': 'key value', '宽限': 'grace', '边界': 'boundary',
|
|
|
+ '调度令': 'dispatch order', '调度': 'dispatch', '监控': 'monitoring', '时序': 'time series',
|
|
|
+ '用户裁': 'client decision', '用户逮': 'caught by client', '异常': 'anomaly', '悬停': 'hover',
|
|
|
+ '能看': 'can see', '失败': 'failed', '手册': 'manual', '虚线': 'dashed', '差异': 'difference',
|
|
|
+ '限制': 'limit', '问题': 'issue', '新发': 'newly found', '发电': 'generation', '设备类': 'equipment',
|
|
|
+ '设备': 'equipment', '融合': 'fusion', '输入': 'input', '本场': 'this site', '节点': 'node',
|
|
|
+ '决策': 'decision', '详情': 'detail', '业主': 'owner', '评估': 'assessment', '撤回': 'withdrawn',
|
|
|
+ '取消': 'cancelled', '定案': 'settled', '原文': 'source text', '清洁': 'clean', '重点': 'priority',
|
|
|
+ '分账': 'attribution', '作业': 'work', '原因': 'cause', '参数': 'parameter', '类别': 'category',
|
|
|
+ '本页': 'this page', '分钟': ' min', '结构': 'structure', '码统计': 'code statistics',
|
|
|
+ '取证': 'evidence retrieval', '哪些': 'which', '修复': 'repair', '保留': 'retained',
|
|
|
+ '警告': 'warning', '故障': 'fault', '运行': 'operating', '恢复': 'recovered', '事件': 'event',
|
|
|
+ '变化': 'change', '检测': 'detection', '强烈': 'strong', '等待': 'waiting', '跳闸': 'trip',
|
|
|
+ '传感器': 'sensor', '本地': 'local', '不是': 'not', '上网': 'exported', '指标': 'indicator',
|
|
|
+ '用户': 'client', '的异常': ' anomaly', '时间': 'time',
|
|
|
+})
|
|
|
+
|
|
|
+# ── 9 第二阶段批量 ──
|
|
|
+TERMS.update({
|
|
|
+ '正是算法当初的检出台': 'these are exactly the units the algorithm flagged',
|
|
|
+ '明显超出即分布非峰': 'a clear excess means the distribution is not single-peaked',
|
|
|
+ '选组件再点击移出': 'click a block again to remove it', '全程零外发': 'nothing leaves the site',
|
|
|
+ '考核的只有': 'the only item under equipment accountability is',
|
|
|
+ '交易策略主导': 'driven by trading strategy', '正态抽样的': 'for a normal sample, the',
|
|
|
+ '落在几离散': 'sit at a few discrete positions', '环内怎么坏的': 'how it fails inside',
|
|
|
+ '简图分工': 'schematic scope', '出脂计量': 'grease output metering', '喷淋回箱': 'spray return to tank',
|
|
|
+ '急性热失效': 'acute thermal failure', '散热风扇': 'cooling fan', '手动待机': 'manual standby',
|
|
|
+ '自动解缆': 'automatic cable untwist', '长停远': 'long stop, distant', '泵超时': 'pump timeout',
|
|
|
+ '压力偏高': 'pressure high', '油压偏高': 'oil pressure high', '器储压': 'accumulator charge',
|
|
|
+ '高频短时': 'frequent · short', '低频长时': 'rare · long', '高频长时': 'frequent · long',
|
|
|
+ '低频短时': 'rare · short', '重复触发': 'repeat triggering', '非硬件': 'not hardware',
|
|
|
+ '常坏且难修': 'frequent and slow to fix', '少发好修': 'rare and quick to fix',
|
|
|
+ '关键少数': 'the vital few', '点面积': 'bubble area', '圆面积': 'circle area',
|
|
|
+ '柱高': 'bar height', '纵界': 'vertical divider', '分界': 'divider', '本底': 'background',
|
|
|
+ '采样格': 'sampling interval', '模式四': 'mode quadrant', '逐段扣损': 'losses deducted step by step',
|
|
|
+ '两数都对': 'both figures are correct', '谁的': 'whose', '哪一': 'which',
|
|
|
+ '关键少数': 'the vital few', '同档差': 'within-bin difference', '尺子巡检': 'yardstick check',
|
|
|
+ '下期计划': 'Next-period plan', '季节性': 'seasonality', '控制策略': 'control strategy',
|
|
|
+ '需跟踪': 'under tracking', '首发码': 'first alarm code', '测量链': 'measurement chain',
|
|
|
+ '可维修性': 'maintainability', '帕累托': 'Pareto', '总结': 'summary', '分析': 'analysis',
|
|
|
+ '生成': 'generate', '控制': 'control', '桨距': 'pitch angle', '吊装': 'lifting',
|
|
|
+ '执行': 'execution', '版本': 'version', '审核': 'review', '盲区': 'blind spot',
|
|
|
+ '保持常规': 'keep routine', '记为': 'recorded as', '截图逮': 'caught in screenshot',
|
|
|
+ '间隔': 'interval', '交易': 'trading', '实际': 'actual', '要求': 'requirement',
|
|
|
+ '物理': 'physical', '电网': 'grid', '海上': 'offshore', '对比': 'comparison',
|
|
|
+ '建议': 'recommendation', '分母': 'denominator', '门槛': 'threshold', '相对': 'relative',
|
|
|
+ '发现': 'finding', '完整': 'complete', '计数': 'count', '本体': 'ontology', '命令': 'command',
|
|
|
+ '微视图': 'micro-view', '叶根': 'blade root', '解缆': 'cable untwist', '解剖图': 'anatomy',
|
|
|
+ '支路': 'branch', '油路': 'oil circuit', '冷却': 'cooling', '信号': 'signal', '趋势': 'trend',
|
|
|
+ '发生': 'occurrence', '平均': 'mean', '根因': 'root cause', '不作': 'not used as',
|
|
|
+ '顶部': 'top', '特性': 'characteristic', '期望': 'expected', '佐证': 'corroborating',
|
|
|
+ '满发': 'full load', '合计': 'total', '统计': 'statistics', '万元': ' k CNY',
|
|
|
+ # 2026-09-19 变桨面零位两口径 (用户令「停机段中位、满发段中位两者分列出」) 的用词
|
|
|
+ '满发段': 'full-load segment', '顺桨停机段': 'feathered stop segment', '顺桨段': 'feathered segment',
|
|
|
+ '顺桨': 'feathered', '并列参考': 'for reference',
|
|
|
+ '天气': 'weather', '对象': 'object', '读纪律': 'reading discipline', '分支': 'branch',
|
|
|
+ '失效': 'failure', '全程': 'full window', '入口': 'entry point', '不同': 'different',
|
|
|
+ '转录': 'transcribed', '强度': 'severity', '管理': 'management', '行动': 'action',
|
|
|
+ '内有': 'contains', '接线': 'wiring', '过多': 'excessive', '油位': 'oil level',
|
|
|
+ '允许': 'permitted', '度高': ' high', '以切入': 'to cut in', '不可能': 'not possible',
|
|
|
+ '冲击量': 'impact magnitude', '路径': 'path', '电压': 'voltage', '下限': 'lower limit',
|
|
|
+ '上限': 'upper limit', '远程': 'remote', '载体': 'carrier', '机舱风': 'nacelle anemometer',
|
|
|
+ '对照': 'control', '纯图形': 'graphic-only', '复核': 'cross-check', '偏高': 'high',
|
|
|
+ '严重': 'severe', '建议尽快': 'recommend prompt', '观测': 'observation', '缓升': 'slow rise',
|
|
|
+ '回落': 'fall back', '回归': 'return', '同批': 'same batch', '增益': 'gain',
|
|
|
+ '梯度': 'gradient', '周期主导': 'cycle-dominated', '急性': 'acute', '长期': 'long-term',
|
|
|
+ '总长': 'total length', '最大': 'max', '测风': 'wind measurement', '其他': 'other',
|
|
|
+ '显示': 'display', '支持': 'support', '范式': 'template', '完成': 'complete',
|
|
|
+ '情况': 'status', '周期': 'cycle', '周报': 'Weekly', '专题': 'Topic', '改为': 'changed to',
|
|
|
+ '三段': 'three segments', '基于': 'based on', '离线': 'offline', '看组件': 'view block',
|
|
|
+ '调整顺序': 'reorder', '环比': 'month-on-month', '理论': 'theoretical', '低于': 'below',
|
|
|
+ '分解': 'breakdown', '之差': 'difference', '比值': 'ratio', '命令期': 'command period',
|
|
|
+ '被压制': 'suppressed', '风况': 'wind conditions', '不计': 'excluded', '交通': 'access',
|
|
|
+ '影响': 'impact', '段点': 'segment point', '属重复触发': 'is repeat triggering',
|
|
|
+ '总数': 'total', '瓶颈': 'bottleneck', '一列': 'column', '标量': 'scalar', '引用': 'citation',
|
|
|
+ '上报版': 'Group-report version', '轻量': 'Light', '标准': 'Standard', '声明': 'declared',
|
|
|
+ '其余': 'remaining', '时效': 'currency', '电费': 'tariff', '修完': 'repaired',
|
|
|
+ '展示': 'presentation', '原来': 'previously', '该类': 'this class', '维护面': 'maintenance surface',
|
|
|
+ '更新': 'update', '技术依': 'technical basis', '归属': 'attribution', '定规范': 'specification',
|
|
|
+ '实机': 'as-built', '什么': 'what', '缺失非': 'missing, not', '修过': 'repaired before',
|
|
|
+ '卡撤': 'card removed', '点看': 'click to view', '确诊': 'confirmed diagnosis',
|
|
|
+ '扭缆': 'cable twist', '原则': 'principle', '滚子': 'roller', '标注': 'annotation',
|
|
|
+ '集中': 'centralised', '管路': 'piping', '往复': 'reciprocating', '脂桶': 'grease drum',
|
|
|
+ '主管路': 'main line', '冲击': 'impact', '铁谱': 'ferrography', '推动': 'drive',
|
|
|
+ '压力': 'pressure', '带宽': 'bandwidth', '列宽有限': 'column width limited',
|
|
|
+ '不可读': 'not legible', '双环': 'dual ring', '上下': 'top/bottom', '右下': 'bottom-right',
|
|
|
+ '抖动': 'chatter', '刷屏': 'flooding', '左上': 'top-left', '右上': 'top-right',
|
|
|
+ '治理': 'remediation', '左下': 'bottom-left', '维持': 'maintain', '类不计': 'class excluded',
|
|
|
+ '贡献': 'contribution', '页缺': 'page missing', '并列': 'side by side', '迁入': 'moved in',
|
|
|
+ '排布': 'layout', '工作': 'work', '早三': 'earliest three', '这三': 'these three',
|
|
|
+ '人员转运': 'personnel transfer', '语义本体': 'semantic ontology', '滚动': 'scroll',
|
|
|
+ '内容会外发': 'content is sent externally', '云端': 'Cloud', '物理闸': 'physical gate',
|
|
|
+ '同一': 'same', '只有': 'only', '没有': 'no', '里的': ' in ', '的六': ' six ',
|
|
|
+})
|
|
|
+
|
|
|
+# ── 10 第三阶段: 上屏长尾 (统计已剥 JS 注释, 只补真正会显示的) ──
|
|
|
+TERMS.update({
|
|
|
+ '选组件再点击移出': 'click a block again to remove it', '两数都对': 'both figures are correct',
|
|
|
+ '样龄过期': 'sample age expired', '有效监测': 'effective monitoring', '能量过剩': 'excess energy',
|
|
|
+ '绕组三相': 'winding three-phase', '通讯模块': 'communication module', '旁路阀': 'bypass valve',
|
|
|
+ '跟踪偏差': 'tracking deviation', '数加权': 'count-weighted', '同标尺': 'same scale',
|
|
|
+ '不随本': 'independent of this', '零外发': 'no external transmission', '加热带': 'heating band',
|
|
|
+ '通信线': 'communication line', '出力': 'output', '错误': 'error', '不等于': 'is not',
|
|
|
+ '分布': 'distribution', '持续': 'sustained', '通道': 'channel', '峰值': 'peak',
|
|
|
+ '时段': 'period', '稳定': 'stable', '复合': 'composite', '结论': 'conclusion',
|
|
|
+ '关注': 'watch', '稳态': 'steady-state', '瞬态': 'transient', '可信度': 'confidence',
|
|
|
+ '现状': 'current state', '波形': 'waveform', '内容': 'content', '发作': 'episode',
|
|
|
+ '如何': 'how', '联动': 'linked', '复位': 'reset', '激活': 'activated', '桨角': 'pitch angle',
|
|
|
+ '柜左': 'cabinet left', '限需': 'limit required', '塔振': 'tower vibration', '该叶': 'this blade',
|
|
|
+ '手动': 'manual', '电机': 'motor', '端别': 'end', '载荷': 'load', '缺采': 'sampling gap',
|
|
|
+ '不在': 'not in', '断供': 'supply interruption', '高位': 'elevated', '度夏': 'summer operation',
|
|
|
+ '磨损': 'wear', '不可': 'cannot', '不给等': 'no grade given', '有过一': 'has had one',
|
|
|
+ '的多': ' more', '不代': 'does not represent', '五态': 'five states', '平铺': 'flat layout',
|
|
|
+ '展现的': 'presented', '筛选': 'filter', '系数': 'coefficient', '计算隐藏': 'computation hidden',
|
|
|
+ '所选': 'selected', '九枚举': 'nine enumerated values', '好坏': 'good/bad',
|
|
|
+ '两轴不可互相替代': 'the two axes are not interchangeable', '明确定': 'explicitly defined',
|
|
|
+ '截断的': 'truncated', '记忆': 'memory', '实心点': 'solid point', '季节': 'season',
|
|
|
+ '尺子': 'yardstick', '数量': 'count', '推理': 'reasoning', '全部': 'all', '分开': 'separate',
|
|
|
+ '剖面': 'section', '剖面符号': 'section symbol', '竖矩形': 'vertical rectangle',
|
|
|
+ '一眼看出': 'shows at a glance', '偏差': 'deviation', '长度即幅度': 'length equals magnitude',
|
|
|
+ '跨行可比': 'comparable across rows', '端口': 'port', '打开': 'open', '最高': 'highest',
|
|
|
+ '提示': 'hint', '模式归类': 'mode classification', '拆检': 'teardown inspection',
|
|
|
+ '内窥': 'borescope', '靠内窥镜': 'via borescope', '轻度损伤': 'minor damage',
|
|
|
+ '轻微损伤': 'slight damage', '中等持续': 'moderate sustained', '点蚀在': 'pitting at',
|
|
|
+ '当时的': 'at the time', '同样没看出': 'likewise not detected', '缺口': 'gap',
|
|
|
+ '西门子': 'OEM', '非链路静默': 'not link silence', '风能利用系数': 'power coefficient Cp',
|
|
|
+ '转矩': 'torque', '分册': 'volume', '取每': 'take each', '高位稳定值': 'upper stable value',
|
|
|
+ '阶跃': 'step change', '配置变更': 'configuration change', '清洗': 'cleansing',
|
|
|
+ '行程': 'travel', '泵压': 'pump pressure', '切入段': 'cut-in segment', '语义色': 'semantic colour',
|
|
|
+ '现值': 'current value', '返服': 'return to service', '对不对得上': 'whether they match',
|
|
|
+ '胶囊': 'pill', '只作回测锚': 'back-test anchor only', '术语去黑话': 'plain-language terms',
|
|
|
+ '翻译': 'translation', '黑话': 'jargon', '内部': 'internal', '缩写': 'abbreviation',
|
|
|
+ '括注': 'parenthetical', '健康': 'healthy', '排除': 'excluded', '降为': 'downgraded to',
|
|
|
+ '仪器': 'instrument', '规范': 'specification', '打头': 'leading', '即可': 'is sufficient',
|
|
|
+ '保持架': 'cage', '时域转': 'time-domain to', '有效值': 'RMS', '倍轴频': '× shaft frequency',
|
|
|
+ '轴频': 'shaft frequency', '分位': 'percentile', '宽频带总量': 'broadband total',
|
|
|
+ '阶跃上升': 'step rise', '缓慢上升': 'slow rise', '回到常态': 'back to normal',
|
|
|
+ '该批主': 'batch lead', '性组': ' group', '沿链': 'along the chain', '最高点': 'peak point',
|
|
|
+ '成分主导': 'component-dominated', '突发': 'sudden', '主要': 'main', '位于': 'located at',
|
|
|
+ '族分布堆叠': 'family distribution stack', '族分布': 'family distribution', '段宽': 'segment width',
|
|
|
+ '总和恒': 'sum constant', '段内比例': 'within-segment share', '族构成': 'family composition',
|
|
|
+ '最短': 'shortest', '保证可': 'ensures', '最多': 'at most', '汇报端口': 'reporting portal',
|
|
|
+ '客户汇报': 'client reporting', '定制化': 'customised', '决定': 'determines',
|
|
|
+ '六核心数': 'six headline figures', '用大字直出': 'shown in large type', '下沉到': 'pushed down to',
|
|
|
+ '一屏也拿得到结论': 'the first screen already carries the conclusion', '每数字带': 'each figure carries',
|
|
|
+ '结论可回溯到': 'conclusions trace back to', '组件': 'block', '主题': 'theme',
|
|
|
+ '收尾': 'closing', '能量瀑布': 'energy waterfall', '用于定位电量流向': 'locates where energy went',
|
|
|
+ '回答': 'answers', '分出': 'separates', '方向相反': 'opposite directions', '区分': 'distinguishes',
|
|
|
+ '排序会误定': 'ranking would mis-set', '的历史例证': ' historical evidence',
|
|
|
+ '证明这链是通的': 'proves the chain works end to end', '下期': 'next period',
|
|
|
+ '推出的': 'derived', '套话': 'boilerplate', '性质': 'nature', '常驻': 'always on',
|
|
|
+ '补充文字结论': 'adds a written conclusion', '供汇报使用': 'for reporting use',
|
|
|
+ '空白': 'blank', '默认空': 'empty by default', '都去掉': 'all removed', '组合': 'combination',
|
|
|
+ '一张图': 'one chart', '就是一块': 'is one block', '退化为': 'reduced to',
|
|
|
+ '客户看到的是负担': 'the client sees a burden', '长度天然由客户': 'length is set by the client',
|
|
|
+ '交互界面设计一下': 'interaction design', '区不浮动': 'fixed, not floating',
|
|
|
+ '的叙事顺序分五组': 'grouped in five by report narrative order',
|
|
|
+})
|
|
|
+
|
|
|
+# ── 11 第四阶段: 整句界面文案 (按 HTML 标签切分后的中文段, 标签本身不入表) ──
|
|
|
+TERMS.update({
|
|
|
+ '(本页按段做可靠性指标须成段, 能量账按逐条工况态算电量): 两个数都对, 不可互相相减。':
|
|
|
+ ' (this page needs contiguous segments for reliability metrics; the energy account bills state by state). Both figures are correct and must not be subtracted from one another.',
|
|
|
+ '短于 1h 的停机段': 'stops shorter than 1 h',
|
|
|
+ '差额是': 'the difference is ',
|
|
|
+ '限电前干净窗 — 2026 起交易策略主导, 曲线与控制参数含策略性少发不可作设备判据。本页含特性曲线与控制参数一致性两件, 同窗':
|
|
|
+ 'Pre-curtailment clean window — from 2026 trading strategy dominates, so curves and control parameters contain strategic under-generation and cannot serve as equipment criteria. This page holds both characteristic curves and control-parameter consistency, on the same window.',
|
|
|
+ '由另一本地模型基于': 'Reviewed by a second local model against ',
|
|
|
+ '同一份证据': 'the same evidence',
|
|
|
+ '复核上述答案。溯源核验仅校验数字与机组号是否越界, 本项校验结论是否有证据支撑。':
|
|
|
+ '. The traceability check only verifies that figures and unit numbers stay within the evidence; this check asks whether the conclusion is supported at all.',
|
|
|
+ '右下角的码不要按条数排优先级': 'Do not rank the bottom-right codes by event count',
|
|
|
+ ' — 属重复触发, 非硬件故障。上面两张帕累托对照看即此图的两条投影。':
|
|
|
+ ' — they are repeat triggering, not hardware faults. The two Pareto charts above are this figure projected onto each axis.',
|
|
|
+ '总览内嵌页在快照版中不可用 (它由系统实时渲染)。本快照的分析内容在上方各标签页内, 数据已随快照固化。':
|
|
|
+ 'The embedded overview is unavailable in the snapshot (it is rendered live by the system). The analysis in this snapshot is in the tabs above, with data frozen at capture time.',
|
|
|
+ '海上机组 MDT 普遍偏高是': 'Offshore MDT is generally inflated by ',
|
|
|
+ '交通窗口': 'vessel access windows',
|
|
|
+ '决定的, 不等于维修本身慢 — 跨场比 MDT 须同为海上。':
|
|
|
+ ', not by slow repair work — comparing MDT across sites requires both to be offshore.',
|
|
|
+ '这是两个指标的设计差异不是错, 但两者不可直接相乘或互推。低风待机对损失的贡献仅 118 MWh(0.5%)':
|
|
|
+ 'This is a design difference between two indicators, not an error, but they cannot be multiplied or derived from one another. Low-wind standby contributes only 118 MWh (0.5%) of losses.',
|
|
|
+ '不是物理判据: 正常数据下必然通过。它的作用是当损失被高估到不可能时(台账数字虚高曾把损失写成超过全停上限)立刻拦下':
|
|
|
+ 'Not a physical criterion: with sound data it always passes. Its purpose is to stop an impossible loss figure at once — an inflated ledger once recorded a loss larger than a full fleet stop.',
|
|
|
+ '故障前能看见、换件后能看见恢复': 'visible before failure and visible as recovery after replacement',
|
|
|
+ ', 这条链是通的; 闭环成功的台会从盘面消失。':
|
|
|
+ ' — the chain works end to end, and units that close the loop drop off this board.',
|
|
|
+ '点面积=影响台数(大=批次共性, 小=单台); 横界=条数中位, 纵界=10min(一个SCADA采样格)。':
|
|
|
+ 'Bubble area = units affected (large = fleet-wide pattern, small = single unit); the vertical divider is the count median, the horizontal one 10 minutes — one SCADA sampling interval.',
|
|
|
+ '明显超出即分布非单峰': 'a clear excess means the distribution is not single-peaked',
|
|
|
+ ' — 与左图的分组互为印证; 落在期望附近的轴(额定桨角)则是连续分布。':
|
|
|
+ ' — corroborating the grouping on the left; an axis near the expected value (rated pitch angle) is continuously distributed.',
|
|
|
+ '四个观测面是': 'The four observation faces are ',
|
|
|
+ '同一条机制链的四个面': 'four faces of a single mechanism chain',
|
|
|
+ ', 不算四个独立源 — 加权时不可当多源印证。':
|
|
|
+ ', not four independent sources — they must not be weighted as multi-source corroboration.',
|
|
|
+ '要走六步。这张盘不讲某一台的故事, 用于确认': 'Six steps in all. This board tracks the fleet, not one unit; it confirms ',
|
|
|
+ '当前需处置机组、各自所处环节、后续动作': 'which units need action, the step each is held at, and what comes next',
|
|
|
+ '不成立 — 前 72h 有报警不等于该报警与本段停机有因果 (双模审 2026-08-28 逮)。':
|
|
|
+ 'does not hold — an alarm within the preceding 72 h does not make it the cause of this stop (caught in dual-model review, 2026-08-28).',
|
|
|
+ '本地模型依据需求选取组件, 并基于实测数据生成运行总结; 数据不出本地':
|
|
|
+ 'A local model selects blocks from your request and writes an operations summary from measured data; nothing leaves this machine',
|
|
|
+ '可靠性口径 ≥1h 段, 电量账为逐条工况态 — 两个数都对, 不可相减':
|
|
|
+ 'reliability counts stops ≥1 h; the energy account bills state by state — both are correct and must not be subtracted',
|
|
|
+ '统计期 / 残月 / 工单窗 / 判级性质 — 建议常驻, 没有边界的数字堆不能作汇报依据':
|
|
|
+ 'Reporting period / partial months / work-order window / nature of the grading — recommended always on; a set of figures without its boundaries cannot serve as a reporting basis',
|
|
|
+ '六个核心数: 上网电量 / 等效满发 / 可用率 / 损失率 / 停机间隔 / 需行动台':
|
|
|
+ 'Six headline figures: net exported / equivalent full-load hours / availability / loss ratio / mean time between outages / units requiring action',
|
|
|
+ '两侧不是两个独立源, 是同一条机制链的两端。':
|
|
|
+ 'The two sides are not independent sources; they are two ends of one mechanism chain.',
|
|
|
+ '工况态分解; 损失=同工况理论出力与实测之差。量级自检为防虚高的下限闸, 不是风资源判据':
|
|
|
+ 'Operating-state decomposition; loss = theoretical output under the same conditions minus measured. The magnitude self-check is a floor gate against inflation, not a wind-resource criterion',
|
|
|
+ '限电属交易与调度侧, 2026 起交易策略主导, 少发未必是弃风。':
|
|
|
+ 'Curtailment sits with trading and dispatch; from 2026 trading strategy dominates, so reduced generation is not necessarily spilled wind.',
|
|
|
+ '由振动/温度/润滑/油液四源融合得出; 行动等级由综合报告出具':
|
|
|
+ 'derived by fusing vibration, temperature, lubrication and oil analysis; action levels are issued by the consolidated report',
|
|
|
+ ' — 损失六成在交易与调度侧, 设备侧改善空间有限':
|
|
|
+ ' — six tenths of losses sit with trading and dispatch; the scope for equipment-side improvement is limited',
|
|
|
+ ' — 台账止 2024-11, 本期检修执行与闭环无法自动判定':
|
|
|
+ ' — the ledger ends 2024-11, so maintenance execution and loop closure for this period cannot be determined automatically',
|
|
|
+ '这是配置/版本差异的形状; 磨损或工况引起的会是连续散布。两轴各自成组且分组不同台':
|
|
|
+ 'This is the shape of a configuration or version difference; wear or operating conditions would scatter continuously. The two axes group independently and the groups hold different units',
|
|
|
+ '文档预览窗 — 从上面的组件库点选内容, 此处显示报告预览':
|
|
|
+ 'Document preview — select blocks from the library above and the report appears here',
|
|
|
+ '条数=发生频次, 不反映影响程度 — 高频短时报警码(信号抖动或重复触发)排序靠前':
|
|
|
+ 'Count = frequency, not severity — high-frequency short-duration codes (signal chatter or repeat triggering) rank first',
|
|
|
+ '格子颜色 = 设备状态 (业主口径, 与 windcms 报告同一套):':
|
|
|
+ 'Cell colour = equipment state (owner convention, same set as the assessment report):',
|
|
|
+ '海上作业天气窗 · 近12月可作业日 (公开再分析统计, 非派工依据)':
|
|
|
+ 'Offshore weather windows · workable days over the last 12 months (public reanalysis statistics, not a dispatch basis)',
|
|
|
+ '排期沙盘 · 四情景损失对比 (万元, 电价区间中值; 建议级待人裁)':
|
|
|
+ 'Scheduling model · four-scenario loss comparison (k CNY, mid-point of the tariff range; advisory, pending human decision)',
|
|
|
+ '主轴承集中润滑链: 润滑泵经管路到分配器, 分配器柱塞往复把脂定量送到前后主轴承':
|
|
|
+ 'Main-bearing centralised lubrication: the pump feeds a distributor through piping, and the distributor plungers meter grease to the fore and aft main bearings',
|
|
|
+ '变桨系统: 蓄能器储压经比例阀推动油缸, 油缸驱动变桨轴承转动桨叶; 滑环传电与信号':
|
|
|
+ 'Pitch system: accumulator pressure drives the cylinder through a proportional valve, the cylinder turns the pitch bearing and blade; the slip ring carries power and signals',
|
|
|
+ '过热类失效沿油路查(冷却/滤芯), 磨损类沿齿轮线查(振动/铁谱)。':
|
|
|
+ 'Overheating failures are traced along the oil circuit (cooling, filters); wear failures along the gear line (vibration, ferrography).',
|
|
|
+ '执行侧看桨距跟踪偏差, 三叶不一致指向单支路。':
|
|
|
+ 'On the actuation side look at pitch tracking deviation; disagreement between the three blades points to a single branch.',
|
|
|
+ '观测: 蓄能带宽/停机泄压 · 桨距跟踪偏差 · 三叶零位一致性 · 轴承润滑脂':
|
|
|
+ 'Observed: accumulator bandwidth / shutdown pressure relief · pitch tracking deviation · three-blade zero consistency · bearing grease',
|
|
|
+ '窗内无该部件工单 (工单数据止 2024-11, 2026 类窗必空 = 数据边界)':
|
|
|
+ 'No work order for this component in the window (order data ends 2024-11, so any 2026 window is necessarily empty — a data boundary)',
|
|
|
+ '每个源给出: 当前覆盖 / 末次更新 / 约定位置 / 摄入命令 / 更新频率 / 责任方。':
|
|
|
+ 'Each source states: current coverage / last updated / agreed location / ingest command / update frequency / owner.',
|
|
|
+ '转录自振动线, ': 'Transcribed from the vibration line, ',
|
|
|
+ '不随上方时间窗变': 'independent of the time window above',
|
|
|
+ '; 报警/工单/温度列才跟随所选窗。': '; only the alarm, work-order and temperature columns follow the selected window.',
|
|
|
+ '本码无手册处置条目 (手册覆盖本场 161/322 码) — 需查图纸或联系厂商支持。':
|
|
|
+ 'No manual procedure for this code (the manual covers 161 of 322 codes on this site) — consult drawings or contact OEM support.',
|
|
|
+ '非厂商绑定 — 现场以铭牌与图纸复核; 参数 ID 与告警码是不同命名空间, 未按同号关联。':
|
|
|
+ 'Not vendor-locked — verify on site against nameplates and drawings; parameter IDs and alarm codes are separate namespaces and are not linked by number.',
|
|
|
+ '状态管理判级, 不代表确诊数量; 判据/谱线/计算过程不在本页 — 深潜走底部独立系统。':
|
|
|
+ 'State-management grading; it is not a count of confirmed diagnoses. Criteria, spectral lines and computation are not on this page — use the dedicated system below for depth.',
|
|
|
+ '语义本体 · 对象/机制/决策/约束 (Palantir 思路轻量自建; 判读纪律=写入闸, 违反写不进库)':
|
|
|
+ 'Semantic ontology · objects / mechanisms / decisions / constraints (lightweight, Palantir-style; the reading discipline is enforced as a write gate — violations cannot enter the store)',
|
|
|
+ '检修决策 · ontology 展现的窗口 (语义本体 + dsh 编排; 推理无界, 结论受闸)':
|
|
|
+ 'Maintenance decisions · the ontology view (semantic ontology with orchestration; reasoning is open, conclusions are gated)',
|
|
|
+ '融合 · 结构=reviewed vibration evidence and SCADA context=vibration evidence package (source-backed record, evidence review only; no rating is assigned here)':
|
|
|
+ 'Fusion · reviewed vibration evidence and SCADA context',
|
|
|
+ '判读纪律: 六个观测量=一条机制链 (C3 源数按观测面), 禁写多源印证; 判级只在 L1/审级产生, 本体转录带审级。':
|
|
|
+ 'Reading discipline: six observed quantities form one mechanism chain (independent sources are counted by observation face); do not claim multi-source corroboration. Grades originate only in the analysis layer, and the ontology transcribes them with their review tier.',
|
|
|
+})
|
|
|
+
|
|
|
+# ── 12 第五阶段: 四维状态简写与模板碎片 (逐台判据描述由"模板+数值"拼成, 模板词入表即可覆盖) ──
|
|
|
+TERMS.update({
|
|
|
+ # 四维评级的单字简写 — 逐台描述里出现最密, 不收就满屏碎字
|
|
|
+ '蓄能与压力调节': 'accumulator and pressure control', '变桨轴承与轮毂润滑': 'pitch bearing and hub lubrication',
|
|
|
+ '执行与位置反馈': 'actuation and position feedback', '油路与密封': 'oil circuit and seals',
|
|
|
+ '四维': 'four axes', '停机泄压': 'shutdown pressure decay', '蓄能缸检超时': 'accumulator cylinder check timeout',
|
|
|
+ '同油温档带宽': 'bandwidth in the same oil-temperature bin', '液压油温': 'hydraulic oil temperature',
|
|
|
+ '曲线判风速': 'curve-derived wind speed', '绕组三相极差': 'winding three-phase range',
|
|
|
+ '仪表/接线候选': 'instrumentation or wiring candidate', '记基线观': 'baseline recorded, watching',
|
|
|
+ '配对差发电机轴承': 'paired difference, generator bearing', '配对差': 'paired difference',
|
|
|
+ '驱动端': 'drive end', '非驱动端': 'non-drive end', '两端': 'both ends',
|
|
|
+ '未映射到部件': 'not mapped to a component', '未映射': 'not mapped', '谱线级': 'spectral-line level',
|
|
|
+ '引用同族': 'family reference', '见族主台': 'see family lead unit', '振动线转录': 'transcribed from vibration line',
|
|
|
+ '监测面未覆盖': 'monitoring does not cover it', '没测到': 'not measured',
|
|
|
+ '机械刹车温度': 'mechanical brake temperature', '塔筒振动': 'tower vibration',
|
|
|
+ '强烈振动停机': 'severe-vibration stop', '叶片振动检测': 'blade vibration detection',
|
|
|
+ '无有效监测': 'no effective monitoring', '不给等级': 'no grade assigned',
|
|
|
+ '湿度高告警': 'high-humidity alarm', '通讯故障': 'communication fault',
|
|
|
+ '工单点名该叶断裂': 'work order names this blade as fractured', '换栓': 'bolt replacement',
|
|
|
+ '全批疲劳磨粒最高': 'highest fatigue particle count in the batch', '批内最高': 'highest in batch',
|
|
|
+ '重点值': 'key values', '疲劳': 'fatigue', '磨粒': 'wear particles',
|
|
|
+ '端别映射': 'end mapping', '未列台': 'unit not covered', '未列≠正常': 'not covered is not the same as healthy',
|
|
|
+ '缺采': 'sampling gap', '前置': 'prerequisite', '未验': 'not verified',
|
|
|
+ '慢性载荷冲击': 'chronic load impact', '行星级周期主导': 'planetary-stage cycle dominated',
|
|
|
+ '梯度': 'gradient', '排名路径': 'ranking path', '持续路径': 'persistence path',
|
|
|
+ '渐进磨损': 'progressive wear', '点蚀': 'pitting', '剥落': 'spalling',
|
|
|
+ '标量冲击量': 'scalar impact magnitude', '可检出率': 'detection rate',
|
|
|
+ '高温跑圈': 'high-temperature race creep', '轴损': 'shaft damage', '烧蚀': 'burn damage',
|
|
|
+ '实证不可见': 'not empirically visible', '改看速度量或温度轴': 'use velocity or the temperature axis instead',
|
|
|
+ '分布正中间': 'mid-distribution', '拆检前': 'before teardown',
|
|
|
+ '因侧': 'cause side', '果侧': 'effect side', '因果时序闭合': 'cause-effect timing closes',
|
|
|
+ '机制定性窗无关': 'mechanism characterisation is window-independent',
|
|
|
+ '恶化态是窗相关判断': 'deterioration is a window-dependent judgement',
|
|
|
+ '润滑断供': 'lubrication starvation', '泵本体': 'pump body', '柱塞两段式失效': 'two-stage plunger failure',
|
|
|
+ '温度长期高位': 'sustained high temperature', '振动间歇尖峰': 'intermittent vibration spikes',
|
|
|
+ '无归因停机': 'unattributed downtime', '长停远窗': 'long stop, distant window',
|
|
|
+ '非链路静默': 'not link silence', '前6h无报警': 'no alarm in the preceding 6 h',
|
|
|
+ '镜头口径': 'lens basis', '直测干净量': 'directly measured clean quantity',
|
|
|
+ '只判形状': 'shape only', '绝对达成率须现场测风': 'absolute performance requires on-site anemometry',
|
|
|
+ '禁眼估': 'no eyeballing', '逐档中位聚合': 'per-bin median aggregation',
|
|
|
+ '已剥限电': 'curtailment removed', '只正常发电态': 'normal production only',
|
|
|
+ '全场四分位': 'fleet inter-quartile', '四分位残差带': 'inter-quartile residual band',
|
|
|
+ '出带且过锚才算离群': 'an outlier must leave the band and pass the anchor',
|
|
|
+ '物理绝对锚': 'physical absolute anchor', '显著门': 'significance gate',
|
|
|
+ '个月×台': ' unit-months', '月×台': ' unit-months', '月度聚合': 'monthly aggregation',
|
|
|
+ '不随上方窗切换': 'independent of the window selector above',
|
|
|
+ '两源时间几乎不重叠': 'the two sources barely overlap in time',
|
|
|
+ '集团模板无本场记录': 'group template, no records for this site',
|
|
|
+ '负面对照': 'negative control', '判据未乱报': 'the criterion did not misfire',
|
|
|
+ '全场极齐': 'uniform across the fleet', '无泵压异常': 'no pump-pressure anomaly',
|
|
|
+ '活动量代理': 'activity proxy', '非真磨损量': 'not true wear', '与状态位次数互核': 'cross-checked against status-bit counts',
|
|
|
+ '非发作型': 'not episodic', '机舱位置通道拖偏': 'nacelle position channel drift',
|
|
|
+ '数据质量': 'data quality', '非对风故障': 'not a yaw fault',
|
|
|
+ '参数级分组见': 'parameter-level grouping, see ', '阶跃=配置变更': 'a step is a configuration change',
|
|
|
+ '平移=工况': 'a shift is an operating condition', '两轴独立分组': 'the two axes group independently',
|
|
|
+ '润滑柱塞各台设定本就不同': 'plunger settings differ by unit by design',
|
|
|
+ '所以此列只展示不判级': 'so this column is shown without grading',
|
|
|
+ '只有已定案的机制链才标色': 'only settled mechanism chains are coloured',
|
|
|
+ '末次取样距今超': 'last sampled more than ', '此列看的是': 'this column shows ',
|
|
|
+ '同一失效机制的多个观测面': 'multiple observation faces of one failure mechanism',
|
|
|
+ '不是': ' are not ', '多源印证': 'multi-source corroboration',
|
|
|
+ '融合时禁按源数加权': 'fusion must not weight by source count',
|
|
|
+ '级小修全年窗宽': 'minor repairs have a year-round window',
|
|
|
+ '吊装级受台风季约束': 'lifting work is constrained by typhoon season',
|
|
|
+ '色深=可作业占比': 'colour depth is the workable share',
|
|
|
+ '限值=行业常规': 'limits are industry norms', '非本场合同值': 'not this site contract values',
|
|
|
+ '报': 'alarm', '良': 'good', '优': 'OK', '中位': 'median', '全场': 'fleet',
|
|
|
+ '窗至': 'window to', '判': 'graded ', '共': 'total ', '段': ' segments',
|
|
|
+ '轴': ' axis', '页': ' page', '类': ' class', '面': ' face', '点': ' point',
|
|
|
+ '看': 'see ', '卡': 'held', '该': 'this ', '依': 'basis', '九': 'nine ',
|
|
|
+ '多': 'more', '禁': 'do not ', '四': 'four ', '一': 'one ', '没': 'no ',
|
|
|
+ '在': 'in ', '上': 'upper ', '当': 'when ', '时': ' at ', '现': 'current ',
|
|
|
+ '至': 'to ', '只': 'only ', '待': 'pending ', '各': 'each ', '秒': ' s',
|
|
|
+ '别': 'end', '达': 'reached', '倍': '×', '比': 'ratio', '角': ' angle',
|
|
|
+ '态': ' state', '峰': 'peak', '律': ' law', '门': 'gate', '三': 'three ',
|
|
|
+ '度': ' degree', '警': 'alarm', '可': 'can ', '数': 'count', '松': 'loose',
|
|
|
+ '观': 'watch', '油': 'oil', '齿': 'gear', '口': 'basis', '反馈': 'feedback',
|
|
|
+ '从': 'from ', '到': 'to ', '向': 'to ', '要': 'need ', '有': 'has ',
|
|
|
+ '而': 'while ', '并': 'and ', '用': 'use ', '非': 'not ', '法': 'cannot ',
|
|
|
+ '止于': 'ends at ', '调取': 'obtain', '走完': 'complete', '万': 'k',
|
|
|
+ '长': 'long', '大': 'large', '新': 'new', '产': 'produce', '换': 'replace',
|
|
|
+ '补': 'add', '跑': 'run', '放到': 'place in ', '内': 'within', '线': ' line',
|
|
|
+ '场': ' site', '码': ' code', '季': 'quarterly', '半年': 'semi-annual', '半值': 'half of the ',
|
|
|
+ '提供': 'provided', '需': 'requires ', '实为': 'actually ', '注意': 'note ',
|
|
|
+ '至今': 'to date', '机构': 'institution', '两家': 'two providers', '到货': 'delivery',
|
|
|
+ '重跑': 'rerun', '必重跑下游': 'downstream must be rerun', '的底座': ' as the base',
|
|
|
+ '随运营': 'as operations proceed', '到位': 'in place', '自动刷新': 'auto refresh',
|
|
|
+ '怎么做': 'how to', '衍生': 'derived', '如东风场': 'site', '风机': 'turbine',
|
|
|
+ '约定位置': 'agreed location', '摄入命令': 'ingest command', '更新频率': 'update frequency',
|
|
|
+ '责任方': 'owner', '当前覆盖': 'current coverage', '末次更新': 'last updated',
|
|
|
+})
|
|
|
+
|
|
|
+# ── 13 收尾: 维护端口与剩余整句 ──
|
|
|
+TERMS.update({
|
|
|
+ '要补Data 就把新文件放到': 'to add data, place the new file in ',
|
|
|
+ '要补数据就把新文件放到': 'to add data, place the new file in ',
|
|
|
+ '再跑': ', then run ', '就把新文件放到': ', place the new file in ',
|
|
|
+ '随运营滚动 — 新数据到位跑 ingest, 图谱与判级自动刷新':
|
|
|
+ 'rolls with operations — once new data is in place, run ingest and the graph and grading refresh automatically',
|
|
|
+ '相对稳定 — 换厂商资料/换版本/参数变更时才动, 改动需审':
|
|
|
+ 'relatively stable — touched only when vendor documents, versions or parameters change, and changes require review',
|
|
|
+ '注意度总': 'note that the total ', '核过确': 'verified as ', '六类': 'six classes',
|
|
|
+ '当前止': 'currently ends at ', '缺口需现场补': 'the gap must be filled by site',
|
|
|
+ '新一轮到货重跑': 'rerun when the next batch arrives',
|
|
|
+ '振动线出件 → fusion 自动读': 'issued by the vibration line, read automatically by fusion',
|
|
|
+ '在升(末三窗/早三窗≥1.3)与换件闭环两类实证入图谱':
|
|
|
+ 'rising trend (last-three vs first-three windows) and replacement closed-loop evidence enter the graph',
|
|
|
+ '补前这类信息只在链盘里, 图谱检索不到':
|
|
|
+ 'before this, such information lived only on the chain board and was not retrievable from the graph',
|
|
|
+ '每台六步进度/停滞环节/下一步 + 全场瓶颈汇总':
|
|
|
+ 'six-step progress, stalled step and next action per unit, plus a fleet bottleneck summary',
|
|
|
+ '补前只在运行期内存里, 图谱检索不到':
|
|
|
+ 'before this it existed only in runtime memory and was not retrievable from the graph',
|
|
|
+ '判级或工单更新后': 'after a grading or work-order update', '振动线每轮出件后': 'after each vibration-line issue',
|
|
|
+ '换厂商资料时': 'when vendor documents change', '换版本时': 'when the version changes',
|
|
|
+ '参数变更时': 'when parameters change', '补充资料时': 'when documents are added',
|
|
|
+ '随码表/工单更新': 'with code-table and work-order updates', '月/事件驱动': 'monthly / event-driven',
|
|
|
+ '事件驱动': 'event-driven', '需 windscada 服务在跑': 'requires the service to be running',
|
|
|
+ '产物存在': 'artefact present', '数据源': 'data source', '摄入': 'ingest',
|
|
|
+ '现场提供': 'site provided', '化验机构': 'laboratory', '振动线': 'vibration line',
|
|
|
+ '图谱': 'knowledge graph', '本表': 'this table', '月表': 'monthly table',
|
|
|
+ '数据边界': 'data boundary', '空≠无检修': 'empty does not mean no maintenance',
|
|
|
+ '实机参数表': 'as-built parameter table', '判定规范': 'decision specification',
|
|
|
+ '技术资料索引': 'technical document index', '图纸/原理': 'drawings and principles',
|
|
|
+ '失效模式与原因树': 'failure modes and cause tree', '报警码表与处置手册': 'alarm code table and procedures',
|
|
|
+ '预防性维护': 'preventive maintenance', '检修工单台账': 'maintenance work order ledger',
|
|
|
+ '油液化验': 'oil analysis', '报警事件': 'alarm events', '月度衍生': 'monthly derived',
|
|
|
+ '趋势与闭环证据': 'trend and closed-loop evidence', '决策链进度': 'decision chain progress',
|
|
|
+ '振动评估报告': 'vibration assessment report',
|
|
|
+})
|
|
|
+
|
|
|
+# ── 14 末轮: 决策/振动/曲线三页残留 ──
|
|
|
+TERMS.update({
|
|
|
+ '一台机组从': 'A unit runs from ', '发现异常': 'anomaly detected', '修完验收': 'repaired and verified',
|
|
|
+ '这张盘不讲某一台的故事': 'this board tracks the fleet, not one unit',
|
|
|
+ '瓶颈集中在一步': 'the bottleneck sits at a single step',
|
|
|
+ '不是': 'is not ', '再多看点数据能解的': 'something more data can solve',
|
|
|
+ '核实': 'verify', '向现场调取': 'obtain from site', '台账止于': 'ledger ends at ',
|
|
|
+ '系统无法判定是否已派工': 'the system cannot tell whether work was dispatched',
|
|
|
+ '非未执行': 'not the same as not done', '数据不足不可判': 'insufficient data, indeterminate',
|
|
|
+ '这不是': 'this is not ', '偷懒': 'laziness', '历史单不对应本次问题': 'historical orders do not match this finding',
|
|
|
+ '会造出假的完成态': 'would fabricate a completed state', '要填这一列': 'to fill this column',
|
|
|
+ '须向现场要': 'requires site to provide ', '已走完全程并退出盘面': 'completed the full path and left the board',
|
|
|
+ '端到端闭环实证': 'end-to-end closed-loop evidence', '立即修': 'repair now',
|
|
|
+ '推迟': 'defer', '拖到失效': 'run to failure', '大部件成本': 'major component cost',
|
|
|
+ '作业级': 'work class', '修理窗': 'repair window', '停机损失': 'downtime loss',
|
|
|
+ '电费口径': 'tariff basis', '风险敞口': 'risk exposure', '等待月数': 'months waited',
|
|
|
+ '随板块常显': 'always shown with the panel', '各列取数窗口不同': 'columns draw on different windows',
|
|
|
+ '两格同时发红': 'both cells turn red', '不等于同时发生': 'does not mean they happened together',
|
|
|
+ '不可当共时印证': 'must not be taken as simultaneous corroboration',
|
|
|
+ '每格右侧曲线': 'the curve on the right of each cell', '逐月记忆轨迹': 'monthly trend memory',
|
|
|
+ '实心点': 'solid point', '现窗': 'current window', '快照会丢形态': 'a snapshot loses the shape',
|
|
|
+ '才看得出': 'only then can one see ', '塌': 'collapse', '回升': 'recovery', '翻转': 'reversal',
|
|
|
+ '阴性不构成证据': 'a negative does not constitute evidence', '在知盲区上': 'over a known blind spot',
|
|
|
+ '同理': 'likewise', '两条判读纪律': 'two reading rules', '随板块': 'with the panel',
|
|
|
+ '格子颜色': 'cell colour', '徽章': 'badge', '业主口径': 'owner convention',
|
|
|
+ '可信度': 'confidence', '九枚举': 'nine values', '两轴不可互相替代': 'the two axes are not interchangeable',
|
|
|
+ '说的是': 'refers to ', '设定本就不同': 'settings differ by design', '此列只展示不判级': 'this column is shown without grading',
|
|
|
+ '落位': 'position', '圆内数字': 'the number inside each circle', '连成一片': 'form a continuum',
|
|
|
+ '成因须配置台账': 'the cause requires the configuration ledger', '档下的': ' within the bin',
|
|
|
+ '标定偏移': 'calibration offset', '正态抽样': 'normal sampling', '自身的分辨力': 'its own resolving power',
|
|
|
+ '削峰': 'peak shaving', '饱和点': 'saturation point', '三叶': 'three-blade',
|
|
|
+ '集距': 'collective pitch', '不平衡': 'imbalance', '齿比': 'gear ratio',
|
|
|
+ '两轴独立分组': 'the two axes group independently', '三组': 'three groups',
|
|
|
+ '专项锚': 'dedicated anchor', '只出当期电量账': 'issues only the current-period energy account',
|
|
|
+ '数字随上方窗切换': 'figures follow the window selector above',
|
|
|
+ '唯一进设备考核的一段': 'the only segment under equipment accountability',
|
|
|
+ '命令与实际功率对得上': 'command and actual power agree',
|
|
|
+ '功率未被压制': 'power was not suppressed', '按责任归属': 'by accountability',
|
|
|
+ '限电与调度令': 'curtailment and dispatch orders', '不进设备责任': 'not equipment accountability',
|
|
|
+ '正常发电欠发与低风待机': 'under-generation in production and low-wind standby',
|
|
|
+ '能量守恒核': 'energy conservation check', '全额定上限': 'all-rated ceiling',
|
|
|
+ '量级自检': 'magnitude self-check', '最大一笔是限电不是故障': 'the largest item is curtailment, not faults',
|
|
|
+ '限电命令面占比': 'curtailment command coverage', '移至独立板块': 'moved to a separate panel',
|
|
|
+ '交付九分册一一对应': 'maps one-to-one onto the nine delivery volumes',
|
|
|
+ '无 SCADA 轴': 'no SCADA axis', '分册蓝本': 'volume basis', '巡检': 'inspection',
|
|
|
+ '独立页': 'dedicated page', '点机组号': 'click a unit number', '看全场': 'view fleet',
|
|
|
+ '项占': ' items account for ', '直接比': 'comparing directly', '会读反': 'reads backwards',
|
|
|
+ '最低但均': 'lowest yet averages ', '灰柱': 'grey bar', '本图': 'this figure',
|
|
|
+ '量排': ' ranked by volume', '点击加入报告': 'click to add to the report',
|
|
|
+ '再点击移出': 'click again to remove', '画布里已有': 'the canvas holds ',
|
|
|
+ '悬停查看组件说明': 'hover for a description', '右侧': 'on the right', '调整顺序': 'to reorder',
|
|
|
+})
|
|
|
+
|
|
|
+# ── 15 收尾末轮 ──
|
|
|
+TERMS.update({
|
|
|
+ '六步进度': 'six-step progress', '实线': 'solid line', '虚线': 'dashed line',
|
|
|
+ '能解的': 'can solve', '有过': 'previously had ', '是针对本': 'addresses this ',
|
|
|
+ '尺度': 'scale', '跨两个数量级': 'spanning two orders of magnitude', '弱源': 'weak source',
|
|
|
+ '早修成本被': 'the cost of repairing early is ', '稀释': 'diluted',
|
|
|
+ '晚修成本被': 'the cost of repairing late is ', '放大': 'amplified',
|
|
|
+ '窗口与船期': 'access windows and vessel scheduling', '船期': 'vessel scheduling',
|
|
|
+ '总表': 'master table', '自动翻绿': 'turns green automatically', '会话': 'session',
|
|
|
+ '五级来源': 'five-level source', '取最新版不写死日期': 'always takes the latest version, no hard-coded date',
|
|
|
+ '定谳链': 'settled-verdict chain', '以上': ' and above', '两轴': 'two axes',
|
|
|
+ '取严合并': 'merged on the stricter of the two', '厂商资料': 'vendor documents',
|
|
|
+ '现场反馈修正': 'site feedback corrections', '它是判据的地基': 'it underpins the criteria',
|
|
|
+ '变更须过审': 'changes require review', '运行期计算': 'computed at runtime',
|
|
|
+ '两类': 'two classes', '入图谱': 'into the knowledge graph', '厂商/技术': 'vendor / technical',
|
|
|
+ '分步处置': 'step-by-step procedure', '点击查看': 'click to view', '点击': 'click ',
|
|
|
+ '在已知盲区上': 'over a known blind spot', '见列头': 'see column headers',
|
|
|
+ '同时发生': 'simultaneous', '才看得出': 'only then is it visible: ',
|
|
|
+ '类机制签名': 'mechanism-class signature', '签名': 'signature',
|
|
|
+ '落在几个离散位置上': 'sit at a few discrete positions', '离散位置': 'discrete positions',
|
|
|
+ '偏差达中位的': 'deviation reaches the median by ', '正态期望': 'normal expectation',
|
|
|
+ '筛查': 'screening', '固定判别窗': 'fixed discrimination window',
|
|
|
+ '风速计偏高': 'anemometer reads high', '残差带': 'residual band',
|
|
|
+ '可辨门': 'discrimination gate', '标定漂移': 'calibration drift',
|
|
|
+ '判别窗': 'discrimination window', '一致': 'consistent', '刷屏': 'flooding',
|
|
|
+ '数量级': 'orders of magnitude', '中值': 'mid-value', '地基': 'foundation',
|
|
|
+ '取严': 'take the stricter', '合并': 'merge', '列头': 'column header',
|
|
|
+ '知盲区': 'known blind spot', '离散': 'discrete', '期望': 'expectation',
|
|
|
+ '计高': 'reads high', '偏高': 'reads high', '带': ' band', '门': ' gate',
|
|
|
+ '过审': 'review', '取最新版': 'latest version', '不写死': 'not hard-coded',
|
|
|
+ '期计算': ' computed', '五级': 'five-level', '来源': 'source',
|
|
|
+})
|
|
|
+
|
|
|
+# ── 16 地道化: 高可见句子整条重写 + 中文标点 ──
|
|
|
+# 用户令: 要英文技术文档的自然表达, 不是逐词替换出来的中式英语。
|
|
|
+# 逐词替换必然产出中文语序 ("bar height=均count, is not -total"), 高可见文案必须整句重写。
|
|
|
+PUNCT = {
|
|
|
+ '。': '. ', ',': ', ', '、': ', ', ';': '; ', ':': ': ',
|
|
|
+ '(': ' (', ')': ') ',
|
|
|
+ # 「」《》 在英文里没有对应形态, 且引号会被闸拦 (会破坏注入上下文) — 去掉即可, 语义不丢
|
|
|
+ '「': ' ', '」': ' ', '《': ' ', '》': ' ',
|
|
|
+ '★': '* ', '⇒': ' leads to ', '~': '~', '·': ' · ', '|': ' | ',
|
|
|
+}
|
|
|
+TERMS.update(PUNCT)
|
|
|
+TERMS.update({
|
|
|
+ # 窗声明
|
|
|
+ '本页全部数字随上方窗切换': 'all figures on this page follow the window selector above',
|
|
|
+ '本页含两个窗': 'this page uses two different windows',
|
|
|
+ '固定窗 · 不随上方切换': 'fixed window — independent of the selector above',
|
|
|
+ '窗内 2026-07 数据不满月': '2026-07 is a partial month',
|
|
|
+ '月度图已按天归一': 'monthly figures are normalised per day',
|
|
|
+ # 能量账
|
|
|
+ '理论可发 (实际+损失)': 'gross available (net exported + losses)',
|
|
|
+ '实际上网 · 等效满发': 'net exported · equivalent full-load hours',
|
|
|
+ '能量守恒核 · 理论 < 全额定上限': 'energy conservation check — gross available below the all-rated ceiling',
|
|
|
+ '限电 (命令与实际功率对得上)': 'curtailment (command matches actual power)',
|
|
|
+ '限电命令期 · 功率未被压制': 'curtailment order in force, power not suppressed',
|
|
|
+ '故障与检修停机': 'faults and maintenance downtime',
|
|
|
+ '正常发电时的欠发': 'under-generation while producing',
|
|
|
+ # 故障统计
|
|
|
+ '柱高=日均条数, 不是月总数': 'bars show events per day, not the monthly total',
|
|
|
+ '本窗 2026-07 数据不满月(灰虚线柱), 直接比月总数会读反':
|
|
|
+ '2026-07 is a partial month (grey dashed bar) — comparing raw monthly totals would reverse the reading',
|
|
|
+ '实测: 2026-07 总数最低但日均': 'measured: 2026-07 has the lowest total but the second-highest daily rate at ',
|
|
|
+ '条/日 = 全窗前列': ' events per day',
|
|
|
+ '关键少数: 前': 'the vital few — the top ', '项占 80%': ' items account for 80%',
|
|
|
+ '共 12 项, 合计': 'of 12 codes, ', '前三': 'top three',
|
|
|
+ '条数=发生频次, 不反映影响程度': 'count is frequency, not severity',
|
|
|
+ # 决策链
|
|
|
+ '一台机组从「发现异常」到「修完验收」要走六步': 'A unit moves through six steps, from anomaly detected to repaired and verified',
|
|
|
+ '要补数据就把新文件放到「约定位置」再跑「摄入命令」': 'To add data, place the file in the stated location and run its ingest command',
|
|
|
+ '这张盘不讲某一台的故事, 用于确认': 'This board tracks the fleet rather than a single unit, showing ',
|
|
|
+ '已达': 'complete', '数据不足不可判': 'insufficient data', '未达': 'not reached',
|
|
|
+ '瓶颈集中在一步, 不是「再多看点数据」能解的':
|
|
|
+ 'the bottleneck sits at one step and more data will not clear it',
|
|
|
+ '的下一步': ' — next step: ',
|
|
|
+ '定性: 现场/取样把根因定到部件与失效模式':
|
|
|
+ 'characterise on site or by sampling: identify the root cause down to component and failure mode',
|
|
|
+ '核实: 向现场调取 2025~2026 工单': 'obtain 2025–26 work orders from site',
|
|
|
+ # 维护端口
|
|
|
+ '数据维护面': 'Data sources', '个源': ' registered',
|
|
|
+ '每个源给出: 当前覆盖 / 末次更新 / 约定位置 / 摄入命令 / 更新频率 / 责任方。':
|
|
|
+ 'Each source lists coverage, last update, location, ingest command, refresh cadence and owner. ',
|
|
|
+ '要补数据就把新文件放到「约定位置」再跑「摄入命令」。':
|
|
|
+ 'To add data, place the file in the stated location and run its ingest command. ',
|
|
|
+ '随运营滚动 — 新数据到位跑摄入, 图谱与判级自动刷新':
|
|
|
+ 'Rolls with operations: once new data lands, run the ingest command and the graph and grading refresh automatically',
|
|
|
+ '相对稳定 — 换厂商资料或现场反馈修正时才动; 它是判据的地基, 变更须过审':
|
|
|
+ 'Relatively stable: changed only when vendor documents or site feedback require it. These underpin the criteria, so changes go through review',
|
|
|
+ '怎么补数据': 'How to add data', '当前覆盖': 'Coverage', '末次更新': 'Last updated',
|
|
|
+ '更新频率': 'Cadence', '责任方': 'Owner', '数据层': 'Data layer', '机理层': 'Domain layer',
|
|
|
+ '放到': 'place in ', '跑': 'run ',
|
|
|
+})
|
|
|
+
|
|
|
+# ── 17 精修: 用源码里的准确原文入表 (之前凭印象写 key, 有细微出入所以没命中) ──
|
|
|
+TERMS.update({
|
|
|
+ '随运营滚动 — 新数据到位后跑摄入, 本体与判级自动刷新':
|
|
|
+ 'Rolls with operations: when new data lands, run its ingest command and the ontology and grading refresh automatically',
|
|
|
+ '要补数据就把新文件放到': 'To add data, place the file in the ', '再跑': ' and run the ',
|
|
|
+ '约定位置': 'stated location', '摄入命令': 'ingest command',
|
|
|
+ '数据线': 'analytics team', '现场': 'site', '振动线': 'vibration team',
|
|
|
+ '化验机构': 'laboratory', '厂商/技术': 'vendor / engineering',
|
|
|
+ 'windscada → 图谱': 'analytics to knowledge graph', '振动线 → 图谱': 'vibration team to knowledge graph',
|
|
|
+ # 常见中式残片
|
|
|
+ '总table': 'master table', '注意度': 'note that ', '实为': 'is in fact ',
|
|
|
+ '级事件': '-level event', '不work order': 'is not a work order',
|
|
|
+ '六类source': 'six source classes', '核过确': 'verified as ', '需site补': 'requires site to supply ',
|
|
|
+ '新一round到货aft rerun': 'rerun when the next batch arrives',
|
|
|
+ '自动翻绿': 'turns green automatically', '两家': 'two providers',
|
|
|
+ '取严合and': 'merged on the stricter of the two', '两 axis': 'two axes',
|
|
|
+ '来source': 'source', '五 level': 'five levels', '自动取最new版': 'always takes the latest version',
|
|
|
+ '不写死期': 'no hard-coded date', '以upper': ' and above',
|
|
|
+ '会话': 'session', '期计算': ' computed at runtime', '两 class': 'two classes',
|
|
|
+ '分 steps action': 'step-by-step procedures', '分steps': 'step-by-step',
|
|
|
+})
|
|
|
+
|
|
|
+# ── 7 量词/连接词/动词 (最后补, 都是短词; 长词已在前面命中所以不会被截断) ──
|
|
|
+TERMS.update({
|
|
|
+ '非行业': 'not the industry-standard ', '真窗': 'actual window', '真': 'actual ',
|
|
|
+ '近90日固定': 'last 90 days, fixed', '所选时间窗': 'selected time window',
|
|
|
+ '判级窗': 'Grading window', '五态': 'five states', '温度月轨迹': 'monthly temperature trend',
|
|
|
+ '剔除口径': 'excl. basis', '剔除': 'excluding', '不含调度令': 'excl. dispatch orders',
|
|
|
+ '不含': 'excl. ', '含': 'incl. ', '另计': 'counted separately', '另': 'also ',
|
|
|
+ '起': '', '个': '', '处': '', '份': '', '轮': ' round', '步': ' steps',
|
|
|
+ '共': 'total ', '约': 'approx. ', '仅': 'only ', '已': '', '未': 'not ',
|
|
|
+ '按': 'by ', '见': 'see ', '据': 'per ', '经': 'via ', '含义': 'meaning',
|
|
|
+ '全真': 'all verified', '引用id数': 'cited ids', '溯源核验': 'Traceability check',
|
|
|
+ '用时': 'elapsed', '模型': 'model', '推理中': 'reasoning', '空闲': 'idle',
|
|
|
+ '提问': 'Ask', '查询': 'Query', '查': 'Go', '常查': 'Common', '报警码': 'Alarm code',
|
|
|
+ '失效模式': 'failure mode', '手册分步处置': 'manual step-by-step procedure',
|
|
|
+ '历史工单': 'historical work orders', '年度任务': 'annual task', '系统': 'system',
|
|
|
+ '本体确定性查询': 'Deterministic ontology query',
|
|
|
+ '结果': 'result', '手册与工单source-backed record': 'verbatim from manuals and work orders',
|
|
|
+ '不经模型': 'no model involved', '预设': 'Preset', '章节': 'section', '受众': 'Audience',
|
|
|
+ '场站内部': 'Internal', '上报集团': 'For group reporting', '全量': 'full', '脱敏': 'redacted',
|
|
|
+ '打印': 'Print', '存': 'Save as', '导出': 'Export', '组件库': 'Block library',
|
|
|
+ '画布': 'canvas', '文档预览': 'Document preview', '报告': 'report', '运行分析': 'Operations Analysis',
|
|
|
+ '统计期': 'Reporting period', '数据源': 'Data sources', '出件': 'issued',
|
|
|
+ '覆盖': 'coverage', '末次更新': 'last updated', '位置': 'location', '摄入': 'ingest',
|
|
|
+ '责任': 'owner', '频率': 'frequency', '说明': 'note', '存在': 'present',
|
|
|
+ '数据': 'Data', '机理': 'Domain model', '层': 'layer', '名': 'name',
|
|
|
+})
|
|
|
+
|
|
|
+_RE = None
|
|
|
+
|
|
|
+
|
|
|
+def _compile():
|
|
|
+ global _RE
|
|
|
+ keys = sorted(TERMS, key=len, reverse=True) # 最长匹配优先
|
|
|
+ _RE = re.compile('|'.join(re.escape(k) for k in keys))
|
|
|
+ return _RE
|
|
|
+
|
|
|
+
|
|
|
+# 单字量词只在数字后才是量词: ' 行' 当 key 会切进 行动等级/行星级 (实测切成 "rows 动等
|
|
|
+# level"), 加前导空格也锁不住 "/ 行动"。词表是纯字符串匹配, 表达不了上下文条件, 故后处理。
|
|
|
+_RE_ROWS = re.compile(r'(?<=\d)\s*行(?![\w\u4e00-\u9fff])')
|
|
|
+# 量词 '条' 同理: 数字后面是量词该译, 但收成单字条目会切碎 条件 / 条款 / 一条链。
|
|
|
+_RE_CNT = re.compile(r'(?<=\d)\s*条(?![\w\u4e00-\u9fff])')
|
|
|
+
|
|
|
+
|
|
|
+def translate(s):
|
|
|
+ """替换已知术语; 未知中文原样留下, 由 audit_untranslated 收口。
|
|
|
+
|
|
|
+ ★词间补空格 (2026-08-28 实测): 中文没有词界, 两个相邻中文词各自被替换后英文会直接粘连 —
|
|
|
+ "分析"+"决策" → "analysisdecision"。替换时看后一个字符, 若替换结果以字母结尾且下一个
|
|
|
+ 字符也是字母/中文, 补一个空格。这只缓解粘连, 治不了"部分覆盖"本身: 未译的中文词
|
|
|
+ 仍会夹在英文中间 ("风电智能analysis"), 所以覆盖率必须推到接近满值才可交付。
|
|
|
+ """
|
|
|
+ if not isinstance(s, str) or not s:
|
|
|
+ return s
|
|
|
+ r = _RE or _compile()
|
|
|
+
|
|
|
+ def _sub(m):
|
|
|
+ v = TERMS[m.group(0)]
|
|
|
+ nxt = s[m.end():m.end() + 1]
|
|
|
+ if v and v[-1].isascii() and v[-1].isalnum() and nxt and (nxt.isalnum() or nxt == '(' or '\u4e00' <= nxt <= '\u9fff'):
|
|
|
+ return v + ' '
|
|
|
+ return v
|
|
|
+ out = _RE_CNT.sub(' events', _RE_ROWS.sub(' rows', r.sub(_sub, s)))
|
|
|
+ # 数字上下文量词: 只有紧跟数字时才是量词, 收成单字条目会切碎 次数/第一/年度/个别/台账
|
|
|
+ out = _RE_TIMES.sub(' times ', out)
|
|
|
+ out = _RE_UNITS.sub(' units ', out)
|
|
|
+ out = _RE_YEAR.sub('', out)
|
|
|
+ out = _RE_ITEMS.sub(' ', out)
|
|
|
+ out = _RE_STEP.sub('No.', out)
|
|
|
+ out = _RE_STEPN.sub(' steps ', out)
|
|
|
+ out = _RE_TOTAL.sub('total ', out)
|
|
|
+ out = _RE_IN_N.sub('in ', out)
|
|
|
+ # 上面几条一律补尾空格防粘连 (实测 "6 stepshandling"), 再压掉行内多余空格。
|
|
|
+ # 只压 空格/tab, 不碰换行 —— 产物里有靠换行分段的文本。
|
|
|
+ out = re.sub(r'(?<=\S)[ \t]{2,}', ' ', out)
|
|
|
+ # ★混杂回退 (2026-08-30 用户在检修助手排查步骤里逮到): 词表对长尾技术文本
|
|
|
+ # (手册排查步骤、告警处置) 不可能穷举, 部分覆盖会把整句切成中英混杂 ——
|
|
|
+ # "更换机侧BCU控制器" → "replace 机侧BCUcontrol 器", 读不通且显得系统劣质。
|
|
|
+ # 判据不靠列举而靠自适应: 译完仍留下**过半**原有中文 ⇒ 这段根本没覆盖,
|
|
|
+ # 整段退回原文。完整的中文至少是句能读的话, 客户看得出这是未翻译区。
|
|
|
+ zh0 = sum(1 for c in s if '\u4e00' <= c <= '\u9fff')
|
|
|
+ if zh0 >= 6:
|
|
|
+ zh1 = sum(1 for c in out if '\u4e00' <= c <= '\u9fff')
|
|
|
+ if zh1 / zh0 > 0.5:
|
|
|
+ return s
|
|
|
+ return out
|
|
|
+
|
|
|
+
|
|
|
+def tr_deep(o):
|
|
|
+ if isinstance(o, str):
|
|
|
+ return translate(o)
|
|
|
+ if isinstance(o, dict):
|
|
|
+ return {translate(k) if isinstance(k, str) else k: tr_deep(v) for k, v in o.items()}
|
|
|
+ if isinstance(o, list):
|
|
|
+ return [tr_deep(v) for v in o]
|
|
|
+ return o
|
|
|
+
|
|
|
+
|
|
|
+def audit_untranslated(text, top=40):
|
|
|
+ """列出仍未译的中文片段, 按出现次数排 — 迭代补词表用。"""
|
|
|
+ import collections
|
|
|
+ frags = re.findall(r'[一-鿿]+', text or '')
|
|
|
+ return collections.Counter(frags).most_common(top)
|
|
|
+
|
|
|
+
|
|
|
+_assert_quote_free()
|
|
|
+
|
|
|
+# ── 18 图表说明与告警码 ────────────────────────────────────────────
|
|
|
+# 来源: 单文件版下钻浮层。这批文案此前从未进过残留统计 —— 统计只走了十个 tab 的
|
|
|
+# 页面文本, 而浮层要点击才出现。口径漏了一层, 补测 15 个浮层扫出 45 词 629 字。
|
|
|
+# 取值全部从预烤 JSON 的 fig.note / fig.unit / fig.title 抓原文, 不凭印象写 key。
|
|
|
+TERMS.update({
|
|
|
+ # 图例整句 (整句先于逐词匹配, 避免拼出中文语序)
|
|
|
+ '灰带=全场四分位区间, 深线=全场中位, 红线=本台':
|
|
|
+ 'Grey band = fleet interquartile range; dark line = fleet median; red line = this unit',
|
|
|
+ '灰带=全场四分位区间': 'Grey band = fleet interquartile range',
|
|
|
+ '振动判级交叉轴: 温度=同机制果侧观测(观测面≠源数)':
|
|
|
+ 'Vibration grading cross-check: temperature is an effect-side observation of the same '
|
|
|
+ 'mechanism (an observation face is not an independent source)',
|
|
|
+ '数据=TCM 六窗标量': 'Data: TCM six-window scalars',
|
|
|
+ '窗内合计': 'Total in window',
|
|
|
+ '判据:': 'Criterion:',
|
|
|
+ # 统计与图元
|
|
|
+ '稳健离群度': 'robust outlier score', '六窗比': 'six-window ratio',
|
|
|
+ '末窗/首窗': 'last window / first window', '六窗标量': 'six-window scalars',
|
|
|
+ '四分位区间': 'interquartile range', '全场中位': 'fleet median',
|
|
|
+ '灰带': 'grey band', '深线': 'dark line', '红线': 'red line',
|
|
|
+ '均值': 'mean', '稳健': 'robust', '档带宽': 'band width', '档': 'band',
|
|
|
+ '月样本中位': 'monthly sample median', '月样本': 'monthly sample',
|
|
|
+ '产物转录': 'transcribed from analysis outputs', '源数': 'source count',
|
|
|
+ '上升': 'rising', '定向查': 'targeted check', '报警门': 'alarm gate',
|
|
|
+ # 量与单位
|
|
|
+ '秒/日': 's/day', '泵': 'pump', '制动': 'brake',
|
|
|
+ '月度条数': 'monthly count', '报警月度条数': 'alarm count per month',
|
|
|
+ # 测点与系统
|
|
|
+ '偏航润滑泵运行时长': 'yaw lubrication pump runtime',
|
|
|
+ '桨叶零位偏差': 'blade zero-position deviation',
|
|
|
+ '齿轮箱中速轴温度': 'gearbox IMS bearing temperature',
|
|
|
+ '齿轮箱高速轴温度': 'gearbox HSS bearing temperature',
|
|
|
+ '变压器绕组最高温度': 'transformer winding peak temperature',
|
|
|
+ '主控与传感网系统': 'main controller and sensor network',
|
|
|
+ '蓄能失效候选': 'accumulator failure candidate', '蓄能行为': 'accumulator behaviour',
|
|
|
+ '振动分析摘要': 'vibration analysis summary', '振动标量': 'vibration scalars',
|
|
|
+ '偏航系统': 'yaw system', '变桨系统': 'pitch system', '偏航失败': 'yaw failure',
|
|
|
+ '发电机侧': 'generator side', '发电态': 'generating', '风传感': 'wind sensing',
|
|
|
+ '变桨分册': 'pitch volume',
|
|
|
+ # 告警码名称 (top: ... 里出现)
|
|
|
+ '自动解缆停机': 'automatic cable untwist stop',
|
|
|
+ '偏航制动液压压力异常': 'yaw brake hydraulic pressure fault',
|
|
|
+ '偏航失败-等待': 'yaw failure - waiting', '偏航失败-停止': 'yaw failure - stop',
|
|
|
+ '偏航电机过热': 'yaw motor overheat',
|
|
|
+ '偏航变流器警告过多': 'excessive yaw converter warnings',
|
|
|
+ '变流器降功率运行(DG)': 'converter derated operation (DG)',
|
|
|
+ '变流器跳闸(自动重启)': 'converter trip (auto-restart)',
|
|
|
+ 'ABB变流器PU通讯故障': 'ABB converter PU communication fault',
|
|
|
+ 'UPS电池电压低': 'UPS battery voltage low',
|
|
|
+ 'FT1超声波风速计故障': 'FT1 ultrasonic anemometer fault',
|
|
|
+ '液压监控·轮毂(变桨)压': 'hydraulic monitoring - hub (pitch) pressure',
|
|
|
+ '变桨轴承润滑(执行中)': 'pitch bearing lubrication (running)',
|
|
|
+ '变桨泵运行超时停机': 'pitch pump runtime timeout stop',
|
|
|
+ '液压油温异常': 'hydraulic oil temperature fault',
|
|
|
+ '液压油位异常': 'hydraulic oil level fault',
|
|
|
+ '轮毂部件松动': 'hub component loose',
|
|
|
+ '风速计偏高候选(A类)': 'anemometer reads-high candidate (class A)',
|
|
|
+ '风速计偏置': 'anemometer bias',
|
|
|
+})
|
|
|
+_assert_quote_free()
|
|
|
+
|
|
|
+# '条' 原映射空串, 使 "窗内合计 40 条; top:" 译成 "Total in window 40 ; top:" — 英文这里
|
|
|
+# 需要一个名词把数字接住, 空串留下悬空的分号。'次'/'起' 保持省略 (英文计数惯例不同)。
|
|
|
+TERMS['条'] = 'events'
|
|
|
+_assert_quote_free()
|
|
|
+
|
|
|
+# ── 19 图例硬编码文案 ──────────────────────────────────────────────
|
|
|
+# 这批不在 fig.note 里, 是 drawFig 渲染时拼进 SVG/HTML 的固定图例 —— 从源码 grep 会淹没在
|
|
|
+# Python 注释里, 故改从浮层 DOM 的文本节点直接抓, 只有 11 个串。key 保留 < 原形:
|
|
|
+# hook 拦的是 innerHTML 写入前的字符串, 那时实体还没解码。
|
|
|
+TERMS.update({
|
|
|
+ '条=本台/全场中位 (竖线=1× 基准, 右端封顶 2.5×); 色按 z (稳健离群度): 绿<2 · 橙2~3 · 红≥3':
|
|
|
+ 'Bar = this unit / fleet median (vertical line = 1x reference, right end capped at 2.5x); '
|
|
|
+ 'colour by z (robust outlier score): green under 2 · orange 2 to 3 · red 3 and above',
|
|
|
+ '谱级深潜与逐窗趋势 → 振动融合板块·振动分析入口 (windcms)':
|
|
|
+ 'Spectrum-level deep dive and per-window trend → Vibration Fusion section · '
|
|
|
+ 'vibration analysis entry point (windcms)',
|
|
|
+ '峭度': 'kurtosis', 'ISO烈度': 'ISO severity', '烈度': 'severity',
|
|
|
+ '速度有效值': 'velocity RMS', '零位偏差': 'zero-position deviation', '零位': 'zero position',
|
|
|
+ '竖线': 'vertical line', '右端封顶': 'right end capped at', '封顶': 'capped',
|
|
|
+ '色按': 'colour by', '基准': 'reference',
|
|
|
+ '绿': 'green', '橙': 'orange', '红': 'red',
|
|
|
+ '谱级深潜': 'spectrum-level deep dive', '深潜': 'deep dive',
|
|
|
+ '逐窗趋势': 'per-window trend', '逐窗': 'per-window', '板块': 'section',
|
|
|
+ # 测点与工况 (浮层标题)
|
|
|
+ '(发电态P>500kW)': '(generating, P over 500 kW)', '·均值 月度': '· mean, monthly',
|
|
|
+ '本台 vs 全场': 'this unit vs fleet', '记基线观察': 'baseline recorded, monitoring',
|
|
|
+ '温度候选(定向查)': 'temperature candidate (targeted check)',
|
|
|
+ '发电机驱动端(DE)轴承温度': 'generator drive-end (DE) bearing temperature',
|
|
|
+ '发电机非驱动端(NDE)轴承温度': 'generator non-drive-end (NDE) bearing temperature',
|
|
|
+ '后主轴承温度(齿轮箱侧)': 'rear main bearing temperature (gearbox side)',
|
|
|
+ '液压油温': 'hydraulic oil temperature',
|
|
|
+ '(发电机侧)': '(generator side)', '(转子侧)': '(rotor side)',
|
|
|
+ '(功率 0-1600 kW 档)': '(power band 0-1600 kW)',
|
|
|
+ '(功率 1601-2000 kW 档)': '(power band 1601-2000 kW)',
|
|
|
+ # 告警码 (第二批)
|
|
|
+ '齿轮油温度警告': 'gear oil temperature warning', '齿轮油温度高': 'gear oil temperature high',
|
|
|
+ '高速轴发电机侧齿轮轴承温': 'HSS generator-side gear bearing temperature',
|
|
|
+ 'FT1超声波风速计通讯故': 'FT1 ultrasonic anemometer communication fault',
|
|
|
+ '一次风速计故障': 'primary anemometer fault', '一次风向标失效': 'primary wind vane failure',
|
|
|
+})
|
|
|
+_assert_quote_free()
|
|
|
+
|
|
|
+# 上面那次单字回归测试顺带暴露的既有裂缝 (单字 '进' 把 "进行" 切成 "into 行")
|
|
|
+TERMS.update({'进行': 'carry out', '行动等级': 'action level', '等级': 'level'})
|
|
|
+_assert_quote_free()
|
|
|
+
|
|
|
+# ── 20 删除汉字单字条目 ────────────────────────────────────────────
|
|
|
+# 2026-08-30 用户在检修助手的排查步骤里逮到: "检查机侧BCU控制器" 被译成
|
|
|
+# "检Go 机 side BCUcontrol 器"。根因是词表里有约 110 个**汉字单字**条目
|
|
|
+# (查→Go / 卡→held / 侧→side / 换→replace / 上→upper / 步→steps ...):
|
|
|
+# 它们在词表收录了的长词里被最长匹配保护住, 一旦碰到**未收录的长词**就把词切碎。
|
|
|
+#
|
|
|
+# 这类长尾技术文本(手册排查步骤、告警处置)不可能穷举收词, 所以靠"补长词"堵不住。
|
|
|
+# 判断: **半译比不译更糟** —— "检Go 机 side" 读不通且显得系统劣质,
|
|
|
+# 而完整的 "检查机侧" 至少是句能读的话, 客户看得出这是未翻译区而非系统出错。
|
|
|
+# 故删除所有汉字单字, 只保留标点与符号映射 (那些无歧义)。
|
|
|
+_CJK1 = [k for k in TERMS if len(k) == 1 and '一' <= k <= '鿿']
|
|
|
+for _k in _CJK1:
|
|
|
+ del TERMS[_k]
|
|
|
+_RE = None # 词表变了, 强制重编译
|
|
|
+
|
|
|
+# 单字按钮的收尾: 删除汉字单字条目后, 界面上孤立的单字按钮(查/看)不再被译。
|
|
|
+# 解法不是把单字加回来(那会重新切碎长词), 而是把按钮文案本身改成双字词。
|
|
|
+TERMS.update({'查询': 'Query', '查看': 'View', '常用': 'Common', '未知告警码': 'Unknown alarm code'})
|
|
|
+_RE = None
|
|
|
+
|
|
|
+# ── 21 告警码链模板与码名 ──────────────────────────────────────────
|
|
|
+# 用户: 还有很多字没改过来。实测预烤 JSON 里含中文的串 6131 个 —— 全译出 3021,
|
|
|
+# 整段回退 878 (23918 字), 部分残留 2232 (14166 字)。残留高度集中在**模板化**的
|
|
|
+# 告警码链与失效模式链上, 所以补模板词的边际收益远高于补零散长句。
|
|
|
+TERMS.update({
|
|
|
+ # 模板 (每条告警码链都出现, 频次见注释)
|
|
|
+ '告警类型': 'alarm type', # 120
|
|
|
+ '码表故障原因': 'code-table fault cause', # 60
|
|
|
+ '本场报警': 'site alarms', # 130
|
|
|
+ '预防性任务': 'preventive task', '预防链': 'preventive chain',
|
|
|
+ '系统级': 'system-level', '按实证': 'by observed', '出现量排序': 'ranked by volume',
|
|
|
+ '未归属': 'unassigned', '气动': 'pneumatic', '液压/气动失效': 'hydraulic or pneumatic failure',
|
|
|
+ '码表未收录': 'not in code table',
|
|
|
+ # 告警码名称 — 偏航
|
|
|
+ '触发偏航限位传感器': 'yaw limit sensor triggered',
|
|
|
+ '偏航圈数值超出范围': 'yaw turn count out of range',
|
|
|
+ '偏航润滑油脂油位低': 'yaw grease level low',
|
|
|
+ '偏航轴承润滑脂油位低': 'yaw bearing grease level low',
|
|
|
+ '偏航轴承的润滑不可能': 'yaw bearing lubrication not possible',
|
|
|
+ '偏航刹车压力传感器错误': 'yaw brake pressure sensor error',
|
|
|
+ '偏航齿盘压力传感器错误': 'yaw ring-gear pressure sensor error',
|
|
|
+ '偏航刹车压力错误': 'yaw brake pressure error',
|
|
|
+ '偏航齿盘压力错误': 'yaw ring-gear pressure error',
|
|
|
+ '太多的偏航变流器警告': 'too many yaw converter warnings',
|
|
|
+ '太多偏航刹车': 'too many yaw brake applications',
|
|
|
+ '强制偏航一圈': 'forced yaw one turn',
|
|
|
+ '无润滑时,偏航轴承': 'no lubrication, yaw bearing',
|
|
|
+ '无润滑,偏航系统': 'no lubrication, yaw system',
|
|
|
+ # 风传感
|
|
|
+ '风向标阻塞-冰冻': 'wind vane blocked - iced', '风向标阻塞': 'wind vane blocked',
|
|
|
+ '有效性-风速低': 'validity - low wind speed',
|
|
|
+ # 塔架
|
|
|
+ '塔筒紧停开关故障': 'tower emergency-stop switch fault',
|
|
|
+ '检测到塔筒振动频率变化': 'tower vibration frequency shift detected',
|
|
|
+ '机舱紧急开关故障': 'nacelle emergency switch fault',
|
|
|
+ '触发应急开关': 'emergency switch triggered',
|
|
|
+ '叶轮不平衡': 'rotor imbalance',
|
|
|
+ # 变压器
|
|
|
+ '变压器散热器断路器跳开': 'transformer radiator breaker tripped',
|
|
|
+ '变压器油温高': 'transformer oil temperature high',
|
|
|
+ '变压器油位过低': 'transformer oil level too low',
|
|
|
+ '变压器油压力过高': 'transformer oil pressure too high',
|
|
|
+ '变压器油泵跳开': 'transformer oil pump tripped',
|
|
|
+ # 运行与控制
|
|
|
+ '由于功率提升延迟引起的停机': 'stop due to power ramp-up delay',
|
|
|
+ '最大转速等待时间超时': 'maximum speed wait timeout',
|
|
|
+ '在本地操作中的风机': 'turbine in local control',
|
|
|
+ '逾时直流回路充电': 'DC-link charging timeout',
|
|
|
+ '避雷器压敏电阻误差': 'surge arrester varistor error',
|
|
|
+ '变流器冷却机模式': 'converter cooler mode',
|
|
|
+ '软件更新停机': 'software update stop', '手动空转停机': 'manual idling stop',
|
|
|
+ '主制动器切出': 'main brake cut out', '功率控制误差': 'power control error',
|
|
|
+ '启动失败': 'start failure',
|
|
|
+})
|
|
|
+_RE = None
|
|
|
+
|
|
|
+# ── 22 高频残留收口 ────────────────────────────────────────────────
|
|
|
+# 按"部分残留串里的未译片段频次"定优先级 (比逐条读产物高效): 1091 种片段里
|
|
|
+# 前 55 种覆盖了大部分残留串。单字量词不做词条 (会切碎长词), 一律走数字上下文正则。
|
|
|
+_RE_TIMES = re.compile(r'(?<=\d)\s*次(?!数|序|要|级)')
|
|
|
+_RE_UNITS = re.compile(r'(?<=\d)\s*台(?!账|风|阶)')
|
|
|
+_RE_YEAR = re.compile(r'(?<=\d)\s*年(?![\w一-鿿])')
|
|
|
+_RE_ITEMS = re.compile(r'(?<=\d)\s*个(?!别|人|体|案|性)')
|
|
|
+_RE_STEP = re.compile(r'第\s*(?=\d)')
|
|
|
+_RE_STEPN = re.compile(r'(?<=\d)\s*步(?!骤)')
|
|
|
+_RE_TOTAL = re.compile(r'共\s*(?=\d)')
|
|
|
+_RE_IN_N = re.compile(r'分\s*(?=\d)') # 分 6 步 → in 6 steps; 挡不住的 分析/分级 是双字词, 词表先命中
|
|
|
+# '个' 后面允许跟中文 (5 个模块), 但挡掉 个别/个人/个体/个案/个性 这些真词
|
|
|
+TERMS.update({
|
|
|
+ # 高频双字/多字 (数字 = 出现在多少个残留串里)
|
|
|
+ '检查': 'check', # 175
|
|
|
+ '资料': 'documentation', # 160
|
|
|
+ '处理': 'handling', # 127
|
|
|
+ '培训课件': 'training material', # 125
|
|
|
+ '变频器': 'frequency converter', # 92
|
|
|
+ '油脂': 'grease', # 75
|
|
|
+ '是否': 'whether', # 72
|
|
|
+ '线路': 'circuit', # 59
|
|
|
+ '技术资料': 'technical documentation', # 52
|
|
|
+ '停滞于': 'stalled at', # 50
|
|
|
+ '软件': 'software', '模块': 'module', '卡钳': 'caliper', '年度': 'annual',
|
|
|
+ '任务': 'task', '编码器': 'encoder', '涉码': 'codes involved', '密封': 'seal',
|
|
|
+ '回转支承的安装': 'slewing bearing installation', '维修和': 'maintenance and',
|
|
|
+ '指南': 'guide', '清理': 'cleaning', '螺栓': 'bolt', '征兆码': 'symptom code',
|
|
|
+ '六步': 'six steps', '相关': 'related', '各': 'each ',
|
|
|
+ # 常见搭配 (双字以上才收, 避免切碎)
|
|
|
+ '检查项': 'check item', '处理步骤': 'handling steps', '检查内容': 'what to check',
|
|
|
+ '维修': 'maintenance', '安装': 'installation', '更换': 'replacement',
|
|
|
+ '紧固': 'tightening', '润滑': 'lubrication', '清洗': 'cleaning',
|
|
|
+ '目视': 'visual', '测量': 'measurement', '记录': 'record',
|
|
|
+})
|
|
|
+_RE = None
|
|
|
+
|
|
|
+# 量词+名词在英文里是一个词: 中文「38 台机组」= 38 turbines, 量词要被吞掉而不是各译各的
|
|
|
+# (放宽 lookahead 后实测出 "38 unitsunit" 这种重复)。词表先于数字正则执行, 故收在这里生效。
|
|
|
+TERMS.update({
|
|
|
+ '台机组': 'turbines', '台风机': 'turbines', '台机': 'turbines',
|
|
|
+ '个失效模式': 'failure modes', '个模块': 'modules', '个部件': 'components',
|
|
|
+ '步处理': 'handling steps', '次动作': 'actions', '个系统': 'systems',
|
|
|
+ '条告警': 'alarms', '项任务': 'tasks', '类失效模式': 'failure-mode classes',
|
|
|
+})
|
|
|
+_RE = None
|
|
|
+
|
|
|
+# ── 23 领域名词与判据措辞收口 ──────────────────────────────────────
|
|
|
+# 排名口径修正后的 top: 先过脱敏 (文档名/业主名客户看不到, 不占补词预算),
|
|
|
+# 再只看"部分残留" (回退段落里的词词表其实已收)。剩下的才是真缺口。
|
|
|
+TERMS.update({
|
|
|
+ # 判据与推断措辞
|
|
|
+ '树深两层不外推': 'tree depth two layers, no extrapolation beyond',
|
|
|
+ '定位仍需图纸与': 'localisation still requires drawings and',
|
|
|
+ '需查图纸或厂商支持': 'requires drawings or vendor support',
|
|
|
+ '需查图纸或厂商': 'requires drawings or vendor',
|
|
|
+ '本码无手册处置条目': 'no handling entry for this code in the manual',
|
|
|
+ '手册覆盖本场': 'manual coverage for this site',
|
|
|
+ '非我方推断': 'not our inference', '因果来自': 'causality from', '归纳自': 'derived from',
|
|
|
+ '方向归一': 'direction normalised', '轴同时非常态': 'axes abnormal simultaneously',
|
|
|
+ '技术依据': 'technical basis', '窗止': 'window ends',
|
|
|
+ # 电气与部件
|
|
|
+ '支撑示意图': 'support diagram', '电气接口图': 'electrical interface diagram',
|
|
|
+ '原理图': 'schematic', '图纸': 'drawing', '主控图纸': 'main controller drawing',
|
|
|
+ '吊具图纸': 'lifting gear drawing', '开关柜': 'switchgear', '环网柜通讯': 'ring main unit comms',
|
|
|
+ '供电元件': 'power supply component', '变流元件': 'converter component',
|
|
|
+ '散热片': 'heat sink', '散热': 'cooling', '通风': 'ventilation', '板卡': 'board',
|
|
|
+ '超声波': 'ultrasonic', '刹车': 'brake', '气象站': 'met station',
|
|
|
+ '各部件资料': 'per-component documentation',
|
|
|
+ '故障逻辑及处理': 'fault logic and handling',
|
|
|
+ # 运维措辞
|
|
|
+ '技改': 'retrofit', '出质保整改': 'end-of-warranty rectification',
|
|
|
+ '全年维护': 'annual maintenance', '供给': 'supply', '走到': 'reaches',
|
|
|
+ '完成三个叶片防雷导通测试': 'complete lightning-continuity test on all three blades',
|
|
|
+})
|
|
|
+_RE = None
|
|
|
+
|
|
|
+TERMS.update({'厂商支持': 'vendor support', '厂商': 'vendor', '主控': 'main controller'})
|
|
|
+_RE = None
|
|
|
+
|
|
|
+# ── 24 界面文案系统性英文化 (第一批) ────────────────────────────────
|
|
|
+# 用户令: 把系统整个重新生成一遍, 不要打补丁式翻译。
|
|
|
+# 做法不是改 serve.py 源码 —— 那里的中文串同时是 UI 文案与**数据键**
|
|
|
+# (d['停机'] 之类取值用的), 源码替换会让取值落空。改为把 UI 文案一次性补全进词表,
|
|
|
+# 显示层因此全英文, 逻辑层的键不动。以下按出现频次批量补, 不再逐条追补。
|
|
|
+TERMS.update({
|
|
|
+ # 判据与结论措辞
|
|
|
+ '依据': 'basis', '判别': 'discriminator', '单位': 'unit', '外部类': 'external class',
|
|
|
+ '倍中位': '× median', '当前在升': 'rising metrics awaiting confirmation', '待现场核实': 'field confirmation required',
|
|
|
+ '仅记录': 'recorded only', '未见异常': 'no anomaly found', '证据窗末': 'evidence window ends',
|
|
|
+ '存在需现场核实或处置的异常': 'anomalies requiring field confirmation or action',
|
|
|
+ '纪律': 'discipline', '可用数据': 'available data', '一级指标': 'primary indicator',
|
|
|
+ '级归综合报告线': 'escalated to the consolidated report line',
|
|
|
+ '进设备考核的只有': 'counted against equipment performance:',
|
|
|
+ '限电属交易与调度侧': 'curtailment belongs to trading and dispatch, not equipment',
|
|
|
+ # 部件与测点
|
|
|
+ '主轴承前': 'main bearing front', '主轴承后': 'main bearing rear', '齿轮': 'gear', '齿箱': 'gearbox',
|
|
|
+ '行星级': 'planetary stage', '一级行星': 'first planetary stage', '行星架': 'planet carrier',
|
|
|
+ '高速轴转子侧': 'HSS rotor side', '传动链三部件': 'three drivetrain components',
|
|
|
+ '润滑油': 'lubricating oil', '油冷': 'oil cooling', '绕组': 'winding',
|
|
|
+ '元器件名称': 'component name', '设备侧': 'equipment side', '运行侧': 'operations side',
|
|
|
+ # 时窗与统计
|
|
|
+ '列窗': 'column window', '日期': 'date', '近90日': 'last 90 days', '近30日': 'last 30 days',
|
|
|
+ '月中位': 'monthly median', '逐日中位': 'daily median', '单次时长': 'duration per event',
|
|
|
+ '停机总时长h': 'total downtime h', '占停机': 'share of downtime', '停机段': 'downtime segment',
|
|
|
+ '日均条数': 'events per day', '条/日': 'events/day', '影响台': 'units affected',
|
|
|
+ '台级top': 'unit-level top', '全场四分位区间': 'fleet interquartile range',
|
|
|
+ '月duty(秒/日)': 'monthly duty (s/day)',
|
|
|
+ # 界面动作与状态
|
|
|
+ '有问题的系统': 'systems with findings', '无问题不出图': 'no chart when nothing is flagged',
|
|
|
+ '任一契约通道': 'any contracted channel', '工作台': 'workspace', '附录': 'appendix',
|
|
|
+ '故障名称': 'fault name', '故障四象限': 'fault quadrant', '安全风险预测': 'safety risk outlook',
|
|
|
+ '特性曲线多镜头': 'performance curve, multiple views', '一级显示': 'top-level view',
|
|
|
+ '问题为空': 'question is empty', '启动': 'start', '卡在哪一步': 'where it stalled',
|
|
|
+ '已选组件再次点击移出': 'click a selected component again to remove it',
|
|
|
+ '已取消': 'withdrawn', '阴性': 'negative',
|
|
|
+ # 模型档位说明
|
|
|
+ '单台状态查询与快速核证': 'single-unit status and quick verification',
|
|
|
+ '多台横向比对与机制推断': 'cross-unit comparison and mechanism inference',
|
|
|
+ '复杂推理与交叉审核': 'complex reasoning and cross-review',
|
|
|
+ '台内即时查询': 'in-unit instant query',
|
|
|
+ '一个SCADA采样格': 'one SCADA sampling interval',
|
|
|
+ '个码': ' codes',
|
|
|
+})
|
|
|
+_RE = None
|
|
|
+
|
|
|
+
|
|
|
+# ── 全局一致替换 (原生英文生成) ────────────────────────────────────
|
|
|
+# 2026-08-31 用户令: 不要打补丁式翻译, 整个系统重新生成一遍。
|
|
|
+#
|
|
|
+# 运行时 hook 的本质是"中文系统外面套一层英文": 它只译写入 DOM 的那一刻的文本,
|
|
|
+# JS 逻辑与 JSON 数据键仍是中文, 于是长尾永远补不完, 且源码里满是中文。
|
|
|
+# 改为**生成时对整页做全局替换** —— 关键在"全局一致":
|
|
|
+# onclick="TAB='总览'" 与 if(TAB==='总览') 同时变成 'Overview', 比较照样成立;
|
|
|
+# __SNAP__ 里的键 "停机" 与取值处 d['停机'] 同时变成 'Downtime', 取值照样命中。
|
|
|
+# 逻辑不破的前提是**同一张表、同一次替换、不做任何上下文判断**。
|
|
|
+#
|
|
|
+# 与 translate() 的区别: 这里不做混杂回退 —— 整页替换时"译完还剩中文"是常态
|
|
|
+# (长尾未覆盖), 回退会把整页退回中文。
|
|
|
+# ── 永不翻译的标识符 ──────────────────────────────────────────────
|
|
|
+# 这些中文串在系统里同时充当**数据键**: 后端构造 d['列窗']=... , 前端再 d.列窗 取回。
|
|
|
+# 译了其中任何一侧, 取值就落空 —— 2026-08-31 用户实报"报告点不开、选项点不开"的根因。
|
|
|
+# 它们在界面上的英文化由前端渲染层负责, 不在这一层做。
|
|
|
+NEVER_TRANSLATE = {
|
|
|
+ '报警', '列窗', '级', '工单', '链盘', '振动结论', '矩阵', '能力', '设备状态',
|
|
|
+ '总条数', '定论', '预警', '停机', '停机(调度令)', '限电·绑定', '主轴承后', '主轴承前',
|
|
|
+ '换件闭环 (检出→换件→恢复)', '状态', '天数', '依据', '表', '部件', '停机时长h',
|
|
|
+ '外部', '故障', '类别', '日期', '原因', '排查', '处置', '占停机',
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+def translate_all(s):
|
|
|
+ """对整页文本做最长匹配的全局一致替换; 不回退、不做上下文判断。"""
|
|
|
+ if not isinstance(s, str) or not s:
|
|
|
+ return s
|
|
|
+ r = _RE or _compile()
|
|
|
+
|
|
|
+ def _sub(m):
|
|
|
+ w = m.group(0)
|
|
|
+ if w in NEVER_TRANSLATE: # 同时充当数据键 → 原样保留
|
|
|
+ return w
|
|
|
+ v = TERMS[w]
|
|
|
+ nxt = s[m.end():m.end() + 1]
|
|
|
+ if v and v[-1].isascii() and v[-1].isalnum() and nxt and (
|
|
|
+ nxt.isalnum() or nxt == '(' or '\u4e00' <= nxt <= '\u9fff'):
|
|
|
+ return v + ' '
|
|
|
+ return v
|
|
|
+ out = r.sub(_sub, s)
|
|
|
+ out = _RE_CNT.sub(' events', _RE_ROWS.sub(' rows', out))
|
|
|
+ out = _RE_TIMES.sub(' times ', out)
|
|
|
+ out = _RE_UNITS.sub(' units ', out)
|
|
|
+ out = _RE_YEAR.sub('', out)
|
|
|
+ out = _RE_ITEMS.sub(' ', out)
|
|
|
+ out = _RE_STEP.sub('No.', out)
|
|
|
+ out = _RE_STEPN.sub(' steps ', out)
|
|
|
+ out = _RE_TOTAL.sub('total ', out)
|
|
|
+ out = _RE_IN_N.sub('in ', out)
|
|
|
+ return re.sub(r'(?<=\S)[ \t]{2,}', ' ', out)
|
|
|
+
|
|
|
+
|
|
|
+# ── 源码级英文化 (保护数据键) ──────────────────────────────────────
|
|
|
+# translate_all 无差别替换会炸: `${r.停机时长h}` → `${r.Downtime hours h}`,
|
|
|
+# 属性名带空格即 JS 语法错误 (2026-08-31 实测 237 处风险点)。
|
|
|
+#
|
|
|
+# 正确的切分不是"UI 文案 vs 数据键"这种语义判断 (自动判不准), 而是**语法位置**:
|
|
|
+# .中文 属性访问 —— 键, 不译 (数据里的键也是中文, 两边必须一致)
|
|
|
+# ['中文'] 下标访问 —— 同上
|
|
|
+# "中文": 对象字面量/JSON 的键 —— 同上
|
|
|
+# 其余位置的中文都是要显示的文本, 一律译。
|
|
|
+#
|
|
|
+# 比较值不在保护之列且必须不保护: TAB==='总览' 与 onclick="TAB='总览'" 同时被译成
|
|
|
+# 'Overview', 比较照样成立 —— 一致性来自"同一张表替换所有出现处"。
|
|
|
+_PROT = [
|
|
|
+ re.compile(r'\.[一-鿿][一-鿿A-Za-z0-9_]*'), # .属性
|
|
|
+ re.compile(r'\[\s*[\'"][^\'"]*[一-鿿][^\'"]*[\'"]\s*\]'), # ['键']
|
|
|
+ re.compile(r'[\'"][一-鿿][^\'"]{0,40}[\'"]\s*:'), # "键":
|
|
|
+ # Python 关键字参数名 dict(倍中位=...) —— 译了就是非法标识符 (实逮 × median=)。
|
|
|
+ # 限定在 ( 或 , 之后, 避免误伤字符串里的 "灰带=全场四分位区间" 这类显示文案。
|
|
|
+ re.compile(r'(?<=[(,])\s*[一-鿿][一-鿿A-Za-z0-9_]*(?=\s*=(?!=))'),
|
|
|
+ # 多行调用的续行: 关键字参数落在行首, 前面既不是 ( 也不是 , (逐行处理看不到上一行)
|
|
|
+ re.compile(r'^[一-鿿][一-鿿A-Za-z0-9_]*(?=\s*=(?!=))'),
|
|
|
+ # 中文函数名/变量名定义
|
|
|
+ re.compile(r'(?<=def )[一-鿿][一-鿿A-Za-z0-9_]*'),
|
|
|
+]
|
|
|
+
|
|
|
+
|
|
|
+def to_english_source(src):
|
|
|
+ """把一份含中文的页面源码转成英文, 保留数据键不动。"""
|
|
|
+ if not isinstance(src, str) or not src:
|
|
|
+ return src
|
|
|
+ keep = []
|
|
|
+
|
|
|
+ def hide(m):
|
|
|
+ keep.append(m.group(0))
|
|
|
+ return '\x00%d\x00' % (len(keep) - 1)
|
|
|
+
|
|
|
+ for rx in _PROT:
|
|
|
+ src = rx.sub(hide, src)
|
|
|
+ src = translate_all(src)
|
|
|
+ return re.sub(r'\x00(\d+)\x00', lambda m: keep[int(m.group(1))], src)
|
|
|
+
|
|
|
+# ── 25 显示文案整句原生英文 ────────────────────────────────────────
|
|
|
+# 用户: 别再用"改中文成英文"的方式, 要让英文在生成时就是原生文案。
|
|
|
+# 逐词映射拼出来的句子读着像翻译 (中文语序 + 术语堆叠); 这一批按**整句**写英文技术文档
|
|
|
+# 的表达, 整句条目在最长匹配下优先于任何词级条目, 所以它们直接决定成品读感。
|
|
|
+TERMS.update({
|
|
|
+ # 状态与提示
|
|
|
+ '载入中…': 'Loading…', '加载中…': 'Loading…', '进度': 'Progress',
|
|
|
+ '本地模型编排中…': 'Local model working…',
|
|
|
+ '未标时间窗': 'time window not stated', '时间窗内无报警': 'no alarms in this time window',
|
|
|
+ '← 卡在这里': '← stalled here', '(+约 30 秒)': '(+ approx. 30 s)',
|
|
|
+ '轻量 8B · 约 10 秒': 'Light 8B · approx. 10 s',
|
|
|
+ '标准 27B · 约 30 秒': 'Standard 27B · approx. 30 s',
|
|
|
+ '打印 / 存 PDF': 'Print / Save as PDF',
|
|
|
+ '部件与证据': 'Component and evidence',
|
|
|
+ '换前': 'before replacement', '换后': 'after replacement',
|
|
|
+ '补机制定性': 'mechanism characterisation pending',
|
|
|
+ '油液采样节奏': 'Oil sampling cadence', '限电侧': 'Curtailment side',
|
|
|
+ '在升·待处置对账': 'Rising and pending action — reconciliation',
|
|
|
+ # 链接
|
|
|
+ '该问题页 →': 'Open this issue →',
|
|
|
+ '该台完整问题页 →': 'Full issue page for this unit →',
|
|
|
+ '完整问题页 (全部曲线与工单史) →': 'Full issue page — all curves and work-order history →',
|
|
|
+ # 整句 (决定读感的部分)
|
|
|
+ '只显示有问题的系统; 无问题不出图':
|
|
|
+ 'Only systems with findings are shown; nothing is charted when nothing is flagged',
|
|
|
+ '按各台最严重系统状态着色 · 悬停看台号':
|
|
|
+ "Coloured by each unit's most severe system state · hover for the unit",
|
|
|
+ '点击加入报告, 再次点击移出 · 画布里已有':
|
|
|
+ 'Click to add to the report, click again to remove · already on the canvas',
|
|
|
+ '还没有生成 — 在上面的交互窗输入报告要求。':
|
|
|
+ 'Nothing generated yet — state what the report should cover in the panel above.',
|
|
|
+ '上报版 — 判据门槛与特征频率已脱敏':
|
|
|
+ 'Reporting version — criterion thresholds and characteristic frequencies redacted',
|
|
|
+ '上报版隐去判据门槛与特征频率':
|
|
|
+ 'the reporting version omits criterion thresholds and characteristic frequencies',
|
|
|
+ '系统失效模式按实证量排 + 部件级原因':
|
|
|
+ 'System failure modes ranked by observed volume, with component-level causes',
|
|
|
+ '— 瓶颈集中在一步, 不是"再多看点数据"能解的':
|
|
|
+ '— the bottleneck sits at a single step; more data will not clear it',
|
|
|
+ '"无记录停机"不是没有故障, 是没归上因。':
|
|
|
+ 'Unattributed downtime does not mean there was no fault — it means the cause was never assigned.',
|
|
|
+ '右下角报警码属重复触发, 不应按条数排定优先级。':
|
|
|
+ 'Codes in the lower right are repeat triggers, not faults; ranking them by count would misdirect the work.',
|
|
|
+ '限电不是"低风时段收到的空令"':
|
|
|
+ 'Curtailment is not an empty instruction issued during low wind',
|
|
|
+ '可用率与损失率分母不同': 'availability and loss rate rest on different denominators',
|
|
|
+ '这几台正是算法当初的检出台 ⇒ 故障前能看见、换件后能看见恢复。':
|
|
|
+ 'These are the units the method flagged at the time — visible before the failure, '
|
|
|
+ 'and visible recovering after replacement.',
|
|
|
+ '该部件在本窗无 SCADA 曲线 (振动谱级证据走 windcms)':
|
|
|
+ 'No SCADA curve for this component in this window; spectral evidence is handled in the CMS module',
|
|
|
+ '— 台账止 2024-11, 本期检修执行与闭环无法自动判定':
|
|
|
+ '— the ledger ends 2024-11, so execution and closure in the current period cannot be determined automatically',
|
|
|
+ '台账 2020~2024-11, 本报告不对本期检修执行下结论':
|
|
|
+ 'Ledger covers 2020 to 2024-11; this report draws no conclusion about maintenance execution in the current period',
|
|
|
+ '— 四源里油液长期 stale, 只能作回测锚':
|
|
|
+ '— of the four sources, oil is chronically stale and serves only as a retrospective anchor',
|
|
|
+ '— 损失六成在交易与调度侧, 设备侧改善空间有限':
|
|
|
+ '— six tenths of the loss sits with trading and dispatch; the equipment side has limited headroom',
|
|
|
+ '(证据: 已定案)': '(evidence: established)',
|
|
|
+ '(证据: 待现场核实 / 已记为基线下窗观察)':
|
|
|
+ '(evidence: field confirmation required / recorded as baseline, watch next window)',
|
|
|
+ '(传动链: 主承前·主承后·齿轮箱·发电机两端)':
|
|
|
+ '(drivetrain: main bearing front and rear, gearbox, both generator ends)',
|
|
|
+ '(主承前·主承后·齿轮箱三级·发电机DE/NDE; 悬停看逐件等级)':
|
|
|
+ '(main bearing front and rear, three gearbox stages, generator DE and NDE; hover for per-component grade)',
|
|
|
+ '回收 25~26 工单': 'recover the 2025–26 work orders',
|
|
|
+ # ★含场名的标题必须脱敏
|
|
|
+ '如东海上风电场 · 运行分析报告': 'Offshore wind farm · operations analysis report',
|
|
|
+})
|
|
|
+_RE = None
|
|
|
+
|
|
|
+# ── 26 工单与检修记录文本 ──────────────────────────────────────────
|
|
|
+# 残留的大头不是界面文案而是**数据内容** —— 工单描述、巡检项、消缺记录。
|
|
|
+# 数据库里存的就是中文, 英文版没有第二份数据源, 所以只能靠词表覆盖。
|
|
|
+# 按可消字数排序批量补 (top 60 覆盖了大半)。
|
|
|
+TERMS.update({
|
|
|
+ '为该台该': "for this unit's", '轴无非常态': 'no abnormality on this axis',
|
|
|
+ '日常': 'routine', '缺失': 'missing', '损坏': 'damage', '定检': 'scheduled inspection',
|
|
|
+ '监测': 'monitoring', '消除': 'cleared', '消缺': 'defect clearance', '新增': 'added',
|
|
|
+ '卫生': 'cleaning', '机舱卫生': 'nacelle cleaning', '机舱底部卫生': 'nacelle floor cleaning',
|
|
|
+ '机舱': 'nacelle', '风扇': 'fan', '逆变器': 'inverter', '通讯': 'communication',
|
|
|
+ '震动': 'vibration', '告警': 'alarm',
|
|
|
+ # 检修项目
|
|
|
+ '防雷导通测试': 'lightning continuity test', '导通测试': 'continuity test',
|
|
|
+ '完成三个叶片防雷导通测试': 'lightning continuity test completed on all three blades',
|
|
|
+ '光纤整改及升降机维护': 'fibre rectification and lift maintenance',
|
|
|
+ '光纤改造': 'fibre upgrade', '升降机维护': 'lift maintenance',
|
|
|
+ '垫片加装': 'shim installation', '水扩容': 'coolant top-up',
|
|
|
+ '接地漏电': 'earth leakage', '平台盖板': 'platform cover',
|
|
|
+ '主断路器': 'main breaker', '集油瓶': 'oil collection bottle',
|
|
|
+ '不间断电源旁路': 'UPS bypass', '号五防钥匙': 'interlock key',
|
|
|
+ '松散物体': 'loose objects', '到松散物体': 'loose objects found',
|
|
|
+ '到有松散物体': 'loose objects present',
|
|
|
+ # 位置描述
|
|
|
+ '机侧第一个': 'machine side, first', '机侧第三个': 'machine side, third',
|
|
|
+ '机侧第五个': 'machine side, fifth', '网侧第一个': 'grid side, first',
|
|
|
+ # 数据来源与口径
|
|
|
+ '数值按需逐份解析': 'values parsed per report as required',
|
|
|
+ '非第三方独立源': 'not an independent third-party source',
|
|
|
+})
|
|
|
+_RE = None
|
|
|
+
|
|
|
+# ── 27 报告块库标签 ────────────────────────────────────────────────
|
|
|
+# 用户截图逮到块库满屏中英混杂 (monthly generation 表 / 部件停机表 / 故障Pareto / basis 与boundary)。
|
|
|
+# 这些是前端硬编码标签, 但其中的 故障/表/与 等词同时是数据键, 落在 NEVER_TRANSLATE 里,
|
|
|
+# 于是词级替换绕不过去。解法: 收**整句**条目 —— 最长匹配优先, 整句先命中就不会再拆到单词层。
|
|
|
+TERMS.update({
|
|
|
+ '逐月发电表': 'Monthly generation table',
|
|
|
+ '逐月上网 / 损失 / 损失率 / 等效满发, 含数据覆盖率':
|
|
|
+ 'Monthly export, loss, loss rate and equivalent full-load hours, with data coverage',
|
|
|
+ '交易调度侧 / 设备侧 / 运行侧 三段占比 — 回答':
|
|
|
+ 'Trading and dispatch, equipment, operations — the three-way split, answering',
|
|
|
+ 'MTBF × MDT 部件象限, 分出': 'MTBF against MDT by component, separating',
|
|
|
+ '部件停机表': 'Component downtime table',
|
|
|
+ '逐部件停机时长 / 事件数 / 平均无故障间隔(MTBF)/ 单次停机时长(MDT)/ 影响机组数':
|
|
|
+ 'Downtime, event count, MTBF, MDT and units affected, per component',
|
|
|
+ '已归因 vs 无记录停机的占比 — 无记录不等于没有故障':
|
|
|
+ 'Attributed versus unattributed downtime — unattributed does not mean fault-free',
|
|
|
+ '故障帕累托': 'Fault Pareto',
|
|
|
+ '按条数降序 + 累计 80% 线, 找关键少数':
|
|
|
+ 'Ranked by count with a cumulative 80% line, to find the vital few',
|
|
|
+ '条数 × 单次时长, 区分重复触发与实际停机 — 按条数排序会误定优先级':
|
|
|
+ 'Count against duration per event, separating repeat triggers from real downtime — '
|
|
|
+ 'ranking by count alone misdirects priority',
|
|
|
+ '按天归一的日均条数, 数据不满月单独标注':
|
|
|
+ 'Events per day, normalised; partial months flagged separately',
|
|
|
+ '需跟踪台的部件 / 证据源 / 六步进度 / 卡在哪一步':
|
|
|
+ 'Units under tracking: component, evidence source, six-step progress, and where it stalled',
|
|
|
+ '证据→机制→判级→排期→动作→验收 六步的瓶颈分布':
|
|
|
+ 'Where the six steps stall: evidence, mechanism, grading, scheduling, action, acceptance',
|
|
|
+ '检出 → 换件 → 复测回落的历史例证, 证明这条链是通的':
|
|
|
+ 'Detection, replacement, retest — historical cases showing the chain closes',
|
|
|
+ '由数据推出的行动项, 不是套话':
|
|
|
+ 'Action items derived from the data, not boilerplate',
|
|
|
+ '口径与边界': 'Basis and boundaries',
|
|
|
+ '本地模型基于实测数据生成的运行总结 — 为图表补充文字结论, 供汇报使用':
|
|
|
+ 'An operating summary written by the local model from measured data — a written '
|
|
|
+ 'conclusion to accompany the charts',
|
|
|
+ '先输入报告要求': 'State what the report should cover',
|
|
|
+ '挑组件 + 写总结, 全程零外发':
|
|
|
+ 'selecting blocks and writing the summary — nothing leaves the site',
|
|
|
+ '月度运营分析': 'Monthly operations review', '周报': 'Weekly', '设备专题': 'Equipment topic',
|
|
|
+ '年度总结': 'Annual review', '块库': 'Block library',
|
|
|
+ '点击加入报告, 再次点击移出 · 画布里已有': 'Click to add, click again to remove · on the canvas:',
|
|
|
+})
|
|
|
+_RE = None
|