diff --git a/SESSION.md b/SESSION.md index ae74fe8..32bc5d3 100644 --- a/SESSION.md +++ b/SESSION.md @@ -120,6 +120,10 @@ Automation execution-layer PXX remains closed and its known scope stays frozen. - latest_decision_assistant_digest_preference_slice: digest_preference_profile_local_mode - latest_trader_mode_shell_slice: unified_workbench_left_tree_route - latest_frontend_i18n_slice: zh_cn_default_en_switcher +- latest_frontend_i18n_dynamic_slice: existing_dynamic_card_field_value_polish +- latest_frontend_i18n_dynamic_status: implemented_deployed_remote_smoke_passed +- latest_frontend_i18n_dynamic_closure: expanded existing zh-CN dynamic term coverage for session focus, candidate cards, readiness/runtime codes, and nested evidence JSON; remote browser audit on `/trader-mode#intraday-candidates` had no tracked English remnants, no visible snake_case remnants in the active candidate section, and no console errors +- latest_frontend_i18n_dynamic_validation: node --check src/web/i18n.js, tests.unit.test_api_static_server, secret static checks, script static checks, full unit 790 tests, deploy smoke 11 endpoints, remote ops smoke, and readonly live analysis smoke passed; readonly boundary still reports must_not_trade=true and submit_cancel_or_live_execution_called=false - latest_decision_assistant_workflow_queue_slice: assistant_loop_queue - latest_decision_assistant_workspace_loop_slice: workflow_section_navigation_loop_queue - latest_decision_assistant_learning_focus_slice: learning_focus_queue diff --git a/TASKS.md b/TASKS.md index b3d891d..a163d75 100644 --- a/TASKS.md +++ b/TASKS.md @@ -164,6 +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 +- [x] Existing frontend dynamic i18n polish closure: expanded zh-CN coverage for dynamic session labels, readiness/runtime codes, candidate card labels, management/evidence JSON keys and common ICT enum values; remote browser audit on `/trader-mode#intraday-candidates` found no tracked English remnants, no visible snake_case remnants in the active candidate section, and no console errors; full unit, deploy smoke, remote ops smoke, and readonly live analysis smoke passed without changing execution/readiness gates - [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 diff --git a/src/web/i18n.js b/src/web/i18n.js index 014bdbd..8f60c1b 100644 --- a/src/web/i18n.js +++ b/src/web/i18n.js @@ -247,6 +247,186 @@ 'db ready': '数据库就绪', }; + const zhDynamicTerms = { + 'source': '来源', + 'label': '标签', + 'price': '价格', + 'id': 'ID', + 'model': '模型', + 'side': '方向', + 'type': '类型', + 'field': '字段', + 'table': '数据表', + 'code': '代码', + 'action': '动作', + 'trigger': '触发', + 'fraction': '比例', + 'to': '移至', + 'level': '价位', + 'direction': '方向', + 'buy': '多头', + 'sell': '空头', + 'bullish': '多头', + 'bearish': '空头', + 'state': '状态', + 'reason': '原因', + 'channel': '通道', + 'payload': '载荷', + 'message': '消息', + 'summary': '摘要', + 'detail': '详情', + 'target': '目标', + 'priority': '优先级', + 'lane': '队列线', + 'queue': '队列', + 'focus': '焦点', + 'operator': '操作员', + 'workflow': '工作流', + 'task': '任务', + 'note': '备注', + 'evidence': '证据', + 'feedback': '反馈', + 'capture': '捕获', + 'delivery': '投递', + 'retry': '重试', + 'counts': '计数', + 'history': '历史', + 'context': '上下文', + 'handoff': '交接', + 'next': '下一步', + 'Session': '交易时段', + 'Review': '复核', + 'Capture': '捕获', + 'Execution': '执行', + 'position': '仓位', + 'running': '运行中', + 'disabled': '已禁用', + 'true': '是', + 'false': '否', + 'null': '空', + 'objective_layer': '目标层', + 'selection_reason': '入选原因', + 'liquidity_pools': '流动性池', + 'price_high': '最高价', + 'price_low': '最低价', + 'external_liquidity_pool': '外部流动性池', + 'external_liquidity_after_internal_partial': '内部部分扫流后的外部流动性', + 'session_external_pivot': '时段外部枢轴', + 'invalidated_before_entry': '入场前已失效', + 'awaiting_confirmation': '等待确认', + 'backtest_lifecycle_state': '回测生命周期状态', + 'error_tags': '错误标签', + 'risk_checks': '风险检查', + 'settlement_source': '结算来源', + 'session_code': '交易时段代码', + 'signal_side': '信号方向', + 'market_truth_ready': '行情真实源就绪', + 'runtime_ready': '运行就绪', + 'broker_read_ready': '经纪商只读就绪', + 'blacklist': '黑名单', + 'whitelist': '白名单', + 'boundary': '边界', + 'links': '链接', + 'quality': '质量', + 'confirmation chain': '确认链', + 'missing requirements': '缺失条件', + 'entry zone': '入场区间', + 'stop': '止损', + 'expiry': '过期时间', + 'trust mode': '信任模式', + 'management rules': '管理规则', + 'evidence links': '证据链接', + 'target_plan': '目标计划', + 'sweep_id': '扫流 ID', + 'dealing_ranges': '交易区间表', + 'market_sessions': '交易时段表', + 'internal_liquidity_before_external_expansion': '外部扩展前内部流动性', + 'internal_liquidity_pool': '内部流动性池', + 'dealing_range_boundary': '交易区间边界', + 'external_range_liquidity_boundary': '外部区间流动性边界', + 'adr_external_projection': 'ADR 外部投射', + 'adr_projection': 'ADR 投射', + 'average_range': '平均波幅', + 'buy_side': '买方流动性', + 'sell_side': '卖方流动性', + 'close_std_2': '收盘两倍标准差', + 'entry_price': '入场价', + 'fvg_related_displacement_id': 'FVG 关联位移 ID', + 'liquidity_pool': '流动性池', + 'management_rules': '管理规则', + 'missing_targets': '缺失目标', + 'mss_displacement_event_id': 'MSS 位移事件 ID', + 'pool_id': '流动性池 ID', + 'pool_type': '流动性池类型', + 'primary_draw': '主要牵引', + 'session_high': '时段高点', + 'session_low': '时段低点', + 'setup_tf': '形态周期', + 'source_counts': '来源计数', + 'std_projection': '标准差投射', + 'sweep_pool_id': '扫流池 ID', + 'timeframe_set': '周期集合', + 'trading_plan_id': '交易计划 ID', + 'trigger_tf': '触发周期', + 'two_standard_deviation_external_projection': '两倍标准差外部投射', + 'osok_or_daily_range_context': 'OSOK/日线区间上下文', + 'sweep_confirmed': '扫流确认', + 'mss_confirmed': 'MSS 确认', + 'nearest_internal_range_liquidity': '最近内部区间流动性', + 'dealing_range_equilibrium': '交易区间均衡位', + 'IRL': '内部流动性', + 'ASIA': '亚洲盘', + 'LONDON': '伦敦盘', + 'NY_AM': '纽约上午盘', + 'NY_LUNCH': '纽约午间盘', + 'NY_PM': '纽约下午盘', + 'OFF_HOURS': '非主要时段', + 'credential_missing': '凭据缺失', + 'wait_for_confirmations': '等待确认', + 'action_recommendation': '动作建议', + 'why_allowed': '允许原因', + 'why_blocked': '阻塞原因', + 'candidate_id': '候选 ID', + 'signal_id': '信号 ID', + 'instrument_id': '品种 ID', + 'range_id': '区间 ID', + 'fvg_id': 'FVG ID', + 'mss_id': 'MSS ID', + 'allowed_sessions': '允许时段', + 'invalidation_sources': '失效来源', + 'tp1_partial': 'TP1 部分止盈', + 'partial_close': '部分平仓', + 'tp1_hit': '触及 TP1', + 'move_stop': '移动止损', + 'breakeven': '保本', + 'invalidate_on_reclaim': '收回失效', + 'exit': '退出', + 'invalidation_reclaim': '失效位收回', + 'mss_broken_level_reclaimed': 'MSS 破位被收回', + 'structure_event': '结构事件', + 'range_low_lost': '跌破区间低点', + 'dealing_range': '交易区间', + 'fvg_invalidated_or_fully_mitigated': 'FVG 已失效或完全回补', + 'fvg_zone': 'FVG 区域', + 'invalidated': '已失效', + 'expire_by_session': '按时段过期', + 'cancel_unfilled_or_flatten': '取消未成交或平仓', + 'session_end': '时段结束', + 'webhook': 'Webhook', + 'workbench': '工作台', + 'snoozed_handoff': '已稍后提醒的交接', + 'stale_handoff': '过期交接', + 'aging_handoff': '临近过期交接', + 'fresh_handoff': '新鲜交接', + 'operator_resume_queue': '操作员恢复队列', + 'resolved_lane_state_counts': '已解决队列线状态计数', + 'handoff_lifecycle_summary': '交接生命周期摘要', + 'resume_backlog_groups': '恢复积压分组', + 'cleanup_execution_log': '清理执行日志', + }; + + Object.assign(zhExact, zhDynamicTerms); + const zhPhrases = [ ['No clean execution signal is available yet.', '还没有干净的执行信号。'], ['Trust gate keeps this in observe-only review.', '信任门禁仍要求仅观察复核。'], @@ -509,6 +689,7 @@ ['Loading case list.', '正在加载案例列表。'], ['Loading progress.', '正在加载进度。'], ['Select a case to review its public context.', '选择一个案例查看公开上下文。'], + ...Object.entries(zhDynamicTerms), ]; const zhPatterns = [ diff --git a/tests/unit/test_api_static_server.py b/tests/unit/test_api_static_server.py index 3e6bd97..d620d1b 100644 --- a/tests/unit/test_api_static_server.py +++ b/tests/unit/test_api_static_server.py @@ -205,6 +205,23 @@ class ApiStaticServerTests(unittest.TestCase): "open executions", "avoid_new_risk", "review_alerts", + "zhDynamicTerms", + "Object.assign(zhExact, zhDynamicTerms)", + "objective_layer", + "selection_reason", + "market_truth_ready", + "why_blocked", + "credential_missing", + "instrument_id", + "allowed_sessions", + "tp1_partial", + "cancel_unfilled_or_flatten", + "confirmation chain", + "missing requirements", + "nearest_internal_range_liquidity", + "internal_liquidity_pool", + "dealing_range_boundary", + "trading_plan_id", "market_data_fresh", "operator_feedback_count", "paper_ticket_sample_gate",