From 675253bd2f9d4df0ba0e8629e0c6137cfc69d69f Mon Sep 17 00:00:00 2001 From: Codex Date: Wed, 20 May 2026 18:15:07 +0800 Subject: [PATCH] Polish existing Chinese UI translations --- SESSION.md | 1 + TASKS.md | 3 +- .../i18n-existing-ui-polish-zh-1366x768.png | Bin 0 -> 60487 bytes src/web/i18n.js | 122 +++++++++++++++++- tests/unit/test_api_static_server.py | 4 + 5 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 output/playwright/i18n-existing-ui-polish-zh-1366x768.png diff --git a/SESSION.md b/SESSION.md index e3e6a24..953f0d4 100644 --- a/SESSION.md +++ b/SESSION.md @@ -805,6 +805,7 @@ Automation execution-layer PXX remains closed and its known scope stays frozen. - Trader Mode unified shell closure passed on 2026-05-20: `/trader-mode` now resolves to the same left-menu/right-workspace `index.html` shell instead of the standalone page, with the Trader Mode section active from the route and the sidebar `Trader Mode` tree item selected. The embedded Trader Mode surface keeps the fast-read status, live readout, fast queue, freshness, focus, action buttons, after-close draft, R2 evidence, and read-only boundary controls, while the generic workbench filter bar is hidden only for this section. `trader_mode.js` is scoped so it can run inside the workbench without leaking globals into `app.js`; keyboard shortcuts and auto-refresh are active only while the Trader Mode section is visible. Remote validation passed deploy smoke over 11 endpoints, gstack browser checks on `http://192.168.3.90:8000/trader-mode` (`bodySection=trader-mode`, active nav=`Trader Mode`, sidebar present, generic controls hidden, loaded status=`Observe Only`), `run_readonly_live_analysis_smoke.py`, and `run_remote_ops_smoke.py`. Evidence screenshot saved at `output/playwright/trader-mode-unified-shell-1366x768-loaded.png`. No change was made to `execution_allowed`, `decision_support_ready`, `real_live_ready`, risk governor, trust bucket, or operator confirmation protocol. - Frontend Chinese/English i18n closure passed on 2026-05-20: added shared `/static/i18n.js`, default locale `zh-CN`, persistent `ai_ict_locale_v1`, topbar language switchers on the workbench, standalone Trader Mode fallback page, and training page. `app.js`, `trader_mode.js`, and `training.js` now route dynamic `setText` output through the same translation layer, so both static shell labels and live Trader Mode status/readout labels can switch between Chinese and English without changing backend payloads. Mutation handling was hardened to avoid self-triggered translation loops during language changes. Remote validation confirmed default Chinese with no stored locale (`lang=zh-CN`, heading `AI ICT 交易工作台`, status `仅观察`, readout `为什么不交易`) and English switching (`lang=en`, heading `AI ICT Trading Workbench`, status `Observe Only`), with no browser console errors. Evidence screenshots saved at `output/playwright/i18n-trader-mode-zh-default-1366x768.png` and `output/playwright/i18n-trader-mode-en-1366x768.png`. Local validation passed i18n/app/trader/training JS syntax checks, focused static/read-only/operator tests, script static checks, full unit discovery (`789` tests), deploy smoke over 11 endpoints, `run_remote_ops_smoke.py`, and `run_readonly_live_analysis_smoke.py`. No change was made to `execution_allowed`, `decision_support_ready`, `real_live_ready`, risk governor, trust bucket, or operator confirmation protocol. - Frontend i18n regression follow-up passed on 2026-05-20: fixed whitespace-preserving text-node translation so Chinese mode now translates top controls such as `Instrument ID`, `Timeframe`, `Limit`, `Auto Refresh`, `Execution Status`, `Session Focus`, `Trust Class`, and `Search` on `/trader-mode#overview`. The workbench active-section marker moved from `body[data-workbench-section]` to `body[data-active-workbench-section]` to avoid selector collisions with real content sections during browser automation and Trader Mode visibility checks. Added missing Chinese button labels for dynamic workbench actions including `Generate Active Plan`, `Run Watch`, `Risk Check`, `Cleanup Old Captures`, `Reconcile Real Trades`, `Cancel`, `Close`, `Sync`, note/review-packet buttons, and visual feedback buttons. Local validation passed `node --check src/web/app.js`, `node --check src/web/i18n.js`, 27 focused static/read-only/operator tests, secret static checks, script static checks, full unit discovery (`789` tests), and `git diff --check` with only LF/CRLF warnings. Live deploy completed with 11 deploy smoke endpoints; `run_remote_ops_smoke.py` and `run_readonly_live_analysis_smoke.py` passed, with `ready_for_readonly_live_analysis=true`, `must_not_trade=true`, and `submit_cancel_or_live_execution_called=false`. gstack browser automation cold-started `http://192.168.3.90:8000/trader-mode?verify=20260520b#overview`, confirmed `lang=zh-CN`, no old body selector collision, Chinese top controls, 17 left-menu pages navigable, no console errors, and clicked only safe `刷新` while skipping write/record/reconcile buttons to avoid polluting live state. Evidence screenshot saved at `output/playwright/i18n-overview-controls-zh-final-1366x768.png`. No change was made to `execution_allowed`, `decision_support_ready`, `real_live_ready`, risk governor, trust bucket, or operator confirmation protocol. +- Existing-UI i18n polish passed on 2026-05-20 without adding product features: hardened phrase replacement so short words like `no` no longer corrupt larger English words such as `not` / `enough`, then optimized Chinese labels for existing Trader Mode / duty / chart bridge / R2 evidence / runtime workbench surfaces. Remote browser audit on `/trader-mode?audit=20260520e#trader-mode` confirmed no `否t` / `e否ugh` corruption, no old English labels such as `Bridge Status`, `Exact Candle Source`, `Use Today`, `Paper Tickets`, or `Decision Support Ready`, and reduced visible English-remnant audit count from `3396` before the fix to `881` after the fix; the remaining items are mostly symbols/session names/ICT tokens/internal status keys. Validation passed `node --check src/web/i18n.js`, 27 focused static/read-only/operator tests, secret static checks, script static checks, full unit discovery (`789` tests), `git diff --check` with only LF/CRLF warnings, deploy smoke over 11 endpoints, `run_remote_ops_smoke.py`, `run_readonly_live_analysis_smoke.py`, and gstack browser console check with no errors. Evidence screenshot saved at `output/playwright/i18n-existing-ui-polish-zh-1366x768.png`. No change was made to `execution_allowed`, `decision_support_ready`, `real_live_ready`, risk governor, trust bucket, or operator confirmation protocol. - Current assisted-analysis next gate: keep R1/R2 focused on `decision_support_ready` trust/sample/quality evidence and shadow/paper/operator feedback collection. OKX trade-permission sandbox smoke is deferred until the project explicitly re-enters execution adapter or real-trading preparation. ## Exact Next Step diff --git a/TASKS.md b/TASKS.md index bc7a94f..28fee67 100644 --- a/TASKS.md +++ b/TASKS.md @@ -164,7 +164,7 @@ - [x] Live usefulness blocker recovery: root workbench split-navigation is usable, slow frontend requests time out instead of freezing the page, remote DB/compose/deploy/migration/proxy/runtime blockers were recovered, standard remote ops smoke including `unattended_harness` passed, and readonly live analysis smoke passed without enabling order submission - [x] Trader Mode unified workbench shell closure: `/trader-mode` now opens inside the same left-tree/right-workspace framework with the Trader Mode tree item active, hides the generic workbench filters only for this section, scopes Trader Mode JS to avoid app globals/hidden-section shortcuts, deploy smoke passed, remote gstack browser verification passed, readonly live analysis smoke passed, and remote ops smoke passed - [x] Frontend Chinese/English i18n closure: added shared `/static/i18n.js`, default Chinese locale, persistent language selector, dynamic `setText` translation in workbench / Trader Mode / training pages, remote browser evidence for Chinese default and English switch, full unit validation, deploy smoke, remote ops smoke, and readonly live analysis smoke -- [ ] Next trader-usefulness refinement: compress Trader Mode / watchlist language around why no trade, what to watch next, unique focus quality, stale data, and no-candidate states so the first screen answers live operator questions faster +- [x] Next trader-usefulness refinement: compress Trader Mode / watchlist language around why no trade, what to watch next, unique focus quality, stale data, and no-candidate states so the first screen answers live operator questions faster - [ ] R2 next collection action after readonly launch: wait for or surface a real executable candidate, then build shadow paper ticket / confirm paper execution / record operator feedback / add weekly review evidence without changing execution/live gates - [x] R3 OKX sandbox preflight starter implemented and deployed: signed dry-run request previews, idempotency key preview, error normalization catalog, `/trading/okx-sandbox-preflight`, live-readiness summary, cockpit surface, deploy smoke, remote ops smoke, and remote field/UI smoke - [x] R3 OKX sandbox isolated smoke tooling implemented and deployed: explicit `OKX_SANDBOX_SMOKE_EXECUTE` gate, submit/query/cancel/query/fills script, JSON artifact, proxy reuse, permission-error normalization, focused tests, full unit, deploy smoke, and remote ops smoke @@ -922,6 +922,7 @@ - [x] Trader Mode usefulness compression: first screen and watchlist now answer why not to trade, what to watch next, why the unique focus matters, whether data is stale, and what to wait for when there is no candidate; remote deploy, ops smoke, read-only live analysis smoke, and 390/1366 gstack screenshots passed - [x] First real Trader Mode R2 usage loop: recorded UI `No Trade` for blocked Candidate #4610, increased operator feedback from 1 to 2, saved after-close draft note, and verified paper ticket/execution/weekly journal counts were not fabricated - [x] Frontend i18n regression follow-up: Chinese mode now translates whitespace-padded top controls on `/trader-mode#overview`, dynamic workbench buttons such as `Run Watch` / `Risk Check` / `Reconcile Real Trades`, and active-section automation no longer collides with body attributes; deploy smoke, remote ops smoke, read-only live smoke, and 17-page gstack browser click audit passed +- [x] Existing UI i18n polish: phrase replacement no longer corrupts `not` / `enough`, existing Trader Mode/duty/chart/R2/runtime labels are more readable in Chinese, browser audit dropped visible English remnants from 3396 to 881, and deploy smoke / remote ops / readonly live smoke / gstack console check passed - [ ] R2 paper-ticket sample gate is waiting on a real executable candidate; do not fabricate paper tickets from blocked candidates - [ ] R2 operator feedback sample gate still needs at least 3 more real feedback samples (`operator_feedback_count=2/5`) - [ ] R2 weekly review visible gate still needs a real execution-derived journal/weekly review entry (`weekly_review_entry_count=0`) diff --git a/output/playwright/i18n-existing-ui-polish-zh-1366x768.png b/output/playwright/i18n-existing-ui-polish-zh-1366x768.png new file mode 100644 index 0000000000000000000000000000000000000000..baa9d25efc1db5a76e82c1f2a2c23e18fe0dfb65 GIT binary patch literal 60487 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

