Files
orisys-app/apps/autocal/config/locales/en_US.json
T
ykcheungab 06e06126ca 重构 Autocal 采集页:单一队列与控制器驱动的主按钮
选点、对准、加载与录像分散在两个面板,状态靠隐藏相位判断。现改由不依赖 Qt 的采集控制器驱动,并加入录像选项、汇总平铺副本、保持到时自动结束、会话结束回到空闲,以及无设备时的模拟采集。已运行 Autocal 非 Qt 测试并通过范围内门禁;界面测试待 Windows 复核,未做实机验收。
2026-10-18 16:04:32 +08:00

916 lines
48 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}",
"tab_press": "Press zero",
"press_hint": "The solver reports the contact's geometric height above the table's origin plane, in millimetres. The drive is commanded in its own coordinate, counted from its own mechanical zero. One bench measurement relates the two. Until it is entered, Execute holds the press axis rather than passing a geometric height to the controller as a target.",
"press_zero": "Zero (reading with the tip on the origin plane)",
"press_rising": "A larger coordinate lifts the tip",
"press_calibrated": "Measured and confirmed on this machine",
"press_set": "Calibrated: press target = zero ± contact height.",
"press_unset": "Not calibrated: Execute holds the press axis.",
"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 and press axis Z return to 0. The table parks at its initial position: X at 0 mm, Y at 0 mm.",
"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} (these axes stay where they are and take no part in this move)",
"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": "Geometry & mounting",
"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"
},
"multipoint": {
"tab": "02 multi-point",
"hint": "A point comes from the position chosen on Select point. Adding it solves the platform pose so the surface normal faces the tool. Align normal asks before moving the five axes. If the controller is not connected, nothing moves and the reason is shown on this page. Simulation does not move the platform. A weight reference is typed. A six-axis reference stores Fx, Fy and Fz, then projects them with the rotation you enter. One raw axis is not the normal. Confirm the indenter has left before the next point.",
"site_id": "Point id",
"coordinates": "Position X / Y / Z",
"levels": "Load levels for this point (N), excluding baseline",
"hold": "Hold time",
"repeats": "Repeats",
"frame": "Coordinate frame",
"frame_placeholder": "Name the frame; it is stored and not converted",
"min_force": "Minimum force (N)",
"min_placeholder": "Blank means 0; the unloaded baseline is always recorded",
"max_force": "Maximum force (N)",
"force_placeholder": "Required; nothing is assumed",
"force_required": "Enter the maximum force; it is not assumed",
"add": "Add point",
"update": "Update selected",
"remove": "Delete selected",
"up": "Move up",
"down": "Move down",
"align": "Align normal",
"reacquire": "Record selected again",
"source": "Reference source",
"source_weight": "Weights",
"source_wrench": "Six-axis",
"fx": "Fx",
"fy": "Fy",
"fz": "Fz",
"rotation": "Force sensor to tool rotation",
"rotation_placeholder": "9 numbers, row major. Required before a normal component can be computed",
"reference": "Measured reference (N)",
"simulate": "Simulate acquisition",
"start": "Start acquisition",
"confirm": "At target force, start hold",
"liftoff": "Confirm the indenter has left the sensor",
"remeasure": "Measure this step again",
"remeasure_ready": "This step was discarded and progress stays on it. Reconnect the sensor, wait until the trace is back near its previous baseline, type this step's reference force, then click At target force, start hold.",
"stop": "Stop and keep data",
"stopped_reason": "operator stopped",
"finger_busy": "A single-point trial is running; finish it before multi-point acquisition",
"camera_required": "Start the camera or video input before live acquisition. Use simulation when there is no image; simulation does not open a camera or move the platform.",
"liftoff_wait": "The previous point is unloaded. Next point is {site}. Lift the indenter, click Align normal, and confirm before the platform moves so this normal faces up. Then click Confirm the indenter has left the sensor. Progress {done}/{total}",
"progress": "Point {site} ({site_index}/{site_count}) · {branch} {load:g} N · repeat {repeat}/{repeats} · progress {done}/{total} · {seconds:.1f} s left",
"idle": "Not started. Pick a position on Select point, add it, then simulate or start.",
"pose": "Solved pose: table X {x:.3f} mm, Y {y:.3f} mm, yaw {yaw:.3f}°, pitch {pitch:.3f}°, Z {z:.3f} mm, residual {residual:.3f}°. Align normal asks before the platform moves.",
"no_pose": "This point has no normal. Pick a valid position on Select point, then click Add point or Update selected.",
"no_map": "Load a sensor bundle so Select point shows the surface.",
"no_solver": "The pose solver is not connected.",
"align_select": "Select the destination point in the table, then click Align normal.",
"align_busy": "This run is still recording: wait for it to finish before aligning another point, because moving the platform now would invalidate it.",
"pose_refused": "This pose cannot be commanded: {reason}",
"point_moved": "This point's recorded position no longer matches the current map (off by {mm} mm). Pick it again on Select point and confirm it; do not move the platform to the old record.",
"normal_moved": "This point's recorded normal no longer matches the current map (off by {deg}°). Pick it again on Select point and confirm it.",
"point_unmapped": "This point has no usable source coordinate: no UV mapping and not a sensor-frame position. Pick it again on Select point.",
"no_finger": "The finger page is not connected.",
"no_finger_points": "The finger page has no picked points.",
"branch_baseline": "baseline",
"branch_load": "load",
"branch_unload": "unload",
"mesh_required": "Pick the point with U/V on the right so its mesh coordinate is shown, then add it.",
"right_confirm": "This step uses the right side: type the weight in Manual reference. For a six-axis reading, type Fx, Fy and Fz on the left. Then click At target force, start hold.",
"save": "Save status: {status}\n{path}",
"save_idle": "Nothing saved yet",
"save_writing": "Writing",
"save_kept": "Stopped; data already collected is kept",
"save_done": "Session complete",
"col_id": "Id",
"col_x": "X",
"col_y": "Y",
"col_z": "Z",
"col_levels": "Levels (N)",
"col_hold": "Hold (s)",
"col_repeats": "Repeats",
"col_done": "Done",
"capture": "Recording: {status} · {frames} frames · {dropped} dropped · {reason}",
"capture_idle": "Not ready",
"capture_recording": "Recording",
"capture_closing": "Closing",
"capture_complete": "Complete",
"capture_incomplete": "Evidence incomplete",
"capture_reason_restarted": "image source restarted",
"capture_reason_zero_frames": "no frame was written",
"capture_reason_write_error": "disk write failed",
"capture_reason_video_missing": "no video frame was kept",
"capture_reason_video_undecodable": "the video cannot be decoded",
"capture_reason_dropped": "frames were dropped",
"capture_reason_segments": "unexpected number of video segments",
"capture_reason_timeout": "closing timed out",
"capture_wait": "recording is not ready; the hold cannot be confirmed yet"
},
"finger": {
"title": "Geometry & mounting",
"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",
"select_hint": "Click a point on the flat map to try that point's pose.",
"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_branch": "Chosen pose and why",
"row_table_move": "Table move X / Y",
"row_press": "Press-axis target",
"row_residual": "Alignment residual",
"row_match": "Point match",
"match_none": "Pick a point on the flat image first",
"match_offline": "Platform not connected",
"match_value": "Selected X {sx} Y {sy} mm, yaw {syaw}°, pitch {spitch}°. Actual X {ax} Y {ay} mm, yaw {ayaw}°, pitch {apitch}°. Difference X {dx} Y {dy} mm, yaw {dyaw}°, pitch {dpitch}°",
"row_frames": "Frame mapping",
"branch_none": "—",
"branch_value": "{reason} (this pose {travel}° total, the other exact pose {other}°)",
"branch_only": "only exact pose",
"branch_alignment": "smallest residual",
"branch_in_range": "inside travel",
"branch_upright": "face still up",
"branch_smallest": "smallest turn",
"branch_crown": "already facing up; translate only",
"press_unset": "Zero not measured: this move holds the press axis (enter it in Device setup → Press zero)",
"press_target": "{target} mm (geometric contact height {height} mm)",
"tool_xy": "Tool X / Y",
"tool_hint": "Where the tool is in the table frame. Each point's table move is measured from this position.",
"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 thickness. The plate on this bench is 8 mm.",
"edit_not_a_number": "That cell needs a number; the previous value was kept.",
"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}",
"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}°"
},
"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.",
"saved_summary": "Review saved and summary published: {path} → {summary}",
"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.",
"video": "View recording",
"video_not_recorded": "Video not recorded, per the session settings"
},
"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": {
"checking": "Reading and verifying recordings in the background…",
"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",
"no_frame_source": "This repeat has no recorded frame source: the reference window exists, but no raw normal signal can be computed from it",
"time_basis_not_comparable": "Time base is not comparable with the hold window (the recording is not live capture on this host); it was left out of the calculation",
"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}",
"saved_summary": "Review saved and summary published: {path} → {summary}",
"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)"
},
"video": {
"title": "Video review",
"header": "{trial} · step {step} ({branch} {load} N) · review {status} · {samples} valid samples",
"position": "Frame {index}/{total} · id {frame} · segment {segment} frame {segment_frame} · basis {basis}",
"play": "Play",
"pause": "Pause",
"previous": "Previous",
"next": "Next",
"frame_missing": "This frame was not written to the video (dropped from the queue)",
"reason_missing": "Cannot open the video: {detail}",
"reason_no_frame_source": "This recording has no usable video evidence (no camera, or no frame was written)",
"reason_no_video_frame": "No valid frame of this hold was written to the video",
"reason_trial_not_found": "This trial is not in the record",
"reason_window_not_found": "This hold window is not in the trial",
"reason_video_undecodable": "The video file cannot be decoded",
"reason_decode": "Decoding this frame failed",
"cursor": "Current frame",
"reference": "Actual reference",
"curve_title": "Raw force curve for this hold",
"basis_unknown": "not recorded",
"open": "View recording"
},
"summary": {
"failed": "Summary export failed: {detail}. The recording is unchanged; you can retry.",
"published": "Summary published: {path}",
"retry": "Publish summary again",
"done": "Summary published again: {path}",
"reason_hold_not_found": "This hold attempt is not in the record",
"reason_hold_not_complete": "This hold attempt was discarded by a remeasure",
"copy_failed": "The summary was published, but the readable copy was not written: {detail}. The pointer still names the published summary and the recording is unchanged."
},
"cap": {
"check": {
"bundle": "Calibration bundle",
"frames": "Input frames",
"bus": "Bus and axis mapping",
"output": "Output folder writable",
"sn": "Sensor SN",
"max_force": "Maximum force"
},
"action": {
"start": "Start capture",
"align": "Align this point",
"confirm_target": "At the target — begin the hold",
"confirm_hold": "Hold finished — record this level",
"confirm_liftoff": "Confirm the probe has left the sensor",
"finish": "Finish the session",
"remeasure": "Measure this level again",
"skip": "Skip this point",
"stop": "Stop and keep the data",
"open_session": "Open session folder",
"open_summary": "Open summary",
"copy_path": "Copy path",
"settings": "Change input / bundle…"
},
"block": {
"closing": "Still writing to disk — wait for the close to finish",
"align_while_recording": "Recording: the platform cannot move to align another point",
"skip_live": "This level is already being recorded and cannot be skipped",
"no_directory": "There is no session folder yet",
"no_summary": "No summary has been published yet",
"not_ready": "Some checks are still unmet — see the Ready list above",
"no_sites": "The queue has no points yet",
"no_session": "The session settings are incomplete (output folder, model, SN, …)",
"no_solver": "No pose solver is connected, so the platform cannot be aligned",
"no_pose": "This point has no usable solved pose",
"hold_running": "The hold time has not elapsed",
"remeasure_unavailable": "No level can be measured again right now",
"stop_unavailable": "There is no running session to stop",
"finish_unavailable": "The session is not finished yet",
"skip_unavailable": "This build has no way to skip the current point, so it cannot be skipped",
"busy": "This action is not available in the current step",
"no_bundle": "No calibration bundle (export) is loaded",
"no_uv": "Click a position on the UV map first",
"no_output": "Choose the output directory first",
"no_sn": "Enter the sensor SN first",
"no_max_force": "Enter the maximum force (N) first",
"queue_busy": "The session is running; the point queue cannot be edited",
"bundle_busy": "The session is running; the calibration bundle cannot be changed",
"no_worker": "The input is not running, so recording cannot start",
"bad_levels": "Load levels must be strictly increasing, above zero and within the maximum force",
"bad_reference": "The measured reference force is not a valid number",
"align_running": "An alignment move is still running; wait for it to finish",
"pose_unreachable": "This point cannot be reached under the current mounting and travel, so aligning is disabled"
},
"session": {
"active": "Session: {sites} site(s) · {done}/{total} holds\n{path}",
"none": "No session yet. Align the first point, then press Start capture.",
"settings_hint": "Input source, bundle, session parameters and recording options are in \"Change input / bundle…\"; starting a capture does not switch pages."
},
"queue": {
"title": "Point queue",
"empty": "The queue is empty: click a position on the UV map, set the levels, then press Add current point.",
"add": "Add current point",
"update": "Update selected",
"remove": "Remove selected",
"up": "Move up",
"down": "Move down",
"site_id": "Site id",
"repeats": "Repeats",
"current_uv": "Current UV",
"col_id": "Site",
"col_position": "Sensor position (mm)",
"col_repeats": "Repeats",
"col_reachable": "Reachable",
"col_state": "State",
"reachable": "reachable",
"unreachable": "unreachable",
"state_pending": "pending",
"state_partial": "in progress",
"state_complete": "complete",
"state_skipped": "skipped",
"selected": "Selected: {site}",
"update_short": "Update",
"remove_short": "Remove",
"export": "Export point sheet…",
"export_tip": "Exports U/V, sensor coordinates, platform targets and the mapping identity in queue order; refuses when a coordinate no longer matches the mapping.",
"export_saved": "Point sheet exported: {path}",
"export_no_points": "The queue has no points yet",
"export_no_map": "No UV map is loaded, so the point sheet cannot be exported",
"export_missing_uv": "Point {order} has no UV coordinates, so the point sheet cannot be exported",
"export_no_pose": "Point {order} has no solved pose, so the point sheet cannot be exported",
"export_edited_point": "Point {order}'s sensor coordinates no longer match the current UV map; take the point again before exporting."
},
"card": {
"title": "Current point",
"no_point": "The queue is empty: add a point first.",
"no_progress": "Progress appears once the session starts.",
"next_site": "Next point: {site}"
},
"step": {
"align_point": "1. Align the current point",
"start_session": "2. Start capture",
"confirm_target": "3. Target reached - start the hold",
"confirm_hold": "4. Hold finished - record this step",
"confirm_liftoff": "5. Confirm liftoff, go to the next point",
"finish_session": "6. Finish the session",
"closing": "Writing to disk"
},
"hint": {
"align_point": "Align first: the primary button asks for the move plan; Start capture only appears after the move has been confirmed complete.",
"start_session": "This point is aligned. The primary button opens the session and records the first point step by step.",
"not_ready": "The ✗ checks must pass before starting; hover them to see why.",
"confirm_target": "Load to the current target, enter the measured reference force (or the six-axis components), then press the primary button.",
"confirm_hold": "Holding: {seconds:.1f} s left; do not change the load.",
"confirm_liftoff": "This repeat is recorded. Lift the indenter, confirm it has left the sensor, then press the primary button to go to the next point.",
"finish_session": "Every record is written. Press the primary button to finish the session and publish the summary.",
"closing": "Closing the recording and checking it; nothing else runs until it finishes."
},
"message": {
"aligning": "Alignment requested for {site}. Start capture stays unavailable until the move completes and is confirmed.",
"aligned": "Alignment confirmed: {site}",
"align_failed": "Alignment did not finish: {detail}. The platform is not confirmed in place; align again.",
"started": "Session started: {path}",
"attach_failed": "Could not start recording: {detail}",
"queue_added": "Point added: {site}",
"queue_removed": "Point removed: {site}",
"skipped": "Point skipped: {site}",
"stopped": "Stopped; the data already written is kept.",
"done": "Session finished: {path}"
},
"recording": {
"title": "Recording",
"video": "Record video",
"codec": "Video codec",
"lossless": "Also store lossless frames",
"unavailable": "{codec}: unavailable on this machine, disabled",
"probe_failed": "The codec probe did not run: {detail}",
"off": "Video off, per the session settings",
"estimate": "Estimated {size} ({seconds}); {free} free on disk",
"disk_short": "Less than twice the estimated size is free on disk",
"no_plan": "The queue is empty, so no size can be estimated yet",
"locked": "Recording options are locked once the session has started",
"summary": "Recording: {codec}"
},
"settings": {
"title": "Capture settings",
"input": "Input source",
"bundle": "Calibration bundle (export)",
"bundle_none": "not loaded",
"bundle_load": "Load export bundle…",
"session": "Session parameters",
"simulate": "Simulate (no camera, no platform motion)",
"close": "Close",
"max_required": "Required; the program does not assume a value"
}
}
}