export const en = { // App.js "app.title": "DroneCAN Web Tools", "app.bus": "Bus {n}", "app.dna": "DNA", "app.adapter": "Adapter", "app.connected": "Successfully connected to device", "app.disconnected": "Disconnected from device", "app.bus_switched": "Switched to CAN bus {bus}", "app.dna_stopped": "DNA server stopped", "app.dna_started": "DNA server started", "app.dna_failed": "Failed to start DNA server", // ConnectionSettingsModal.js "conn.title": "Adapter Settings", "conn.connected_serial_slcan": "Connected via serial (SLCAN)", "conn.connected_serial_mavlink": "Connected via serial (MAVLink)", "conn.connected_ws": "Connected via {type}", "conn.serial_section": "Serial Connection", "conn.port": "Port", "conn.no_ports": "No ports available", "conn.baud_rate": "Baud Rate", "conn.serial_protocol": "Serial Protocol", "conn.protocol_mavlink": "MAVLink tunnel", "conn.protocol_slcan": "SLCAN / LAWICEL", "conn.refresh": "Refresh", "conn.request": "Request", "conn.disconnect": "Disconnect", "conn.connecting": "Connecting...", "conn.connect": "Connect", "conn.ws_section": "WebSocket Connection", "conn.host": "Host/IP Address", "conn.ws_port": "Port", "conn.node_id": "Node ID", "conn.signing": "Mavlink Signing", "conn.secret_key": "Secret Key", "conn.show_secret": "Show secret", "conn.hide_secret": "Hide secret", "conn.serial_closed": "Serial connection closed", "conn.serial_slcan_ok": "Serial SLCAN connection established", "conn.serial_mavlink_ok": "Serial MAVLink connection established", "conn.serial_failed": "Serial connection failed: {error}", "conn.could_not_connect": "Could not connect to port", "conn.serial_error": "Serial error: {error}", "conn.unknown_error": "Unknown error", "conn.ws_closed": "WebSocket connection closed", "conn.ws_connected": "WebSocket connection established", "conn.ws_failed": "Connection failed", "conn.ws_failed_detail": "Connection failed: {error}", "conn.ws_error": "WebSocket error: {error}", "conn.ip_required": "IP address is required", "conn.ip_invalid_parts": "Each part must be a number between 0-255", "conn.ip_invalid": "Invalid IP address or hostname", "conn.port_required": "Port is required", "conn.port_range": "Port must be between 1-65535", "conn.node_id_range": "Node ID must be between 1-127", "conn.no_port_selected": "No port selected", "conn.serial_port": "Serial Port", // NodeParam.js "param.title": "Parameters", "param.fetching": "Fetching...", "param.fetch_all": "Fetch All", "param.store_all": "Store All", "param.erase_all": "Erase All", "param.download": "Download", "param.load": "Load", "param.col_idx": "Idx", "param.col_name": "Name", "param.col_type": "Type", "param.col_value": "Value", "param.col_default": "Default", "param.col_min": "Min", "param.col_max": "Max", "param.edit_param": "Edit Parameter", "param.true": "True", "param.false": "False", "param.disabled": "Disabled", "param.enabled": "Enabled", // EditParamModal.js "edit.title": "Edit Parameter", "edit.param_name": "Parameter Name", "edit.unknown": "Unknown", "edit.string_value": "String Value", "edit.enable_disable": "Enable/Disable:", "edit.new_value": "New Value", "edit.value_range": "Value must be between {min} and {max}", "edit.current_value": "Current Value", "edit.current_rtttl": "Current RTTTL", "edit.default_value": "Default Value", "edit.min_value": "Min Value", "edit.max_value": "Max Value", "edit.error_parsing_melody": "Error parsing melody data", "edit.select_preset": "Select Preset Tune", "edit.choose_preset": "Choose a preset tune", "edit.apply": "Apply", "edit.rtttl_tune": "RTTTL Tune", "edit.rtttl_placeholder": "Format: name:d=duration,o=octave,b=bpm:notes", "edit.stop_tune": "Stop tune", "edit.play_tune": "Play tune", "edit.rtttl_instruction": "Enter RTTTL format tune or select a preset", "edit.rtttl_guide_title": "RTTTL Format Guide", "edit.rtttl_guide_duration": "d=duration (1=whole, 2=half, 4=quarter, 8=eighth, 16=16th note)", "edit.rtttl_guide_octave": "o=octave (4-7 where 5 is default)", "edit.rtttl_guide_tempo": "b=tempo (beats per minute)", "edit.rtttl_guide_notes": "Notes are: c, c#, d, d#, e, f, f#, g, g#, a, a#, b or h", "edit.rtttl_guide_example": "Example: Beep:d=4,o=5,b=120:c", "edit.rtttl_warning": "Warning: Invalid RTTTL format! Using a default empty tune instead.", "edit.rtttl_invalid": "Invalid RTTTL format! Format should be: name:defaults:notes", "edit.error_saving": "Error saving tune: {error}", "edit.error_playing": "Error playing tune: {error}", "edit.cancel": "Cancel", "edit.save": "Save", "edit.true": "True", "edit.false": "False", // BusMonitor.js "bus.title": "Bus Monitor", "bus.auto_scroll": "Auto Scroll", "bus.export": "Export", "bus.col_dir": "Dir", "bus.col_time": "Time", "bus.col_can_id": "CAN ID", "bus.col_hex_data": "Hex Data", "bus.col_src": "Src", "bus.col_dst": "Dst", "bus.col_data_type": "Data Type", "bus.showing": "Showing {count} of max {max} transfers", "bus.paused": "PAUSED", "bus.message_details": "Message Details", "bus.close": "Close", "bus.broadcast": "Broadcast", "bus.no_payload": "No detailed payload data available for this transfer.", "bus.details_heading": "### Message details", "bus.payload_heading": "### Message Payload", "bus.detail_direction": "Direction:", "bus.detail_time": "Time:", "bus.detail_can_id": "CAN ID:", "bus.detail_source": "Source Node:", "bus.detail_dest": "Destination Node:", "bus.detail_data_type": "Data Type:", "bus.detail_hex_data": "Hex Data:", "bus.csv_direction": "Direction", "bus.csv_timestamp": "Timestamp", "bus.csv_can_id": "CAN ID (Hex)", "bus.csv_hex_data": "Hex Data", "bus.csv_src": "Src Node ID", "bus.csv_dst": "Dst Node ID", "bus.csv_data_type": "Data Type", "bus.csv_raw": "Raw Data", // SubscriberWindow.js "sub.not_allowed": "Not Allowed To Open Directly", "sub.rx": "RX:", "sub.rates": "Rates(Hz):", "sub.max": "Max:", "sub.all": "All", // EscPanel.js "esc.channels": "Channels:", "esc.remove_propellers": "REMOVE PROPELLERS!", "esc.send_safety": "Send Safety", "esc.send_arming": "Send Arming", "esc.broadcast_rate": "Broadcast Rate:", "esc.index": "Index:", "esc.error": "Err:", "esc.temp": "Temp:", "esc.volt": "Volt:", "esc.curr": "Curr:", "esc.rpm": "RPM:", "esc.rat": "RAT:", "esc.nc": "NC", "esc.stop": "Stop", "esc.cmd": "cmd:", "esc.stop_all": "Stop All", // ActuatorPanel.js "act.ids": "Actuator IDs ({count})", "act.range_settings": "Range Settings", "act.broadcast_rate": "Broadcast Rate:", "act.select_ids_title": "Select Actuator IDs", "act.select_ids_label": "Select Actuator IDs:", "act.done": "Done", "act.range_title": "Command Type Range Settings", "act.range_instruction": "Configure default ranges for each command type. These settings can be applied to all actuators.", "act.unitless_fixed": "Unitless command range is fixed at -1 to 1", "act.min": "Min", "act.max": "Max", "act.apply": "Apply", "act.apply_all": "Apply All Ranges", "act.close": "Close", "act.id": "ID:", "act.pos": "Pos:", "act.force": "Force:", "act.speed": "Speed:", "act.rat": "RAT:", "act.nc": "NC", "act.unknown": "unknown", "act.type_unitless": "Unitless", "act.type_position": "Position", "act.type_force": "Force", "act.type_speed": "Speed", "act.type_unitless_label": "Unitless [-1, 1]", "act.type_position_label": "Position (m/rad)", "act.type_force_label": "Force (N/Nm)", "act.type_speed_label": "Speed (m/s, rad/s)", "act.zero": "Zero", "act.cmd": "cmd:", "act.zero_all": "Zero All", // DnaServerModal.js "dna.title": "Dynamic Node ID Allocation Server", "dna.active": "Server Active", "dna.control": "Server Control", "dna.processing": "Processing...", "dna.stop": "Stop", "dna.start": "Start", "dna.min_node_id": "Min Node ID", "dna.must_lt_max": "Must be < Max", "dna.max_node_id": "Max Node ID", "dna.must_gt_min": "Must be > Min", "dna.persist": "Persist Allocations", "dna.persist_tooltip": "When enabled, node ID allocations are stored and restored when the server restarts", "dna.allocated": "Allocated Node IDs ({count})", "dna.no_allocations": "No node IDs allocated", "dna.col_nid": "NID", "dna.col_uuid": "UUID", "dna.col_action": "Action", "dna.refresh_tooltip": "Refresh allocation list", "dna.started": "DNA server started successfully", "dna.failed_start": "Failed to start DNA server", "dna.stopped": "DNA server stopped", "dna.revoked": "Node ID {id} allocation revoked", "dna.revoke_failed": "Failed to revoke allocation for node ID {id}", "dna.refreshed": "Allocations refreshed", "dna.error": "Error: {error}", "dna.invalid_range": "Min ID must be less than Max ID", // NodeProperties.js "props.title": "Node Properties", "props.multi_editor": "Multi Node Editor", "props.node_id": "Node ID", "props.name": "Name", "props.mode": "Mode", "props.health": "Health", "props.uptime": "Uptime", "props.vendor_code": "Vendor Specific Status Code", "props.sw_version": "Software Version", "props.crc64": "CRC64", "props.vcs_commit": "VCS Commit", "props.hw_version": "Hardware Version", "props.uid": "UID", "props.certificate": "Cert. of authenticity", "props.controls": "Node Controls", "props.restart": "Restart", "props.transport_stats": "Get Transport Stats", "props.update_firmware": "Update Firmware", // NodeLogs.js "logs.title": "Logs", "logs.col_nid": "NID", "logs.col_time": "Time", "logs.col_level": "Level", "logs.col_source": "Source", "logs.col_text": "Text", // ToolsMenu.js "tools.title": "Tools", "tools.subscriber": "Subscriber", "tools.bus_monitor": "Bus Monitor", // PanelsMenu.js "panels.title": "Panels", "panels.esc": "ESC", "panels.actuator": "Actuator", // ConfirmRestartModal.js "confirm.title": "Confirm Restart", "confirm.message": "Are you sure you want to restart the node?", "confirm.cancel": "Cancel", "confirm.confirm": "Confirm", // FirmwareUpdateModal.js "fw.title": "Firmware Update", "fw.select_hint": "Please select the firmware file (.bin|.hex) to upload to node {id}.", "fw.select_file": "Select Firmware File", "fw.selected_file": "Selected File: {name} ({size} bytes)", "fw.invalid_file": "Invalid file type. Please select a .bin or .hex firmware file.", "fw.load_failed": "Failed to load firmware file", "fw.starting": "Starting firmware update...", "fw.updating": "Updating firmware: {progress}% ({offset}/{total} bytes)", "fw.success": "Firmware update completed successfully!", "fw.update_failed": "Update failed: code: {code} {message}", "fw.start_failed": "Failed to start update: {error}", "fw.node_unavailable": "Local node not available", "fw.error_occurred": "An error occurred during the update.", "fw.cancel": "Cancel", "fw.update": "Update", "fw.updating_ellipsis": "Updating...", "fw.close": "Close", }; export const zh = { // App.js "app.title": "DroneCAN Web Tools", "app.bus": "总线 {n}", "app.dna": "DNA", "app.adapter": "适配器", "app.connected": "设备连接成功", "app.disconnected": "设备已断开", "app.bus_switched": "已切换到 CAN 总线 {bus}", "app.dna_stopped": "DNA 服务器已停止", "app.dna_started": "DNA 服务器已启动", "app.dna_failed": "DNA 服务器启动失败", // ConnectionSettingsModal.js "conn.title": "适配器设置", "conn.connected_serial_slcan": "已通过串口连接 (SLCAN)", "conn.connected_serial_mavlink": "已通过串口连接 (MAVLink)", "conn.connected_ws": "已通过 {type} 连接", "conn.serial_section": "串口连接", "conn.port": "端口", "conn.no_ports": "无可用端口", "conn.baud_rate": "波特率", "conn.serial_protocol": "串口协议", "conn.protocol_mavlink": "MAVLink 隧道", "conn.protocol_slcan": "SLCAN / LAWICEL", "conn.refresh": "刷新", "conn.request": "请求", "conn.disconnect": "断开", "conn.connecting": "连接中...", "conn.connect": "连接", "conn.ws_section": "WebSocket 连接", "conn.host": "主机/IP 地址", "conn.ws_port": "端口", "conn.node_id": "节点 ID", "conn.signing": "MAVLink 签名", "conn.secret_key": "密钥", "conn.show_secret": "显示密钥", "conn.hide_secret": "隐藏密钥", "conn.serial_closed": "串口连接已关闭", "conn.serial_slcan_ok": "SLCAN 串口连接已建立", "conn.serial_mavlink_ok": "MAVLink 串口连接已建立", "conn.serial_failed": "串口连接失败: {error}", "conn.could_not_connect": "无法连接到端口", "conn.serial_error": "串口错误: {error}", "conn.unknown_error": "未知错误", "conn.ws_closed": "WebSocket 连接已关闭", "conn.ws_connected": "WebSocket 连接已建立", "conn.ws_failed": "连接失败", "conn.ws_failed_detail": "连接失败: {error}", "conn.ws_error": "WebSocket 错误: {error}", "conn.ip_required": "IP 地址为必填项", "conn.ip_invalid_parts": "每段必须是 0-255 之间的数字", "conn.ip_invalid": "无效的 IP 地址或主机名", "conn.port_required": "端口为必填项", "conn.port_range": "端口必须在 1-65535 之间", "conn.node_id_range": "节点 ID 必须在 1-127 之间", "conn.no_port_selected": "未选择端口", "conn.serial_port": "串口", // NodeParam.js "param.title": "参数", "param.fetching": "获取中...", "param.fetch_all": "获取全部", "param.store_all": "保存全部", "param.erase_all": "擦除全部", "param.download": "下载", "param.load": "加载", "param.col_idx": "索引", "param.col_name": "名称", "param.col_type": "类型", "param.col_value": "值", "param.col_default": "默认值", "param.col_min": "最小值", "param.col_max": "最大值", "param.edit_param": "编辑参数", "param.true": "是", "param.false": "否", "param.disabled": "禁用", "param.enabled": "启用", // EditParamModal.js "edit.title": "编辑参数", "edit.param_name": "参数名称", "edit.unknown": "未知", "edit.string_value": "字符串值", "edit.enable_disable": "启用/禁用:", "edit.new_value": "新值", "edit.value_range": "值必须在 {min} 和 {max} 之间", "edit.current_value": "当前值", "edit.current_rtttl": "当前 RTTTL", "edit.default_value": "默认值", "edit.min_value": "最小值", "edit.max_value": "最大值", "edit.error_parsing_melody": "解析旋律数据出错", "edit.select_preset": "选择预设铃声", "edit.choose_preset": "选择一个预设铃声", "edit.apply": "应用", "edit.rtttl_tune": "RTTTL 铃声", "edit.rtttl_placeholder": "格式: name:d=duration,o=octave,b=bpm:notes", "edit.stop_tune": "停止播放", "edit.play_tune": "播放铃声", "edit.rtttl_instruction": "输入 RTTTL 格式铃声或选择预设", "edit.rtttl_guide_title": "RTTTL 格式指南", "edit.rtttl_guide_duration": "d=时值 (1=全音符, 2=二分, 4=四分, 8=八分, 16=十六分音符)", "edit.rtttl_guide_octave": "o=八度 (4-7, 默认为 5)", "edit.rtttl_guide_tempo": "b=速度 (每分钟节拍数)", "edit.rtttl_guide_notes": "音符: c, c#, d, d#, e, f, f#, g, g#, a, a#, b 或 h", "edit.rtttl_guide_example": "示例: Beep:d=4,o=5,b=120:c", "edit.rtttl_warning": "警告: 无效的 RTTTL 格式! 使用默认空铃声代替。", "edit.rtttl_invalid": "无效的 RTTTL 格式! 格式应为: name:defaults:notes", "edit.error_saving": "保存铃声出错: {error}", "edit.error_playing": "播放铃声出错: {error}", "edit.cancel": "取消", "edit.save": "保存", "edit.true": "是", "edit.false": "否", // BusMonitor.js "bus.title": "总线监视器", "bus.auto_scroll": "自动滚动", "bus.export": "导出", "bus.col_dir": "方向", "bus.col_time": "时间", "bus.col_can_id": "CAN ID", "bus.col_hex_data": "十六进制数据", "bus.col_src": "源", "bus.col_dst": "目标", "bus.col_data_type": "数据类型", "bus.showing": "显示 {count} 条,最大 {max} 条", "bus.paused": "已暂停", "bus.message_details": "消息详情", "bus.close": "关闭", "bus.broadcast": "广播", "bus.no_payload": "该传输无详细负载数据。", "bus.details_heading": "### 消息详情", "bus.payload_heading": "### 消息负载", "bus.detail_direction": "方向:", "bus.detail_time": "时间:", "bus.detail_can_id": "CAN ID:", "bus.detail_source": "源节点:", "bus.detail_dest": "目标节点:", "bus.detail_data_type": "数据类型:", "bus.detail_hex_data": "十六进制数据:", "bus.csv_direction": "方向", "bus.csv_timestamp": "时间戳", "bus.csv_can_id": "CAN ID (十六进制)", "bus.csv_hex_data": "十六进制数据", "bus.csv_src": "源节点 ID", "bus.csv_dst": "目标节点 ID", "bus.csv_data_type": "数据类型", "bus.csv_raw": "原始数据", // SubscriberWindow.js "sub.not_allowed": "不允许直接打开", "sub.rx": "接收:", "sub.rates": "频率(Hz):", "sub.max": "最大:", "sub.all": "全部", // EscPanel.js "esc.channels": "通道数:", "esc.remove_propellers": "请拆除螺旋桨!", "esc.send_safety": "发送安全指令", "esc.send_arming": "发送解锁指令", "esc.broadcast_rate": "广播速率:", "esc.index": "索引:", "esc.error": "错误:", "esc.temp": "温度:", "esc.volt": "电压:", "esc.curr": "电流:", "esc.rpm": "转速:", "esc.rat": "功率:", "esc.nc": "无连接", "esc.stop": "停止", "esc.cmd": "指令:", "esc.stop_all": "全部停止", // ActuatorPanel.js "act.ids": "执行器 ID ({count})", "act.range_settings": "范围设置", "act.broadcast_rate": "广播速率:", "act.select_ids_title": "选择执行器 ID", "act.select_ids_label": "选择执行器 ID:", "act.done": "完成", "act.range_title": "指令类型范围设置", "act.range_instruction": "配置每种指令类型的默认范围。这些设置可以应用到所有执行器。", "act.unitless_fixed": "无量纲指令范围固定为 -1 到 1", "act.min": "最小值", "act.max": "最大值", "act.apply": "应用", "act.apply_all": "应用所有范围", "act.close": "关闭", "act.id": "ID:", "act.pos": "位置:", "act.force": "力:", "act.speed": "速度:", "act.rat": "功率:", "act.nc": "无连接", "act.unknown": "未知", "act.type_unitless": "无量纲", "act.type_position": "位置", "act.type_force": "力", "act.type_speed": "速度", "act.type_unitless_label": "无量纲 [-1, 1]", "act.type_position_label": "位置 (m/rad)", "act.type_force_label": "力 (N/Nm)", "act.type_speed_label": "速度 (m/s, rad/s)", "act.zero": "归零", "act.cmd": "指令:", "act.zero_all": "全部归零", // DnaServerModal.js "dna.title": "动态节点 ID 分配服务器", "dna.active": "服务器运行中", "dna.control": "服务器控制", "dna.processing": "处理中...", "dna.stop": "停止", "dna.start": "启动", "dna.min_node_id": "最小节点 ID", "dna.must_lt_max": "必须小于最大值", "dna.max_node_id": "最大节点 ID", "dna.must_gt_min": "必须大于最小值", "dna.persist": "持久化分配", "dna.persist_tooltip": "启用后,节点 ID 分配将被保存,服务器重启时自动恢复", "dna.allocated": "已分配节点 ID ({count})", "dna.no_allocations": "暂无已分配的节点 ID", "dna.col_nid": "节点ID", "dna.col_uuid": "UUID", "dna.col_action": "操作", "dna.refresh_tooltip": "刷新分配列表", "dna.started": "DNA 服务器启动成功", "dna.failed_start": "DNA 服务器启动失败", "dna.stopped": "DNA 服务器已停止", "dna.revoked": "节点 ID {id} 分配已撤销", "dna.revoke_failed": "撤销节点 ID {id} 分配失败", "dna.refreshed": "分配列表已刷新", "dna.error": "错误: {error}", "dna.invalid_range": "最小 ID 必须小于最大 ID", // NodeProperties.js "props.title": "节点属性", "props.multi_editor": "多节点编辑器", "props.node_id": "节点 ID", "props.name": "名称", "props.mode": "模式", "props.health": "健康状态", "props.uptime": "运行时间", "props.vendor_code": "供应商状态码", "props.sw_version": "软件版本", "props.crc64": "CRC64", "props.vcs_commit": "VCS 提交", "props.hw_version": "硬件版本", "props.uid": "UID", "props.certificate": "认证证书", "props.controls": "节点控制", "props.restart": "重启", "props.transport_stats": "获取传输统计", "props.update_firmware": "更新固件", // NodeLogs.js "logs.title": "日志", "logs.col_nid": "节点ID", "logs.col_time": "时间", "logs.col_level": "级别", "logs.col_source": "来源", "logs.col_text": "内容", // ToolsMenu.js "tools.title": "工具", "tools.subscriber": "订阅器", "tools.bus_monitor": "总线监视器", // PanelsMenu.js "panels.title": "面板", "panels.esc": "ESC", "panels.actuator": "执行器", // ConfirmRestartModal.js "confirm.title": "确认重启", "confirm.message": "确定要重启该节点吗?", "confirm.cancel": "取消", "confirm.confirm": "确认", // FirmwareUpdateModal.js "fw.title": "固件更新", "fw.select_hint": "请选择要上传到节点 {id} 的固件文件 (.bin|.hex)。", "fw.select_file": "选择固件文件", "fw.selected_file": "已选文件: {name} ({size} 字节)", "fw.invalid_file": "无效的文件类型。请选择 .bin 或 .hex 固件文件。", "fw.load_failed": "加载固件文件失败", "fw.starting": "正在开始固件更新...", "fw.updating": "正在更新固件: {progress}% ({offset}/{total} 字节)", "fw.success": "固件更新成功完成!", "fw.update_failed": "更新失败: 代码: {code} {message}", "fw.start_failed": "启动更新失败: {error}", "fw.node_unavailable": "本地节点不可用", "fw.error_occurred": "更新过程中发生错误。", "fw.cancel": "取消", "fw.update": "更新", "fw.updating_ellipsis": "更新中...", "fw.close": "关闭", };