Files
orisys-app/apps/autocal/config/locales/en_US.json
T
ykcheungab d06501d7d5 feat(autocal): 完善标定记录检查流程与UV轮廓显示
补齐传感器身份、稳定段检查引导和未完成试验诊断,并保存采集轮廓快照。通过60项相关测试、已有记录读取及代码和文档检查。
2026-10-11 20:15:04 +08:00

636 lines
32 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"app": {
"title": "Orisys AutoCal Platform Control",
"about_title": "About Orisys AutoCal",
"about_body": "Orisys AutoCal — internal controller for the 5-axis calibration platform\nVersion: {app_version}\nShared library: {shared_version} (API {api_version})\n\nQt binding: {binding}\nController library: {dll_dir}\nPreferences: {prefs_path}\n\nInternal use only.",
"internal_notice": "Internal tool: not shipped in the customer installer."
},
"brand": {
"name": "ORISYS",
"detail": "Orisys Technology"
},
"menu": {
"file": "File",
"device_setup": "Device setup…",
"open_bas": "Download BAS init program…",
"reveal_config": "Show config in Explorer…",
"quit": "Quit",
"view": "View",
"theme": "Theme",
"theme_dark": "Dark",
"theme_light": "Light",
"language": "Language",
"lang_zh": "简体中文",
"lang_en": "English",
"show_diagnostics": "Diagnostics",
"tabs": "Workspace",
"outputs": "Outputs folder",
"help": "Help",
"about": "About AutoCal"
},
"setup": {
"open": "Device setup",
"title": "Device setup",
"hint": "Connecting and bringing the bus up are checked once per machine start-up, so they live here. The status strip keeps reporting the result, and this window can stay open while you work.",
"tab_connection": "Connection",
"tab_bus": "Bus initialisation",
"tab_axes": "Axis mapping",
"axes_hint": "The bus reports axis numbers, not what each one moves. The mapping below comes from the bench wiring, and it must be complete and free of duplicates before anything moves.",
"role_x": "X (table)",
"role_y": "Y (table)",
"role_z": "Z (press)",
"role_yaw": "yaw (rotation)",
"role_pitch": "pitch (tilt)",
"role_axis": "Drive",
"axes_duplicate": "One drive is claimed by more than one direction: {detail}",
"close": "Close",
"chip_hint": "Open device setup — {name}"
},
"move": {
"execute": "Execute",
"execute_hint": "Send the selected point's solved pose to the platform: yaw, pitch, table X/Y and press axis Z move together.",
"stop": "Stop",
"stop_hint": "Stop every axis now (the same command as 全部停止 in the strip).",
"return_initial": "Return to zero",
"return_hint": "Yaw, pitch, table X/Y and press axis Z return to zero together.",
"confirm_title": "Confirm motion",
"confirm_execute": "Will move these axes together:\n\n{steps}\n\nCheck this against the machine before continuing.",
"confirm_return": "Will move these axes back to zero together:\n\n{steps}",
"hold_note": "Not moved: {roles} (the press axis is P7's business — contact detection and press depth)",
"cancelled": "Cancelled; nothing was commanded",
"confirm_check": "Confirm before moving",
"confirm_hint": "Unchecked, Execute and Return to zero are sent directly. Stop is never affected.",
"no_point": "No calibration point is selected",
"busy": "A move is already running",
"refused": "Motion refused",
"done": "Move finished",
"failed": "Move failed",
"stopped": "Stopped; the remaining steps were cancelled"
},
"connection": {
"title": "Controller connection",
"mode": "Connection",
"mode_eth": "Ethernet",
"mode_com": "Serial",
"mode_pci": "PCI card",
"mode_local": "Local / simulated",
"mode_demo": "Demo (no hardware)",
"ip": "IP",
"scan": "Scan IP",
"com": "COM port",
"card": "Card",
"local_string": "Connect string",
"open": "Connect",
"close": "Disconnect",
"status": "Status",
"state_open": "Connected",
"state_closed": "Not connected",
"state_connecting": "Connecting…",
"source": "Library",
"no_more": "The 『{mode}』 connection is not available yet."
},
"bus": {
"title": "Bus initialisation",
"bas_path": "BAS file",
"choose": "Choose BAS…",
"download": "Download and initialise",
"reinit": "Re-initialise",
"type": "Bus type",
"type_ecat": "EtherCAT",
"type_rtex": "RTEX",
"type_unknown": "Unknown",
"state": "Init state",
"state_pending": "Not started",
"state_running": "Initialising…",
"state_ok": "Initialised",
"state_unverified": "Init not confirmed",
"unverified_hint": "The controller still holds the initialisation flag from its last run; this power-up has not re-scanned the bus. If the platform will not move, download the BAS file and re-initialise.",
"state_failed": "Initialisation failed",
"state_timeout": "Initialisation timed out",
"nodes": "Nodes",
"axes": "Axes",
"downloaded": "File downloaded; the controller will scan the bus after its delay",
"dialog_title": "Choose a BAS file"
},
"axes": {
"title": "Axis motion",
"axis": "Axis",
"enable": "Enable",
"enable_on": "Enabled",
"enable_off": "Disabled",
"atype": "Type",
"units": "Units",
"speed": "Speed",
"accel": "Accel",
"dpos": "DPOS",
"mpos": "MPOS",
"dpos_mm": "DPOS (mm)",
"mpos_mm": "MPOS (mm)",
"status": "Status",
"motion": "Motion",
"motion_word": "Motion",
"idle": "Stopped",
"moving": "Moving",
"position_pair": "{value} ({mm} mm)",
"enable_all": "Enable all",
"disable_all": "Disable all",
"clear_alarm_all": "Clear all alarms",
"detail": "Axis {axis}: type {atype} · accel {accel} · feedback {mpos} ({mpos_mm} mm) · status {status} · {home}",
"detail_none": "Axis {axis}: no data yet (not connected or not initialised)",
"home_status": "Homing",
"home_ok": "Homed",
"home_pending": "Not homed",
"home_running": "Homing…",
"jog_fwd": "Fwd",
"jog_rev": "Rev",
"stop_all": "Stop all",
"stop": "Stop",
"target": "Target",
"move_abs": "Move abs",
"move_rel": "Move rel",
"home_mode": "Home mode",
"home_high": "Home speed",
"home_low": "Home creep",
"home_offset": "Home offset",
"clear_alarm": "Clear alarm",
"apply": "Apply",
"home": "Home",
"controls": "Actions",
"mm_derived_tip": "Millimetres are derived from the pulse equivalent: a display value, not a calibrated length.",
"enabled_count": "{on}/{total} axes enabled"
},
"busdata": {
"title": "Bus data exchange",
"group": "Bus data (SDO / RTEX)",
"ecat": "EtherCAT (SDO)",
"rtex": "RTEX",
"node": "Node",
"index": "Index",
"subindex": "Subindex",
"type": "Type",
"value": "Value",
"read": "Read",
"write": "Write",
"axis": "Axis",
"parameter": "Parameter",
"last_result": "Last: {text}",
"not_available": "The current bus does not support this",
"read_ok": "Read: {value}",
"write_ok": "Written"
},
"status": {
"motion": "Motion",
"ready": "Ready",
"poll_ok": "State refresh healthy",
"poll_paused": "State refresh paused",
"poll_stalled": "State refresh stalled",
"last_error": "Last error",
"none": "None",
"refused": "Refused",
"done": "Done",
"failed": "Failed",
"pause": "Pause refresh",
"resume": "Resume refresh",
"paused": "State refresh paused",
"alarm_short": "Alarm",
"axes_enabled": "{on}/{total} axes enabled",
"health_none": "Refresh —",
"health_age": "Read {ms} ms ago",
"health_paused": "Refresh paused",
"poll_every": "Refresh every {ms} ms"
},
"run": {
"title": "Run",
"phase_idle": "Idle",
"phase_dry_run": "Dry run",
"phase_running": "Running",
"phase_paused": "Paused",
"phase_done": "Done",
"phase_failed": "Failed",
"step_of": "Point {done}/{total}",
"no_steps": "No points generated",
"elapsed_only": "Elapsed {elapsed}",
"elapsed_remaining": "Elapsed {elapsed} · about {remaining} left",
"run": "Run",
"pause": "Pause",
"abort": "Abort",
"abort_stopped": "Run aborted and all axes stopped.",
"not_implemented": "The runner belongs to phase P7 and is not implemented yet; abort is always available."
},
"readout": {
"title": "Axis state"
},
"workspace": {
"tab_axes": "Axis debug",
"tab_sequence": "Test sequence",
"tab_finger": "Finger debug",
"tab_sensor": "Calibration capture",
"tab_records": "Calibration records",
"not_built": "Not built yet",
"reserved_sensor": "Sensor connection, live image and force curves will appear here: device and source selection, preview, and a compact version of the Studio curve view."
},
"source": {
"kind": "Input source",
"kind_video": "Video file",
"kind_camera": "Live camera",
"video": "Finger video",
"camera_index": "Camera index",
"config": "Sensor config",
"browse": "Browse…",
"start": "Start input",
"stop": "Stop",
"idle": "Choose an input source and sensor.json",
"no_frame": "Waiting for processed frames",
"preview_only": "Choose a U/V site first, then check the live 2D UV image here and record the trial.",
"choose_video": "Choose Finger video",
"choose_config": "Choose sensor.json",
"video_filter": "Video files (*.mp4 *.avi *.mov *.mkv);;All files (*)",
"missing_input": "Choose an existing sensor.json and, for video mode, a video file",
"opening": "Opening input…",
"running": "Processing frames",
"stopping": "Stopping…",
"stopped": "Stopped",
"finished": "Video finished",
"disconnected": "Camera disconnected",
"failed": "Acquisition failed; check the input source",
"error": "Acquisition or processing failed: {detail}",
"basis_replay": "decoded now",
"basis_camera": "camera received",
"basis_unknown": "read time (source unverified)",
"frame": "Frame {frame} · source {source_frame} · {basis} {time} · dropped {dropped}"
},
"calibration": {
"sensor_model": "Product model",
"sensor_sn": "Sensor SN",
"output": "Output directory",
"site_view": "Select site",
"live_view": "Live 2D UV image",
"uv": "U / V (px)",
"position": "Mesh position",
"levels": "Load levels (N)",
"hold": "Hold per level",
"hold_tip": "Count down after arrival confirmation. End the hold window and prompt the next level; video continues. Time alone does not verify stability.",
"reference": "Manual reference force (N)",
"start": "Start this trial",
"start_tip": "Create a trial in this calibration session. Record initial zero, loading, unloading and recovery continuously; no platform motion is issued.",
"confirm": "Target reached: start hold",
"confirm_tip": "Reach the current target and enter the actual reference load. Keep the load unchanged until the countdown ends.",
"finish": "Complete this trial",
"finish_tip": "After initial zero and every loading/unloading hold, stop recording, check and save the trial.",
"abort": "End early (keep incomplete data)",
"abort_tip": "End this trial immediately and keep its incomplete data. A retry creates a new trial in the same calibration session.",
"load": "Load",
"unload": "Unload",
"next_step": "{branch} to {load:g} N; enter actual reference load and start hold",
"before_start": "Select a site and start input, then start the trial with initial zero",
"ready_to_finish": "All hold windows complete; complete this trial",
"no_step": "No step pending",
"progress": "Progress {done}/{total} · {status}",
"source_state": "Input: {status} · frame {frame} · capture drops {dropped}",
"replay_note": "Video replay is for debugging; manual reference loads cannot be synced to the original experiment.",
"idle": "Idle",
"recording": "Recording",
"closing": "Writing files",
"complete": "Complete",
"incomplete": "Incomplete",
"result": "{status}: {path}",
"incomplete_result": "This recording is incomplete; data written so far is at: {path}",
"error": "Action failed: {detail}",
"invalid_site": "Select a valid UV site first",
"start_input": "Start camera or video input first",
"reference_required": "Enter the actual reference load",
"output_required": "Choose an output directory",
"zero": "Initial zero",
"holding": "Hold {branch} {load:g} N · {seconds:.1f} s remaining; do not change load",
"close_session": "Finish calibration session",
"close_session_tip": "Close the session containing multiple sites and trial attempts. Incomplete trials keep the session incomplete. The next trial creates a new session.",
"session_none": "No calibration session yet; the first trial creates it.",
"session_active": "Calibration session: {sites} sites · {trials} attempts\n{path}",
"session_closed": "Calibration session closed ({status}): {path}",
"close_before_mapping": "Finish the calibration session before changing UV mapping or bundle",
"path": "Trial path (N): {path}",
"invalid_levels": "Enter strictly increasing levels greater than 0 and at most 30 N"
},
"finger": {
"title": "Finger calibration-point debug",
"bundle_path": "Export bundle",
"load": "Load bundle…",
"reset_view": "Reset view",
"initial_view": "Initial view",
"textured": "UV texture: {name}",
"untextured": "No UV texture: showing the shaded layout map.",
"texture_missing": "No texture at {path}: showing the shaded layout map.",
"flat_title": "Flat image (click to pick)",
"readout_title": "Readouts",
"preview_title": "3D preview",
"points_title": "Picked points",
"select_hint": "Click a point on the flat image to pick a calibration point.",
"no_bundle": "No export bundle loaded.",
"no_surface": "Pixel ({x}, {y}) is not on the sensing surface (UV gap).",
"row_sensor_point": "Sensor point (mm)",
"row_sensor_normal": "Surface normal",
"row_platform_point": "Platform point (mm)",
"row_pose": "Pose X / Y / yaw / pitch",
"row_table_move": "Table move X / Y",
"row_residual": "Alignment residual",
"row_frames": "Frame mapping",
"tool_xy": "Tool X / Y",
"tool_hint": "Where the tool is in the table frame, straight above the table origin by default. The table move is what carries the contact to this point. Measure it on the real setup.",
"sensor_xy": "Sensor X / Y",
"sensor_zy": "Sensor Z / yaw",
"setup_hint": "How the sensor actually sits on the stack with the machine at zero: X/Y/Z translation and a yaw about Z. Z is the mounting plate, shims included — there is no separate plate field. Measure it on the real setup.",
"clear_points": "Clear points",
"remove_selected": "Remove selected",
"move_up": "Move up",
"move_down": "Move down",
"selected_count": "{count} selected",
"table_hint": "Tick a row to select it, double-click a sensor coordinate or normal to edit it. The pose columns are solved from those, so they update themselves.",
"edit_not_a_number": "That cell needs a number; the previous value was kept.",
"point_count": "{count} points",
"residual_value": "{residual}° — {verdict}",
"reachable": "this normal can be aligned with Z",
"unreachable": "this normal cannot be aligned with Z (yaw travel limit)",
"reach_summary": "Alignable surface vertices {aligned}/{vertices} ({share}%), worst {worst}°",
"preview_legend": "What the colours mean: green→red is the surface's alignment residual · the red/green/blue triad is the table's X/Y/Z, at the origin · yellow line is the tool axis (+Z, at the tool's own X/Y) · orange dot is the table origin · amber outline is the sensor base plane, at the sensor's Z offset (the mounting plate) · cyan line is the planned path (stage arc, then table move) · the violet ring is the table's pose now and the faint one is where it finishes, against the fixed grid that is where it started · red dot is the point selected in the table · white dot with blue line is the picked contact and its normal.",
"preview_legend_short": "green→red = alignment residual · red/green/blue = table X/Y/Z · yellow = tool axis (+Z) · orange = origin · amber box = base plane · cyan = planned path · violet ring = table pose · white dot = contact",
"show_axes": "Show motion axes",
"show_table": "Show table origin plane",
"show_trajectory": "Show tool path",
"path_summary": "Planned path: travels {reach} mm; arc radius {radius} mm about the table origin.",
"landing": "lands X/Y {x} {y} mm",
"tool_at": "tool X/Y {x} {y} mm",
"landing_on_tool": "✓ on the tool",
"landing_off_tool": "✗ off the tool by {gap} mm",
"preview_legend_table": "The grey lines crossing at one origin are the two rotation axes. The grid is the initial state and does not move; the violet ring is the table's own frame, which the move carries away from it.",
"sim_play": "Play motion",
"sim_stop": "Stop",
"sim_hint": "Play the solved motion: the stages rotate the normal onto the tool axis, then the XY table moves. Pick a point first.",
"preview_no_gl": "No OpenGL context: {error}",
"preview_draw_failed": "Drawing failed: {error}",
"preview_solve_failed": "Solve failed: {error}",
"col_x": "x",
"col_y": "y",
"col_z": "z",
"col_nx": "nx",
"col_ny": "ny",
"col_nz": "nz",
"col_X": "X",
"col_Y": "Y",
"col_Z": "Z",
"col_yaw": "yaw",
"col_pitch": "pitch",
"col_residual": "residual(°)",
"loaded": "Bundle loaded: {vertices} vertices · {triangles} triangles · {extent} mm · {scale} mm per unit",
"load_failed": "Load failed: {error}",
"picked": "Picked: residual {residual}° · yaw {yaw}° · pitch {pitch}°",
"export_sites": "Export operator site list…",
"export_sites_tip": "Export all points in displayed order, with UV pixels and sensor/platform millimetres. UV origin matches calibration.",
"export_no_points": "Pick UV sites first",
"export_edited_point": "Point {order} was edited in 3D and no longer matches its UV pixel; pick it again before exporting",
"sites_exported": "Operator site list exported: {path}",
"col_u_px": "U (px)",
"col_v_px": "V (px)"
},
"sequence": {
"title": "Test sequence design",
"profile_title": "Point generation",
"preview_title": "Preview",
"validation_title": "Checks",
"points_title": "Calibration points",
"field_mode": "Surface mode",
"field_name": "Sequence name",
"field_note": "Note",
"field_pitch": "Pitch (mm)",
"field_margin": "Margin (mm)",
"field_radius": "Radius (mm)",
"field_clear_height": "Clear height (mm)",
"field_approach_speed": "Approach speed (mm/s)",
"field_press_speed": "Press speed (mm/s)",
"field_press_depth": "Press depth (mm)",
"field_dwell": "Dwell (s)",
"field_settle": "Settle window (s)",
"field_repeats": "Repeats",
"field_order": "Point order",
"mode_flat": "Flat",
"mode_curved": "Curved",
"order_row": "Row-wise",
"order_serpentine": "Serpentine",
"order_distance": "By distance",
"preview_placeholder": "3D preview: sensor surface · calibration points · visiting order\n(implemented in the simulation phase)",
"preview_hint": "After generation, check here that each point is on the surface, inside travel, and confirmable by contact.",
"validation_pending": "No points generated yet.",
"check_on_surface": "On the surface",
"check_within_travel": "Within travel",
"check_contact_confirmable": "Contact confirmable",
"btn_generate": "Generate points",
"btn_simulate": "Simulate",
"btn_dry_run": "Dry run (no contact)",
"btn_export": "Export sequence…",
"btn_import": "Import sequence…",
"import_export_tip": "Saved as a JSON document (.oryseq), reusable across machines; the format version is checked on import.",
"export_failed": "Export failed: {error}",
"import_failed": "Import failed: {error}",
"pending_tooltip": "This belongs to phase {phase} and is not implemented yet.",
"col_index": "#",
"col_x": "X (mm)",
"col_y": "Y (mm)",
"col_z": "Z (mm)",
"col_status": "Status",
"col_sensitivity": "Sensitivity (last)",
"col_samples": "Samples",
"col_actions": "Actions",
"not_generated": "—",
"status_pending": "Pending",
"status_skipped": "Skipped",
"summary": "{count} points ({enabled} enabled) · {spans} · about {duration} (estimate)",
"summary_empty": "No points yet: generate or import to see the count and travel span.",
"dialog_export": "Export sequence",
"dialog_import": "Import sequence",
"filter_sequence": "Calibration sequence (*.oryseq *.json)",
"exported": "Sequence exported: {name}",
"imported": "Sequence imported: {name} ({count} points)",
"import_warnings": "Import reported {count} warning(s)",
"confirm_discard": "The current sequence has not been exported. Importing replaces it. Continue?",
"points_hint": "Coordinates are generated and checked per point; they are not typed. A typed coordinate is one nothing has checked, and one wrong number ruins a run."
},
"action": {
"ok": "Done",
"refused": "Refused",
"failed": "Failed"
},
"diagnostics": {
"title": "Diagnostics",
"binding": "Qt binding",
"dll_dir": "Controller library",
"prefs": "Preferences",
"outputs": "Outputs",
"bas_loaded": "BAS loaded",
"yes": "Yes",
"no": "No"
},
"feedback": {
"waiting": "Waiting for force samples",
"uncalibrated": "N unavailable",
"stopped": "Input stopped; showing the last frame, values are no longer live.",
"stale": "No new frame yet or no update for over 1 s; check the input.",
"invalid": "Current force sample is invalid: {reason}",
"raw_note": "Live raw force signals (last 60 s); raw is not N. Enter the manual reference force separately.",
"overflow": "Preview omitted {count} frames; check acquisition drop status",
"raw_axis": "Raw force signal (raw)",
"time_axis": "Acquisition time (s)",
"background": "Real background",
"background_tip": "Checked: real UV image. Unchecked: solid background. Depth colours can overlay either background.",
"arrows": "Displacement arrows",
"depth": "Depth",
"depth_tip": "False colour of algorithm depth/deformation, not calibrated millimetres.",
"depth_scale": "Adaptive deformation range for this frame: {low:.4g}–{high:.4g} (algorithm units, not mm)",
"depth_missing": "No valid depth/deformation for this frame",
"flow_missing": "No valid displacement for this frame"
},
"overview": {
"capture_in_progress": "In progress",
"saved": "Analysis saved; hover for its location.",
"open_session": "Open calibration session…",
"empty": "Choose the session folder containing session.json to view collected sites, normal response and sensitivity. You can also open current data from Calibration capture.",
"title": "Calibration record overview",
"notice": "Inspect acquired sites and normal response; click UV points or table rows. Circles: confirmed windows; squares: candidates. Trial shades differ. The fit uses all eligible loading data for the site and is not refitted by the trial filter.",
"coverage": "Acquisition status",
"sensitivity": "Normal sensitivity",
"import_plan": "Import planned-point CSV…",
"clear_plan": "Clear plan comparison",
"load": "Load saved analysis…",
"save": "Save analysis results",
"summary": "Collected {collected} / planned {planned}; missing {missing}; with incomplete attempts {incomplete}; unchecked {pending}; checked {reviewed}; extra {extra}.",
"no_plan": "Import a plan to identify missing sites.",
"uncollected": "Not acquired",
"incomplete": "Has incomplete attempts",
"pending": "Awaiting check",
"reviewed": "Stable windows checked",
"confirmed": "Checked",
"candidate": "Unchecked",
"coverage_map": "Red: incomplete attempts; amber: unchecked; green: checked; grey: uncollected",
"sensitivity_map": "Confirmed sensitivity: blue→red {low:.4g}→{high:.4g} raw/N<br/>Grey: no confirmed fit",
"details": "Check hold windows…",
"trial_filter": "Displayed trial",
"all_trials": "All trials",
"site_fit": "Site loading fit (all eligible trials)",
"response_title": "Normal response: reference force → raw signal",
"selected_fit": "Sensitivity {sensitivity} raw/N · {basis}. Fit uses all eligible loading windows at this site; range and trial count are in the site tooltip.",
"no_windows": "No eligible complete windows; recorded signal and stop diagnostics remain available.",
"col_order": "Plan order",
"col_site": "Acquired site",
"col_uv": "U / V (px)",
"col_xyz": "Sensor XYZ (mm)",
"col_status": "Analysis readiness",
"col_trials": "Complete / all trials",
"col_windows": "Confirmed / complete windows",
"col_levels": "Confirmed loading levels (N)",
"col_sensitivity": "Sensitivity (raw/N) / basis",
"col_range": "Fit range (N)",
"col_fit_trials": "Fit trials",
"tools": "Plan / saved analysis",
"identity": "Model: {model} SN: {sn} Acquired: {date} Source: {source} Capture: {status}",
"source_video": "Video replay (debug only)",
"source_camera": "Camera",
"timeline": "Time signal / diagnostics",
"response": "Loading / unloading response",
"time_axis": "Time from each trial’s first valid sample (s)",
"reference_axis": "Declared reference (N)",
"timeline_title": "Blue: FN_raw; orange: declared hold reference (not live FT)",
"no_trace": "No readable valid signal; inspect diagnostics below",
"outline_snapshot": "Grey: sensor boundary; blue: colour patch boundary (recorded snapshot)",
"outline_surface_only": "Sensor mapping verified; no recorded colour patch outline is available.",
"outline_unavailable": "Recorded UV outline unavailable; showing sites only.",
"outline_mismatch": "UV outline does not match the recorded mapping; overlay disabled.",
"analysis_reviewed": "Stable windows checked",
"analysis_pending": "Check stable windows",
"analysis_no_analysis": "No eligible windows",
"site_details": "XYZ (mm): {xyz}\nComplete / all attempts: {attempts}\nFit range (N): {range}; contributing trials: {trials}",
"inspect_incomplete": "Inspect incomplete attempt",
"diagnostic": "{trial} · {status} | Valid samples {samples}; invalid / unjoined {invalid}; recording drops {dropped}; largest frame gap {gap} s\nStop reason: {reason}",
"read_errors": "Missing or unreadable: {detail}",
"choose_trial": "Select one trial for integrity, drop and stop diagnostics. All-trial traces use separate time origins.",
"unsaved": "Window or plan changes have not been saved.",
"save_hint": "Confirming stability does not certify calibration accuracy.",
"guide_missing": "1 Check identity → 2 Select site / trial → 3 Check stable windows → 4 Save\nNext: this site has no attempt; choose a collected site or acquire it.",
"guide_incomplete": "1 Check identity → 2 Select site / trial → 3 Check stable windows → 4 Save\nNext: inspect the stop reason and recorded signal. Incomplete attempts are excluded from fitting.",
"guide_check": "1 Check identity → 2 Select site / trial → 3 Check stable windows → 4 Save\nNext: select a trial and Check hold windows; adjust the time interval if needed.",
"guide_save": "1 Check identity → 2 Select site / trial → 3 Check stable windows → 4 Save\nNext: inspect remaining holds or save current analysis."
},
"quality": {
"open": "Repeatability and validation…",
"title": "Site quality analysis",
"notice": "Only operator-confirmed valid windows are used. Results remain exploratory. Replay, stability review and trial holdout do not establish physical accuracy or reference synchronisation.",
"repeatability": "Repeatability",
"repeatability_note": "For the same branch and exact declared reference force, average within each trial, then report range and sample standard deviation across trials. At least two trials are required; this differs from within-hold variation.",
"hysteresis": "Loading/unloading difference",
"hysteresis_note": "Pair nonzero loading and unloading windows at exactly the same declared reference force within one trial, without interpolation. Difference is unloading minus loading, in raw units; unmatched levels produce no result.",
"zero_return": "Zero return",
"zero_return_note": "Final unloaded zero minus initial zero in the same trial, in raw units. Only confirmed windows declaring 0 N are paired.",
"validation": "Held-out trial validation",
"validation_note": "Hold out each entire trial, fit zero/loading windows from other trials, then predict all confirmed windows in the held-out trial. Windows have equal weight. Cross-validation does not replace another independent experiment.",
"validation_summary": "Evaluated windows: {count}; RMSE {rmse} N; MAE {mae} N; maximum absolute error {maximum} N; outside training raw range: {outside}.",
"no_data": "No eligible data yet; review the required windows first.",
"insufficient_training": "Insufficient training data in other trials",
"outside_range": "Outside training raw range",
"in_range": "Within training raw range",
"col_branch": "Phase",
"col_load": "Manual reference (N)",
"col_trials": "Trials",
"col_range": "Between-trial range (raw)",
"col_std": "Between-trial sample std (raw)",
"col_trial": "Trial",
"col_load_raw": "Loading mean (raw)",
"col_unload_raw": "Unloading mean (raw)",
"col_delta_raw": "Difference (raw)",
"col_initial_zero": "Initial zero (raw)",
"col_final_zero": "Final zero (raw)",
"col_held_out": "Held-out trial",
"col_training": "Training trials",
"col_predicted": "Predicted force (N)",
"col_error": "Prediction minus reference (N)",
"col_range_status": "Range/status"
},
"review": {
"load_selection": "Load saved analysis…",
"confirm_stable": "This interval was checked for stability",
"apply_window": "Confirm interval and recompute",
"start_offset": "Start",
"end_offset": "End",
"verified": "Stability confirmed by operator",
"confirmed_fit": "Fit uses operator-confirmed windows; independent validation is still required.",
"candidate_fit": "Fit uses candidate windows; insufficient confirmed data.",
"valid_samples": "Valid raw samples",
"hold_time_axis": "Time since hold start (s)",
"trace_title": "Selected hold signal; vertical lines mark the analysis window",
"selection_unsaved": "Window applied; save the analysis to preserve this review.",
"open": "Review calibration data…",
"title": "Hold window inspection",
"notice": "Select a hold → inspect signal, standard deviation and drift → adjust the interval → confirm stability and recompute → save. Operator confirmation is not accuracy acceptance.",
"save": "Save analysis results",
"no_sites": "No sites in this session",
"candidate": "Candidate window",
"insufficient_samples": "Insufficient valid samples",
"replay": "Replay debug",
"unverified": "Stability unverified",
"fit": "Exploratory loading fit: sensitivity {sensitivity_raw_per_n:.6g} raw/N; gain {gain_n_per_raw:.6g} N/raw; offset {offset_n:.6g} N; fit RMSE {rmse_n:.4g} N (not independent validation error)",
"no_fit": "Insufficient load levels or raw-signal variation for a fit.",
"fit_line": "Exploratory loading fit",
"raw_axis": "Raw normal signal (raw)",
"force_axis": "Manual reference force (N)",
"chart_title": "Hold-window means: loading vs unloading",
"uv_title": "Site sensitivity: blue→red {low:.4g}→{high:.4g} raw/N; grey has no fit",
"issues": "{count} incomplete attempts excluded from fitting. Inspect raw signals for stability.",
"saved": "Saved new review: {path}",
"col_trial": "Trial",
"col_branch": "Phase",
"col_load": "Reference (N)",
"col_samples": "Valid samples",
"col_mean": "Raw mean",
"col_std": "Raw std",
"col_duration": "Hold (s)",
"col_quality": "Quality",
"col_drift": "Drift (raw/s)"
}
}