// 中英词典 —— **唯一的真源**。 // // 为什么单独一个文件、而不是写在 i18n.js 里: // 服务端渲染需要它(app/i18n.py 读这个文件),而服务端是 Python。 // 写在 .js 里的话,Python 要么重复维护一份、要么去解析 JS 源码。 // 这里用**合法 JSON** 作为载荷,外面只包一行赋值 —— Python 剥掉包装就能 // json.loads,浏览器当一个普通脚本同步加载(带 ?v= 缓存,不会每页重下)。 // // 改词条只改这个文件。别在 i18n.js 里再加字面量。 window.__I18N__ = { "zh": { "app_title": "processor", "language": "语言", "video_review": "视频审核", "trash": "回收站", "all_status": "全部状态", "reviewing": "审核中", "reviewed": "已审核", "all_tasks": "全部任务", "search": "搜索...", "loading": "加载中...", "processing": "处理中...", "ai_annotating": "AI 标注处理中...", "ai_annotating_hint": "AI 标注完成后自动载入本批次数据", "no_data": "暂无数据", "load_failed": "加载失败", "select_episode": "选择一个视频开始审核 →", "no_video": "此 Episode 没有视频数据", "cameras": "相机", "play_all": "▶ 全部播放", "pause_all": "⏸ 全部暂停", "play_btn": "播放", "pause_btn": "暂停", "layout_row": "并排", "layout_grid": "网格", "layout_column": "上下", "no_description": "无任务描述", "frame": "帧", "download": "下载", "export": "导出", "export_hint": "按工作流导出格式下载最终数据集", "re_export": "重新导出", "re_exporting": "重新导出中", "re_export_done": "重新导出完成", "re_export_failed": "重新导出失败", "delete": "删除", "approve": "通过", "deleted_msg": "已移入回收站", "select_hint": "选择 Episode 后显示详情", "trash_empty": "回收站为空", "trash_title": "回收站", "purge_all": "全部清空", "restore": "恢复", "permanent_delete": "永久删除", "days_left": "剩余", "day_unit": "天", "confirm_trash": "确定将此视频移入回收站吗?\n7 天后自动清理。", "confirm_permanent": "确定永久删除吗?此操作不可恢复!", "confirm_purge": "确定清空回收站吗?所有内容将被永久删除!", "op_failed": "操作失败", "restore_failed": "恢复失败", "delete_failed": "删除失败", "purge_failed": "清空失败", "export_failed": "导出失败", "no_reviewed": "没有已审核的 Episode 可导出", "export_created": "导出任务已创建,完成后自动下载", "left_hand": "左手", "right_hand": "右手", "single_mono": "单目视频", "glove_sensor": "手套传感器", "depth_image": "深度图", "aux_video": "辅助视频", "skeleton_suffix": "骨骼", "glove_suffix": "手套", "depth_suffix": "深度", "stereo_pair": "双目并排", "3d_skeleton": "3D 骨骼", "stereo_render": "3D 拼接", "hand3d_no_data": "该帧无 3D 骨骼数据", "hand3d_hand0": "手 0", "hand3d_hand1": "手 1", "hand3d_world": "3D 手部世界坐标", "heatmap_toggle": "深度热力图", "synced_ok": "同步正常", "drag_here": "拖拽素材到这里", "remove_source": "移除素材", "video_suffix": "视频", "hand_pressure": "手部压力", "media_assets": "素材", "drag_to_canvas": "拖拽素材到中间视频区域", "raw_vs_processed": "原始视频 / 处理结果", "refresh": "刷新", "not_found": "未找到", "deleted": "已删除", "port_label": "Port", "annotation": "动作标注", "annotation_readonly": "只读", "annotations": "标注段", "new_annotation": "新增标注", "edit_annotation": "编辑标注", "delete_annotation": "删除标注", "label_name": "标注名称", "start_frame": "起始帧", "end_frame": "结束帧", "set_start_frame": "设起始帧", "set_end_frame": "设结束帧", "keyframe": "关键帧", "add_keyframe": "添加关键帧", "frames_covered": "帧已标注", "per_frame_label": "每帧标注", "no_annotations": "暂无标注,点击\"新增\"创建第一个标注段", "confirm_delete_anno": "确定删除此标注段吗?", "save_annotation": "保存标注", "save_changes": "保存修改", "slice_conflict": "此切片已在另一台电脑修改,已加载最新版本。请确认后再次保存。", "current_frame": "当前帧", "anno_color": "颜色", "anno_frame_range": "帧范围", "anno_duration": "时长", "anno_keyframe_event": "关键帧事件", "seconds_abbr": "s", "select_all": "全选", "batch_download": "批量下载", "batch_export_dataset": "导出数据集 (慢)", "batch_zip_download": "打包下载 (快)", "batch_zip_hint": "从源数据集原样裁出所选批次 —— 产出仍是单个 LeRobot 结构(data/ + meta/ + videos/),不重建、秒级返回。只想把这批数据拿走就用这个。", "batch_export_hint": "把所选批次合并成**一个**可训练数据集(需要整库重建:重编码视频 + 重算统计,约 30 秒/集)。要拿去训练才用这个。", "batch_selected_summary": "已选 %s 集 · %f 帧", "minutes_short": "分", "select_project_all": "全选本项目(含折叠中的批次)", "unreview": "撤销", "retry_review": "放入审核", "reprocess": "重新处理", "confirm_reprocess": "重新运行该批次绑定的工作流?新产物将替换旧处理结果。", "reprocess_failed": "重新处理失败: ", "nav_home": "首页", "nav_tasks": "项目", "nav_review": "视频审核", "nav_trash": "回收站", "nav_workflow": "工作流", "nav_users": "用户", "nav_annotation": "标注", "nav_model": "模型", "train_tab_checkpoints": "模型输出", "train_tab_params": "训练参数", "train_label_model": "模型", "train_label_location": "位置", "train_files_unit": "个文件", "train_group_train": "训练", "train_group_policy": "策略 Policy", "train_group_optimizer": "优化器", "train_group_dataset": "数据集", "train_step_badge": "步骤", "train_file_details": "文件明细", "train_col_name": "文件名", "train_col_size": "大小", "train_col_mtime": "修改时间", "train_btn_download": "下载", "train_btn_delete": "删除", "train_btn_infer": "推理", "train_btn_deploy": "离线部署", "train_btn_hint_delete": "删除 checkpoint 是破坏性操作,暂不开放", "train_btn_hint_download_row": "展开文件明细 —— 那里每行单独下载", "train_btn_hint_infer_row": "切到「模型推理」页签并选中本检查点", "train_btn_hint_deploy": "属于部署模块,本期未做", "train_checkpoints_empty": "这个训练目录下没有 checkpoint。", "train_params_source": "来源:", "train_params_empty": "这个 checkpoint 没有 train_config.json,读不到训练参数。", "train_page_runs": "模型训练", "train_page_new": "新建训练", "train_page_inference": "模型推理", "train_new_live": "实时", "train_new_pending": "待接入", "train_new_model_tested": "已实测", "train_new_model_act_desc": "基于 Transformer 的动作分块模仿学习模型", "train_new_frames": "帧", "train_new_reset": "恢复实测默认值", "train_sec_dataset": "① 训练数据集", "train_sec_model": "② 选择模型", "train_sec_location": "③ 训练位置", "train_sec_params": "④ 训练参数", "train_sec_resume": "⑤ 从已有训练继续(可选)", "train_loc_local": "私有算力", "train_loc_local_desc": "本机显卡直连", "train_gpu_unavailable": "读不到 GPU", "train_gpu_unavailable_hint": "训练前请先修驱动 —— 驱动不可用时训练起不来。", "train_gpu_none": "nvidia-smi 没有报告任何 GPU。", "train_gpu_busy": "占用中", "train_gpu_idle": "空闲", "train_gpu_mem": "显存", "train_gpu_util": "GPU 利用率", "train_gpu_temp": "温度", "train_gpu_include": "参与训练", "train_framework": "训练框架", "train_framework_hint": "ACT 在 LeRobot 里只有一种实现,这里没有可选项。", "train_help_job_name": "这次训练的名字,会成为 checkpoint 的文件夹名 —— 取短一点、别重名。", "train_help_batch": "较大的批次可以提高训练稳定性,但需要更多显存;较小的批次训练更快但可能不稳定。建议范围 1-32。", "train_help_steps": "更多步数通常能提高模型性能,但可能导致过拟合。建议从 10000 开始,根据验证结果调整。", "train_help_seed": "设置固定种子可以复现相同的训练结果,便于调试和比较。建议用 1000、42 等固定值。", "train_help_workers": "更多工作进程可以加速数据加载,但会占用更多内存。建议设置为 CPU 核心数的 1/2 到 1 倍。", "train_help_eval_freq": "设置多少步进行一次模型评估,建议设为总步数的 10%。", "train_help_log_freq": "设置多少步刷新一次进度,建议 10 到 100 步。", "train_help_save_ckpt": "开启后会在训练过程中保存模型检查点,便于恢复训练或部署模型。", "train_help_save_freq": "设置多少步保存一次模型检查点,建议设为总步数的 30%。", "train_ready_title": "已达采集上限,可以导出了", "train_ready_go": "去导出", "train_dataset_none": "还没有导出的数据集。", "train_dataset_goto_export": "去导出已通过的集", "train_episodes": "集", "train_resume_none": "— 全新训练 —", "train_resume_latest": "— 最新 —", "train_resume_task": "源训练任务", "train_resume_step": "检查点", "train_no_output": "这次训练没有可展示的产物。", "train_no_root": "本机没有训练产物目录", "train_no_runs": "该目录下没有训练产物", "train_load_failed": "读取训练产物失败", "menu_profile": "个人资料", "menu_change_password": "修改密码", "menu_logout": "退出登录", "users_title": "用户管理", "users_subtitle": "管理账号、角色与账号生命周期。", "users_new": "新建用户", "users_total": "用户总数", "users_active": "活跃用户", "users_disabled_expired": "已禁用 / 已过期", "status_active": "正常", "status_expired": "已过期", "status_disabled": "已禁用", "users_disable_warning": "会临时禁止登录,但保留账号与数据,之后可再启用。", "users_all_roles": "全部角色", "users_all_status": "全部状态", "role_admin": "管理员", "role_engineer": "工程师", "role_reviewer": "审核员", "col_user": "用户", "col_role": "角色", "col_status": "状态", "col_last_login": "最近登录", "col_expires": "到期", "col_actions": "操作", "users_extend": "延期", "users_extend_hint": "修改到期时间以重新启用该账号", "users_disable": "禁用", "users_disable_hint": "临时禁止登录,之后可再启用", "users_enable": "启用", "users_enable_hint": "允许该用户重新登录", "users_edit": "编辑", "users_edit_hint": "编辑账号", "users_edit_user": "编辑用户", "users_save_changes": "保存修改", "users_create": "创建用户", "users_delete": "删除", "users_delete_hint": "永久删除该账号", "users_delete_warning": "将永久删除该账号。", "users_confirm_delete": "永久删除 %s?如果以后可能还要用这个账号,禁用更稳妥。", "users_role_perms": "角色权限", "users_perm_admin": "用户、项目、工作流、处理、审核与系统设置", "users_perm_engineer": "项目、工作流、处理与审核", "users_perm_reviewer": "查看数据、视频审核与标注审核", "field_username": "用户名", "field_email": "邮箱", "field_password": "密码", "field_expires_at": "到期时间", "users_pw_hint": "(至少 6 个字符)", "users_pw_keep": "(留空则保持原密码)", "users_optional": "(可选)", "users_no_found": "未找到用户", "users_no_email": "无邮箱", "users_never": "从未", "users_count": "%s 个用户", "preview_options": "预览选项", "video_sources": "视频源", "all": "全部", "hand_skeleton": "手部骨骼", "hand_trail": "手部轨迹", "frame_label": "帧:", "play": "播放", "select": "选择", "name_1_to_n": "命名 1→N", "name_n_to_1": "命名 N→1", "sort_label": "排序:", "n_selected": "已选 %s", "undo": "撤销", "new_export": "新建导出", "dataset_name": "数据集名称", "train_ratio": "训练集占比", "start_export": "开始导出", "dataset": "数据集", "progress": "进度", "created": "创建时间", "task_active": "进行中", "task_paused": "已暂停", "ai_status_segmenting": "切段中…", "ai_status_analyzing": "VLM 分析中…", "ai_status_writing": "写入…", "ai_status_exporting": "写入数据集…", "force_unit_mn": "力 mN", "force_field_title": "接触力场(固定全幅,不可缩放)", "slice_boundary_suspect": "边界可疑或标签未命中词表", "anno_ai_mode_title": "AI 自动切段并提案标注(模式由工作流 AI Annotation 卡片配置决定)", "overview_title": "概览", "load_failed_stats": "加载统计数据失败", "retry": "重试", "stat_reviewing": "待审核", "stat_approved": "已通过", "stat_failed": "异常", "stat_total": "全部", "stat_to_review": "待审核", "stat_distribution": "状态分布", "daily_uploads": "每日上传", "last_30_days": "(近 30 天)", "donut_total": "总计", "stat_processing": "处理中", "stat_received": "已接收", "cleaning_passed": "质检通过", "cleaning_failed": "质检未通过", "stat_anomaly": "异常", "recent_episodes": "最近 Episode", "view_all": "查看全部", "pipeline_status": "Pipeline 状态", "new_task": "新建任务", "edit_task": "编辑任务", "task_name": "任务名称", "task_name_hint": "请使用字母/数字/下划线/中文,需与上传文件前缀匹配", "task_description": "描述", "claimer": "认领人", "target_episodes": "目标条数", "target_duration": "目标时长(秒)", "fps": "帧率", "save": "保存", "cancel": "取消", "delete_task": "删除任务", "confirm_delete_task": "确定删除此任务吗?(已有采集数据将保留)", "episodes": "Episodes", "frames": "帧", "no_frame_target": "无帧数目标", "devices": "设备", "online": "在线", "offline": "离线", "unknown": "未知", "last_seen": "最近活跃", "device_empty": "暂无设备接入", "expand_episodes": "查看 Episodes", "load_more": "加载更多", "no_tasks": "暂无任务,点击\"新建任务\"创建第一个采集任务", "projects_title": "项目", "search_projects": "搜索项目...", "new_project": "新建项目", "edit_project": "编辑项目", "project_name": "项目名称", "bind_workflow": "绑定工作流", "workflow_placeholder": "— 选择工作流 —", "device_type": "设备类型", "status": "状态", "no_projects": "暂无项目,点击右上角「新建项目」创建", "tasks_count": "任务", "videos_count": "视频", "ep_count": "条", "upload_new": "新批次", "upload_reupload": "重传", "upload_total": "总上传", "upload_unclassified": "历史未分类", "target_unlimited": "不限", "no_tasks_in_project": "该项目下暂无任务(上传数据后自动归类)", "delete_project": "删除", "confirm_delete_project": "确定删除项目「", "confirm_delete_project_suffix": "」?项目下的任务/视频记录不会被删除。", "project_saved": "保存成功", "project_save_failed": "保存失败", "project_delete_failed": "删除失败", "project_load_failed": "加载失败", "unbound_workflow": "未绑定工作流", "workflow_edit": "编辑", "workflow_selected": "已选 %s 个工作流", "project_need_workflow": "项目设为 active 前必须先绑定至少一个工作流", "new_workflow_panel": "新建工作流", "new_workflow_prompt": "新工作流名称:", "workflow_create_failed": "创建工作流失败", "workflow_empty": "空", "template_badge": "模板", "project_saved_go_build": "项目已保存。是否前往工作流画布搭建/查看工作流?", "status_purged": "已彻底删除", "observed_inputs": "输入", "exceptions_badge": "异常", "exceptions": "异常", "exception_kind_mismatch": "输入不匹配", "exception_kind_missing": "设备数据缺失", "input_missing_title": "工作流设备数据不完整", "input_missing_detail": "以下设备缺失,本批次仅处理已上传设备:", "exception_kind_failed": "运行失败", "exception_delete": "删除异常", "exception_delete_failed": "删除异常失败", "anno_timeline": "标记时间轴", "slice_marker": "切片标记", "new_slice": "新建切片", "no_slices": "暂无切片标记", "no_slices_hint": "拖动时间轴后创建一个标记区间", "current_slice": "当前标记", "enter_slice_name": "请输入标记名称", "add_slice": "添加切片", "ai_annotate": "AI 标注", "unnamed_slice": "未命名切片", "slice_save_failed": "保存失败: ", "slice_delete_failed": "删除失败: ", "inf_sec_model": "① 选择模型", "inf_sec_data": "② 测试数据", "inf_sec_run": "③ 运行", "inf_sec_result": "④ 结果", "inf_label_run": "训练任务", "inf_label_step": "检查点", "inf_label_dataset": "测试集", "inf_live": "实时", "inf_pending": "待接入", "inf_no_params": "这个检查点没有 train_config.json,读不到训练参数。", "inf_params_from": "来源", "inf_no_models": "还没有训练好的模型", "inf_dataset_none": "— 选择测试集 —", "inf_datasets_available": "个数据集可选", "inf_no_datasets": "还没有导出的数据集 —— 先去审核页导出一份。", "inf_run_btn": "运行推理", "inf_run_disabled": "后端执行尚未接入", "inf_run_note": "后端执行还没接 —— 这个按钮是**故意禁用**的。", "inf_run_hint": "接上之后:用所选检查点在测试集上跑一遍,给出方向余弦、幅度比、夹爪 MAE 与误差曲线(eval_gui.py 那套指标)。", "inf_no_result": "还没有评估结果。" }, "en": { "app_title": "processor", "language": "Language", "video_review": "Video Review", "trash": "Trash", "all_status": "All Status", "reviewing": "Reviewing", "reviewed": "Reviewed", "all_tasks": "All Tasks", "search": "Search...", "loading": "Loading...", "processing": "Processing...", "ai_annotating": "AI annotation running...", "ai_annotating_hint": "This batch becomes viewable once AI annotation finishes", "no_data": "No data", "load_failed": "Load failed", "select_episode": "Select an episode to review →", "no_video": "No video data", "cameras": "Cameras", "play_all": "▶ Play All", "pause_all": "⏸ Pause All", "play_btn": "Play", "pause_btn": "Pause", "layout_row": "Row", "layout_grid": "Grid", "layout_column": "Stack", "no_description": "No description", "frame": "frames", "download": "Download", "export": "Export", "export_hint": "Download final dataset in workflow export format", "re_export": "Re-export", "re_exporting": "Re-exporting…", "re_export_done": "Re-export done", "re_export_failed": "Re-export failed", "delete": "Delete", "approve": "Approve", "deleted_msg": "Moved to trash", "select_hint": "Select an episode to view details", "trash_empty": "Trash is empty", "trash_title": "Trash", "purge_all": "Purge All", "restore": "Restore", "permanent_delete": "Delete", "days_left": "Remaining", "day_unit": "days", "confirm_trash": "Move to trash?\nAuto-cleaned after 7 days.", "confirm_permanent": "Permanently delete? This cannot be undone!", "confirm_purge": "Purge all trash? All items will be permanently deleted!", "op_failed": "Operation failed", "restore_failed": "Restore failed", "delete_failed": "Delete failed", "purge_failed": "Purge failed", "export_failed": "Export failed", "no_reviewed": "No reviewed episodes to export", "export_created": "Export job created; it will download when ready", "left_hand": "Left Hand", "right_hand": "Right Hand", "single_mono": "Single Camera", "glove_sensor": "Glove Sensors", "depth_image": "Depth Images", "aux_video": "Aux Video", "skeleton_suffix": "Skeleton", "glove_suffix": "Glove", "depth_suffix": "Depth", "stereo_pair": "Stereo Pair", "3d_skeleton": "3D Skeleton", "stereo_render": "3D Side-by-Side", "hand3d_no_data": "No 3D skeleton data for this frame", "hand3d_hand0": "Hand 0", "hand3d_hand1": "Hand 1", "hand3d_world": "3D Hand World", "heatmap_toggle": "Depth Heatmap", "synced_ok": "Synced", "drag_here": "Drag assets here", "remove_source": "Remove", "video_suffix": "Video", "hand_pressure": "Hand Pressure", "media_assets": "Assets", "drag_to_canvas": "Drag assets onto the video area", "raw_vs_processed": "Raw video / Processing results", "refresh": "Refresh", "not_found": "Not found", "deleted": "Deleted", "port_label": "Port", "annotation": "Annotation", "annotation_readonly": "Read only", "annotations": "Annotations", "new_annotation": "New Annotation", "edit_annotation": "Edit Annotation", "delete_annotation": "Delete Annotation", "label_name": "Label Name", "start_frame": "Start Frame", "end_frame": "End Frame", "set_start_frame": "Set Start", "set_end_frame": "Set End", "keyframe": "Keyframe", "add_keyframe": "Add Keyframe", "frames_covered": "frames labeled", "per_frame_label": "per-frame label", "no_annotations": "No annotations. Click \"+\" to create one.", "confirm_delete_anno": "Delete this annotation segment?", "save_annotation": "Save Annotation", "save_changes": "Save Changes", "slice_conflict": "This slice was changed on another computer. The latest version has been loaded.", "current_frame": "Current Frame", "anno_color": "Color", "anno_frame_range": "Frame Range", "anno_duration": "Duration", "anno_keyframe_event": "Keyframe Event", "seconds_abbr": "s", "select_all": "Select All", "batch_download": "Batch Download", "batch_export_dataset": "Export dataset (slow)", "batch_zip_download": "Zip download (fast)", "batch_zip_hint": "Carves the selected episodes out of the source dataset as-is — still a single LeRobot structure (data/ + meta/ + videos/), no rebuild, returns in seconds. Use this to just take the data away.", "batch_export_hint": "Merges the selected episodes into ONE trainable dataset (full rebuild: re-encode videos + recompute stats, ~30s/episode). Use this only for training.", "batch_selected_summary": "%s episodes · %f frames", "minutes_short": "min", "select_project_all": "Select all in this project (including collapsed)", "unreview": "Unreview", "retry_review": "Re-review", "reprocess": "Reprocess", "confirm_reprocess": "Re-run the bound workflows for this episode? New output will replace the old processing result.", "reprocess_failed": "Reprocess failed: ", "nav_home": "Home", "nav_tasks": "Projects", "nav_review": "Video Review", "nav_trash": "Trash", "nav_workflow": "Workflow", "nav_users": "Users", "nav_annotation": "Annotation", "nav_model": "Model", "train_tab_checkpoints": "Model Output", "train_tab_params": "Training Config", "train_label_model": "Model", "train_label_location": "Location", "train_files_unit": "files", "train_group_train": "Training", "train_group_policy": "Policy", "train_group_optimizer": "Optimizer", "train_group_dataset": "Dataset", "train_step_badge": "Step", "train_file_details": "File details", "train_col_name": "Name", "train_col_size": "Size", "train_col_mtime": "Modified", "train_btn_download": "Download", "train_btn_delete": "Delete", "train_btn_infer": "Inference", "train_btn_deploy": "Offline Deploy", "train_btn_hint_delete": "Deleting a checkpoint is destructive; not exposed yet", "train_btn_hint_download_row": "Expand the file list — each file downloads individually", "train_btn_hint_infer_row": "Open the Inference tab with this checkpoint selected", "train_btn_hint_deploy": "Belongs to the Deployment module, not built yet", "train_checkpoints_empty": "No checkpoints under this run.", "train_params_source": "Source:", "train_params_empty": "No train_config.json in this checkpoint; parameters unavailable.", "train_page_runs": "Model Training", "train_page_new": "New Training", "train_page_inference": "Model Inference", "train_new_live": "live", "train_new_pending": "not wired", "train_new_model_tested": "tested", "train_new_model_act_desc": "Transformer action-chunking imitation learning policy", "train_new_frames": "frames", "train_new_reset": "Restore measured defaults", "train_sec_dataset": "1. Training Dataset", "train_sec_model": "2. Model", "train_sec_location": "3. Training Location", "train_sec_params": "4. Training Parameters", "train_sec_resume": "5. Continue From a Previous Run (optional)", "train_loc_local": "Private Compute", "train_loc_local_desc": "GPUs on this machine", "train_gpu_unavailable": "Cannot read the GPUs", "train_gpu_unavailable_hint": "Fix the driver before training — training cannot start without it.", "train_gpu_none": "nvidia-smi reported no GPUs.", "train_gpu_busy": "busy", "train_gpu_idle": "idle", "train_gpu_mem": "VRAM", "train_gpu_util": "GPU util", "train_gpu_temp": "Temp", "train_gpu_include": "Use for training", "train_framework": "Training framework", "train_framework_hint": "ACT ships as a single LeRobot implementation, so there is nothing to choose here.", "train_help_job_name": "Name of this run. It becomes the checkpoint folder name, so keep it short and unique.", "train_help_batch": "Larger batches train more stably but need more VRAM; smaller ones are faster but less stable. Suggested 1-32.", "train_help_steps": "More steps usually improve the policy but risk overfitting. Start at 10000 and adjust from validation.", "train_help_seed": "A fixed seed reproduces the same run, which makes debugging and comparison possible. 1000 or 42.", "train_help_workers": "More workers load data faster but use more memory. About 1/2 to 1x the CPU core count.", "train_help_eval_freq": "How often to run an evaluation, in steps. About 10% of total steps.", "train_help_log_freq": "How often to refresh progress, in steps. 10-100 works well.", "train_help_save_ckpt": "Save checkpoints while training so a run can be resumed or deployed.", "train_help_save_freq": "How often to save a checkpoint, in steps. About 30% of total steps.", "train_ready_title": "Collection limit reached — ready to export", "train_ready_go": "Go export", "train_dataset_none": "No exported dataset yet.", "train_dataset_goto_export": "Go export approved episodes", "train_episodes": "episodes", "train_resume_none": "— Start fresh —", "train_resume_latest": "— latest —", "train_resume_task": "Source run", "train_resume_step": "Checkpoint", "train_no_output": "This run has no artifacts to show.", "train_no_root": "No training output directory on this host", "train_no_runs": "No training output under this directory", "train_load_failed": "Failed to load training output", "menu_profile": "Profile", "menu_change_password": "Change Password", "menu_logout": "Logout", "users_title": "User management", "users_subtitle": "Manage accounts, roles and account lifecycle.", "users_new": "New user", "users_total": "Total users", "users_active": "Active users", "users_disabled_expired": "Disabled / expired", "status_active": "Active", "status_expired": "Expired", "status_disabled": "Disabled", "users_disable_warning": "blocks login temporarily and keeps the account/data; it can be enabled later.", "users_all_roles": "All roles", "users_all_status": "All status", "role_admin": "Admin", "role_engineer": "Engineer", "role_reviewer": "Reviewer", "col_user": "User", "col_role": "Role", "col_status": "Status", "col_last_login": "Last login", "col_expires": "Expires", "col_actions": "Actions", "users_extend": "Extend", "users_extend_hint": "Edit the expiry date to reactivate this account", "users_disable": "Disable", "users_disable_hint": "Block login temporarily; can be enabled later", "users_enable": "Enable", "users_enable_hint": "Allow this user to log in again", "users_edit": "Edit", "users_edit_hint": "Edit account", "users_edit_user": "Edit user", "users_save_changes": "Save changes", "users_create": "Create user", "users_delete": "Delete", "users_delete_hint": "Permanently delete this account", "users_delete_warning": "permanently removes the account.", "users_confirm_delete": "Permanently delete %s? Disable is safer if you may need the account later.", "users_role_perms": "Role permissions", "users_perm_admin": "Users, projects, workflows, processing, review and system settings", "users_perm_engineer": "Projects, workflows, processing and review", "users_perm_reviewer": "View data, video review and annotation review", "field_username": "Username", "field_email": "Email", "field_password": "Password", "field_expires_at": "Expires at", "users_pw_hint": "(at least 6 characters)", "users_pw_keep": "(leave blank to keep current password)", "users_optional": "(optional)", "users_no_found": "No users found", "users_no_email": "No email", "users_never": "Never", "users_count": "%s users", "preview_options": "Preview Options", "video_sources": "Video Sources", "all": "All", "hand_skeleton": "Hand Skeleton", "hand_trail": "Hand Trail", "frame_label": "Frame:", "play": "Play", "select": "Select", "name_1_to_n": "Name 1→N", "name_n_to_1": "Name N→1", "sort_label": "Sort: ", "n_selected": "%s selected", "undo": "Undo", "new_export": "New Export", "dataset_name": "Dataset Name", "train_ratio": "Train Ratio", "start_export": "Start Export", "dataset": "Dataset", "progress": "Progress", "created": "Created", "task_active": "active", "task_paused": "paused", "ai_status_segmenting": "Segmenting…", "ai_status_analyzing": "Analyzing (VLM)…", "ai_status_writing": "Writing…", "ai_status_exporting": "Writing dataset…", "force_unit_mn": "Force (mN)", "force_field_title": "Contact force field (fixed full frame, not zoomable)", "slice_boundary_suspect": "Suspicious boundary or label not in vocabulary", "anno_ai_mode_title": "AI auto-segments and proposes annotations (mode is configured on the workflow AI Annotation card)", "overview_title": "Overview", "load_failed_stats": "Failed to load statistics", "retry": "Retry", "stat_reviewing": "Reviewing", "stat_approved": "Approved", "stat_failed": "Failed", "stat_total": "All Episodes", "stat_to_review": "To Review", "stat_distribution": "Status Distribution", "daily_uploads": "Daily Uploads", "last_30_days": "(last 30 days)", "donut_total": "Total", "stat_processing": "Processing", "stat_received": "Received", "cleaning_passed": "Cleaning passed", "cleaning_failed": "Cleaning failed", "stat_anomaly": "Anomaly", "recent_episodes": "Recent Episodes", "view_all": "View All", "pipeline_status": "Pipeline Status", "new_task": "New Task", "edit_task": "Edit Task", "task_name": "Task Name", "task_name_hint": "Letters/digits/underscore/Chinese; must match zip filename prefix", "task_description": "Description", "claimer": "Claimer", "target_episodes": "Target Episodes", "target_duration": "Target Duration (s)", "fps": "FPS", "save": "Save", "cancel": "Cancel", "delete_task": "Delete Task", "confirm_delete_task": "Delete this task? (Existing episodes will be kept)", "episodes": "Episodes", "frames": "Frames", "no_frame_target": "No frame target", "devices": "Devices", "online": "Online", "offline": "Offline", "unknown": "Unknown", "last_seen": "Last Seen", "device_empty": "No devices connected", "expand_episodes": "View Episodes", "load_more": "Load More", "no_tasks": "No tasks yet. Click \"New Task\" to create one.", "projects_title": "Projects", "search_projects": "Search projects...", "new_project": "New Project", "edit_project": "Edit Project", "project_name": "Project Name", "bind_workflow": "Workflow", "workflow_placeholder": "— Select workflow —", "device_type": "Device Type", "status": "Status", "no_projects": "No projects yet. Click \"New Project\" to create one.", "tasks_count": "tasks", "videos_count": "videos", "ep_count": "episodes", "upload_new": "new batches", "upload_reupload": "reuploads", "upload_total": "total uploads", "upload_unclassified": "legacy unclassified", "target_unlimited": "unlimited", "no_tasks_in_project": "No tasks under this project (uploads are grouped automatically).", "delete_project": "Delete", "confirm_delete_project": "Delete project \"", "confirm_delete_project_suffix": "\"? Task/episode records are kept.", "project_saved": "Saved", "project_save_failed": "Save failed", "project_delete_failed": "Delete failed", "project_load_failed": "Load failed", "unbound_workflow": "No workflow bound", "workflow_edit": "Edit", "workflow_selected": "%s workflows selected", "project_need_workflow": "Bind at least one workflow before activating this project", "new_workflow_panel": "+ New Workflow", "new_workflow_prompt": "Name for the new workflow:", "workflow_create_failed": "Failed to create workflow", "workflow_empty": "empty", "template_badge": "Template", "project_saved_go_build": "Project saved. Go to Workflow Studio to build/view the workflow?", "status_purged": "Purged", "observed_inputs": "Inputs", "exceptions_badge": "exceptions", "exceptions": "Exceptions", "exception_kind_mismatch": "Input mismatch", "exception_kind_missing": "Missing device data", "input_missing_title": "Workflow inputs are incomplete", "input_missing_detail": "The following devices are missing; only uploaded devices were processed:", "exception_kind_failed": "Run failed", "exception_delete": "Remove exception", "exception_delete_failed": "Failed to remove exception", "anno_timeline": "Annotation Timeline", "slice_marker": "Slice Markers", "new_slice": "New Slice", "no_slices": "No slices yet", "no_slices_hint": "Drag the timeline to create a marker range", "current_slice": "Current Slice", "enter_slice_name": "Enter a slice name", "add_slice": "Add Slice", "ai_annotate": "AI Annotate", "unnamed_slice": "Untitled slice", "slice_save_failed": "Save failed: ", "slice_delete_failed": "Delete failed: ", "inf_sec_model": "1. Model", "inf_sec_data": "2. Test Data", "inf_sec_run": "3. Run", "inf_sec_result": "4. Results", "inf_label_run": "Run", "inf_label_step": "Checkpoint", "inf_label_dataset": "Test dataset", "inf_live": "live", "inf_pending": "not wired", "inf_no_params": "This checkpoint has no train_config.json; parameters unavailable.", "inf_params_from": "From", "inf_no_models": "No trained model yet", "inf_dataset_none": "— Select a test dataset —", "inf_datasets_available": "dataset(s) available", "inf_no_datasets": "No exported dataset yet — export one from the review page first.", "inf_run_btn": "Run inference", "inf_run_disabled": "Backend execution is not wired up yet", "inf_run_note": "Backend execution is not connected yet — this button is intentionally disabled.", "inf_run_hint": "Once wired: runs the checkpoint over the test set and reports direction cosine, amplitude ratio, gripper MAE and the error curve.", "inf_no_result": "No evaluation result yet." } };