34a1d9b1f1
显示实时力值、曲线及 UV 图层,并保存人工确认窗口和零载检查基准。定向测试、真实视频预览与已录会话复核闭环验证通过。
534 lines
25 KiB
JSON
534 lines
25 KiB
JSON
{
|
||
"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_surface": "Surface map",
|
||
"tab_points": "Calibration points",
|
||
"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.",
|
||
"reserved_surface": "Multi-point calibration sensitivity will be drawn as a colour map on the sensor's 3D surface here: each point's sensitivity interpolated and coloured, with a legend and range.",
|
||
"reserved_points": "The calibration point table and capture controls will appear here: platform coordinates, reference load, sampling statistics and the resulting sensitivity."
|
||
},
|
||
"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": "Deformation colour range 0–1 (algorithm units); values outside saturate",
|
||
"depth_missing": "No valid depth/deformation for this frame",
|
||
"flow_missing": "No valid displacement for this frame"
|
||
},
|
||
"review": {
|
||
"load_selection": "Load saved review…",
|
||
"confirm_stable": "Reviewed as stable",
|
||
"apply_window": "Apply window and recalculate",
|
||
"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": "Exploratory calibration review",
|
||
"notice": "Inspect each raw hold signal, adjust the times relative to hold start, confirm stability and apply. Operator review does not prove reference accuracy or synchronisation. Replay is for debugging; fits are exploratory.",
|
||
"save": "Save new review",
|
||
"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": "Skipped {count} incomplete trials; complete holds still require stability review.",
|
||
"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"
|
||
}
|
||
}
|