PwZ*;gc?F9_qr=PZ-v&j{$g7C}G=Gelb;37# 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 literal 0 HcmV?d00001 diff --git a/src/web/i18n.js b/src/web/i18n.js index 39c554b..f9dbaee 100644 --- a/src/web/i18n.js +++ b/src/web/i18n.js @@ -73,6 +73,10 @@ 'Loading workspace...': '正在加载工作台...', 'Loading Trader Mode...': '正在加载交易员模式...', 'Read-only live brief for fast intraday review.': '只读盘中速读简报,用于快速复核。', + 'Data and runtime are fresh enough for read-only analysis.': '数据和运行状态足够新鲜,可用于只读分析。', + 'Do not use Trader Mode as the primary intraday screen until the listed blockers clear.': '阻塞项清除前,不要把交易员模式作为盘中主屏。', + 'Decision assistant summary unavailable.': '决策助手摘要不可用。', + 'current_focus_matches_profile': '当前焦点匹配模板', 'Status': '状态', 'Decision Now': '当前判断', 'Next Action': '下一步', @@ -95,8 +99,22 @@ 'Runtime Online': '运行状态在线', 'Stale Seconds': '过期秒数', 'Chart Bridge': '图表桥接', + 'Bridge Status': '桥接状态', + 'Exact Candle Source': '精确K线来源', + 'External Bridge': '外部桥接', + 'Chart Providers': '图表来源', 'Duty Panel': '值班面板', + 'Use Today': '今日可用', + 'Runtime Smoke': '运行冒烟', + 'Maintenance': '维护状态', + 'Recent Errors': '最近错误', 'Focus': '焦点', + 'Focus Candidate': '焦点候选', + 'Session / Model': '时段 / 模型', + 'State': '状态', + 'Why This Focus': '为什么看它', + 'Trade Action': '交易动作', + 'Continue Review': '继续复核', 'Three Reasons': '三条原因', 'Recovery': '恢复动作', 'Record Action': '记录盘中动作', @@ -108,8 +126,18 @@ 'No action recorded in this browser session.': '当前浏览器会话尚未记录动作。', 'Optional quick note for this live brief.': '可选:为当前速读简报记录快速备注。', 'After-Close Draft': '盘后草稿', + 'Draft Status': '草稿状态', + 'Intraday Actions': '盘中动作', + 'Agreement Mix': '反馈分布', + 'Weekly Carry Forward': '周复盘延续项', 'Save Draft Note': '保存草稿备注', 'R2 Evidence Window': 'R2 证据窗口', + 'Paper Tickets': '纸面票据', + 'Paper Executions': '纸面执行', + 'Operator Feedback': '操作员反馈', + 'Weekly Review Entries': '周复盘条目', + 'Decision Support Ready': '辅助决策就绪', + 'Missing Evidence': '缺失证据', 'Boundary': '边界', 'Review Now': '立即复核', 'Observe Only': '仅观察', @@ -123,6 +151,47 @@ 'No order submission': '不提交订单', 'Not a buy/sell instruction': '不是买卖指令', 'Execution disabled': '执行已禁用', + 'Executable Candidates': '可执行候选', + 'Confirmed Tickets': '已确认票据', + 'Open Positions': '持仓加载', + 'Framework Rate': '框架执行率', + 'Out-of-Model Rate': '模型外比例', + 'Risk Violations': '风险违规', + 'symbol': '品种', + 'session': '时段', + 'data freshness': '数据新鲜度', + 'news state': '新闻状态', + 'broker state': '经纪商状态', + 'broker equity': '账户权益', + 'broker available balance': '可用余额', + 'broker open positions': '经纪商持仓', + 'broker pending orders': '经纪商挂单', + 'broker alerts': '经纪商提醒', + 'account risk state': '账户风险状态', + 'open position': '持仓', + 'kill switch': '熔断开关', + 'scheduler state': '调度状态', + 'supervisor state': '监督状态', + 'stalled tasks': '卡住任务', + 'watchdog checked': '看门狗检查时间', + 'incident journal': '事件日志', + 'incident severity': '事件级别', + 'last incident': '最近事件', + 'recommended actions': '建议动作', + 'automatic actions': '自动动作', + 'operator actions': '操作员动作', + 'p23 assertions': 'P23 断言', + 'last success': '最近成功', + 'next run': '下次运行', + 'run count': '运行次数', + 'success / failure': '成功 / 失败', + 'last error': '最近错误', + 'ready to ticket': '可建票', + 'human confirmed': '人工已确认', + 'live management load': '实盘管理负载', + 'weekly execution discipline': '周度执行纪律', + 'model drift': '模型漂移', + 'weekly count': '周度计数', 'Training': '训练', 'AI ICT Training Console': 'AI ICT 训练控制台', 'Public training cases, attempts, annotations, and progress.': '公开训练案例、尝试、标注与进度。', @@ -186,6 +255,43 @@ ['runtime ok', '运行正常'], [' ok', ' 正常'], ['market ok', '行情正常'], + ['Read-only review only', '只读复核,不执行'], + ['internal candles + external refs', '内部K线 + 外部参考'], + ['internal candles', '内部K线'], + ['internal bridge', '内部桥接'], + ['not connected', '未连接'], + ['connect real-time chart bridge when available', '可用时连接实时图表桥'], + ['compare external chart state', '对比外部图表状态'], + ['unattended harness', '无人值守巡检'], + ['read-only duty status', '只读值班状态'], + ['not checked', '未检查'], + ['draft ready', '草稿就绪'], + ['weekly entries', '周复盘条目'], + ['Trader Mode observation(s)', '交易员模式观察'], + ['operator feedback sample(s)', '操作员反馈样本'], + ['collect more executed samples', '继续收集真实执行样本'], + ['review weekly trade selection', '复核周度交易选择'], + ['review risk process', '复核风险流程'], + ['paper ticket count', '纸面票据数量'], + ['paper execution count', '纸面执行数量'], + ['weekly review entry count', '周复盘条目数量'], + ['gaps', '项缺口'], + ['Off', '关闭'], + ['freeze', '冻结'], + ['blockers', '阻塞项'], + ['degraded', '降级'], + ['enabled', '已启用'], + ['symbols', '品种'], + ['idle', '空闲'], + ['persisted', '已持久化'], + ['sources', '来源'], + ['latest', '最新'], + ['warnings', '警告'], + ['stalled', '已卡住'], + ['details', '详情'], + ['sweep into MSS into FVG retrace', '扫流动性后形成 MSS 与 FVG 回撤'], + ['wait fvg retrace confirmed', '等待 FVG 回撤确认'], + ['fvg retrace confirmed', 'FVG 回撤确认'], ['drill down only if needed', '仅在需要时下钻'], ['read-only', '只读'], ['review packet', '复核包'], @@ -249,10 +355,24 @@ let currentLocale = storedLocale(); + function escapeRegExp(value) { + return String(value).replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + } + + function replacePhrase(source, from, to) { + const phrase = String(from || ''); + if (!phrase) return source; + const escaped = escapeRegExp(phrase); + const shouldBound = /^[A-Za-z0-9]/.test(phrase) || /[A-Za-z0-9]$/.test(phrase); + if (!shouldBound) return source.replace(new RegExp(escaped, 'g'), to); + const pattern = new RegExp(`(^|[^A-Za-z0-9_])(${escaped})(?=$|[^A-Za-z0-9_])`, 'g'); + return source.replace(pattern, (_match, prefix) => `${prefix}${to}`); + } + function applyPhraseTranslations(source) { let translated = source; for (const [from, to] of zhPhrases) { - translated = translated.replaceAll(from, to); + translated = replacePhrase(translated, from, to); } return translated; } diff --git a/tests/unit/test_api_static_server.py b/tests/unit/test_api_static_server.py index e0d9927..bbfee58 100644 --- a/tests/unit/test_api_static_server.py +++ b/tests/unit/test_api_static_server.py @@ -196,6 +196,10 @@ class ApiStaticServerTests(unittest.TestCase): "Cleanup Old Captures", "'Cancel':", "'Sync':", + "Bridge Status", + "Paper Tickets", + "replacePhrase", + "[^A-Za-z0-9_]", "ai_ict_locale_v1", "ai-ict-locale-change", "const core = source.slice(leading.length",