From 86b11dbab426171a0e96bee92757eebcafe9a7d4 Mon Sep 17 00:00:00 2001 From: mmoo758 Date: Sat, 7 Mar 2026 12:37:59 +0800 Subject: [PATCH] =?UTF-8?q?change=2015#=20default=20chinese=E6=B1=89?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update app_zh-CHS.po 增加onroad翻译及修改 change default language 修改默认语言 增加coop翻译 bump 左侧菜单翻译 bump onroad alert 汉化 developui chinese bump bump Update app_zh-CHS.po Update app_zh-CHS.po Update app_zh-CHS.po Update app_zh-CHS.po Update app_zh-CHS.po --- common/params_keys.h | 2 +- selfdrive/selfdrived/events.py | 240 +-- .../sunnypilot/layouts/settings/settings.py | 32 +- .../steering_sub_layouts/mads_settings.py | 6 +- .../ui/sunnypilot/onroad/circular_alerts.py | 7 +- .../onroad/developer_ui/elements.py | 36 +- selfdrive/ui/translations/app_zh-CHS.po | 1651 ++++++++++++++++- sunnypilot/selfdrive/selfdrived/events.py | 50 +- 8 files changed, 1779 insertions(+), 245 deletions(-) diff --git a/common/params_keys.h b/common/params_keys.h index 88ec0958a..f50297423 100644 --- a/common/params_keys.h +++ b/common/params_keys.h @@ -66,7 +66,7 @@ inline static std::unordered_map keys = { {"IsTakingSnapshot", {CLEAR_ON_MANAGER_START, BOOL}}, {"IsTestedBranch", {CLEAR_ON_MANAGER_START, BOOL}}, {"JoystickDebugMode", {CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION, BOOL}}, - {"LanguageSetting", {PERSISTENT | BACKUP, STRING, "en"}}, + {"LanguageSetting", {PERSISTENT | BACKUP, STRING, "zh-CHS"}}, {"LastAthenaPingTime", {CLEAR_ON_MANAGER_START, INT}}, {"LastGPSPosition", {PERSISTENT, STRING}}, {"LastManagerExitReason", {CLEAR_ON_MANAGER_START, STRING}}, diff --git a/selfdrive/selfdrived/events.py b/selfdrive/selfdrived/events.py index 5e21f1cc3..2b9a10489 100755 --- a/selfdrive/selfdrived/events.py +++ b/selfdrive/selfdrived/events.py @@ -73,25 +73,25 @@ def startup_master_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubM if "REPLAY" in os.environ: branch = "replay" - return StartupAlert("WARNING: This branch is not tested", branch, alert_status=AlertStatus.userPrompt) + return StartupAlert("请注意路况,安全驾驶", branch, alert_status=AlertStatus.userPrompt) def below_engage_speed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: - return NoEntryAlert(f"Drive above {get_display_speed(CP.minEnableSpeed, metric)} to engage") + return NoEntryAlert(f"请保持 {get_display_speed(CP.minEnableSpeed, metric)} 以上速度行驶以启用辅助驾驶") def below_steer_speed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: return Alert( - f"Steer Assist Unavailable Below {get_display_speed(CP.minSteerSpeed, metric)}", + f" {get_display_speed(CP.minSteerSpeed, metric)} 以下速度行驶时无法自动转向", "", AlertStatus.userPrompt, AlertSize.small, Priority.LOW, VisualAlert.none, AudibleAlert.prompt, 0.4) def calibration_incomplete_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: - first_word = 'Recalibrating' if sm['liveCalibration'].calStatus == log.LiveCalibrationData.Status.recalibrating else 'Calibrating' + first_word = '重新校准' if sm['liveCalibration'].calStatus == log.LiveCalibrationData.Status.recalibrating else '自动校准' return Alert( - f"{first_word}: {sm['liveCalibration'].calPerc:.0f}%", - f"Drive Above {get_display_speed(MIN_SPEED_FILTER, metric)}", + f"{first_word} 进行中: {sm['liveCalibration'].calPerc:.0f}%", + f"请保持车速高于 {get_display_speed(MIN_SPEED_FILTER, metric)}", AlertStatus.normal, AlertSize.mid, Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2) @@ -99,7 +99,7 @@ def calibration_incomplete_alert(CP: car.CarParams, CS: car.CarState, sm: messag def audio_feedback_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: duration = FEEDBACK_MAX_DURATION - ((sm['audioFeedback'].blockNum + 1) * SAMPLE_BUFFER / SAMPLE_RATE) return NormalPermanentAlert( - "Recording Audio Feedback", + "语音反馈录制中…", f"{round(duration)} second{'s' if round(duration) != 1 else ''} remaining. Press again to save early.", priority=Priority.LOW) @@ -108,57 +108,57 @@ def audio_feedback_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubM def out_of_space_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: full_perc = round(100. - sm['deviceState'].freeSpacePercent) - return NormalPermanentAlert("Out of Storage", f"{full_perc}% full") + return NormalPermanentAlert("存储空间不足", f"{full_perc}% 已使用") def posenet_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: mdl = sm['modelV2'].velocity.x[0] if len(sm['modelV2'].velocity.x) else math.nan err = CS.vEgo - mdl - msg = f"Speed Error: {err:.1f} m/s" - return NoEntryAlert(msg, alert_text_1="Posenet Speed Invalid") + msg = f"车速异常: {err:.1f} m/s" + return NoEntryAlert(msg, alert_text_1="视觉测速失效") def process_not_running_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: not_running = [p.name for p in sm['managerState'].processes if not p.running and p.shouldBeRunning] msg = ', '.join(not_running) - return NoEntryAlert(msg, alert_text_1="Process Not Running") + return NoEntryAlert(msg, alert_text_1="进程未运行") def comm_issue_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: bs = [s for s in sm.data.keys() if not sm.all_checks([s, ])] msg = ', '.join(bs[:4]) # can't fit too many on one line - return NoEntryAlert(msg, alert_text_1="Communication Issue Between Processes") + return NoEntryAlert(msg, alert_text_1="进程通讯故障") def camera_malfunction_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: all_cams = ('roadCameraState', 'driverCameraState', 'wideRoadCameraState') bad_cams = [s.replace('State', '') for s in all_cams if s in sm.data.keys() and not sm.all_checks([s, ])] - return NormalPermanentAlert("Camera Malfunction", ', '.join(bad_cams)) + return NormalPermanentAlert("相机故障", ', '.join(bad_cams)) def calibration_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: rpy = sm['liveCalibration'].rpyCalib yaw = math.degrees(rpy[2] if len(rpy) == 3 else math.nan) pitch = math.degrees(rpy[1] if len(rpy) == 3 else math.nan) - angles = f"Remount Device (Pitch: {pitch:.1f}°, Yaw: {yaw:.1f}°)" - return NormalPermanentAlert("Calibration Invalid", angles) + angles = f"请调整设备安装 (Pitch: {pitch:.1f}°, Yaw: {yaw:.1f}°)" + return NormalPermanentAlert("校准出错", angles) def paramsd_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: if not sm['liveParameters'].angleOffsetValid: angle_offset_deg = sm['liveParameters'].angleOffsetDeg - title = "Steering misalignment detected" - text = f"Angle offset too high (Offset: {angle_offset_deg:.1f}°)" + title = "检测到转向系统未校准" + text = f"角度偏移过大 (偏移: {angle_offset_deg:.1f}°)" elif not sm['liveParameters'].steerRatioValid: steer_ratio = sm['liveParameters'].steerRatio - title = "Steer ratio mismatch" - text = f"Steering rack geometry may be off (Ratio: {steer_ratio:.1f})" + title = "转向比不匹配" + text = f"转向齿条位置可能异常 (比例: {steer_ratio:.1f})" elif not sm['liveParameters'].stiffnessFactorValid: stiffness_factor = sm['liveParameters'].stiffnessFactor - title = "Abnormal tire stiffness" - text = f"Check tires, pressure, or alignment (Factor: {stiffness_factor:.1f})" + title = "轮胎刚度异常" + text = f"请检查轮胎、胎压或四轮定位 (系数: {stiffness_factor:.1f})" else: - return NoEntryAlert("paramsd Temporary Error") + return NoEntryAlert("参数临时异常") return NoEntryAlert(alert_text_1=title, alert_text_2=text) @@ -166,16 +166,16 @@ def overheat_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, cpu = max(sm['deviceState'].cpuTempC, default=0.) gpu = max(sm['deviceState'].gpuTempC, default=0.) temp = max((cpu, gpu, sm['deviceState'].memoryTempC)) - return NormalPermanentAlert("System Overheated", f"{temp:.0f} °C") + return NormalPermanentAlert("系统运行过热", f"{temp:.0f} °C") def low_memory_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: - return NormalPermanentAlert("Low Memory", f"{sm['deviceState'].memoryUsagePercent}% used") + return NormalPermanentAlert("内存不足", f"{sm['deviceState'].memoryUsagePercent}% 已使用") def high_cpu_usage_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: x = max(sm['deviceState'].cpuUsagePercent, default=0.) - return NormalPermanentAlert("High CPU Usage", f"{x}% used") + return NormalPermanentAlert("CPU 占用率过高", f"{x}% 已使用") def modeld_lagging_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: @@ -201,18 +201,18 @@ def longitudinal_maneuver_alert(CP: car.CarParams, CS: car.CarState, sm: messagi def personality_changed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: personality = str(personality).title() - return NormalPermanentAlert(f"Driving Personality: {personality}", duration=1.5) + return NormalPermanentAlert(f"驾驶风格: {personality}", duration=1.5) def invalid_lkas_setting_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: - text = "Toggle stock LKAS on or off to engage" + text = "切换原厂车道保持辅助系统(LKAS)的开关以启用" if CP.brand == "tesla": - text = "Switch to Traffic-Aware Cruise Control to engage" + text = "切换到 主动巡航控制(TACC) 以启用" elif CP.brand == "mazda": - text = "Enable your car's LKAS to engage" + text = "启用车辆的LKAS系统以启用" elif CP.brand == "nissan": - text = "Disable your car's stock LKAS to engage" - return NormalPermanentAlert("Invalid LKAS setting", text) + text = "禁用原车的LKAS系统以启用" + return NormalPermanentAlert("LKAS设置无效", text) @@ -231,16 +231,16 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { EventName.longitudinalManeuver: { ET.WARNING: longitudinal_maneuver_alert, - ET.PERMANENT: NormalPermanentAlert("Longitudinal Maneuver Mode", - "Ensure road ahead is clear"), + ET.PERMANENT: NormalPermanentAlert("纵向操控模式", + "请确认前方道路畅通"), }, EventName.selfdriveInitializing: { - ET.NO_ENTRY: NoEntryAlert("System Initializing"), + ET.NO_ENTRY: NoEntryAlert("系统启动中"), }, EventName.startup: { - ET.PERMANENT: StartupAlert("Be ready to take over at any time") + ET.PERMANENT: StartupAlert("请随时准备接管") }, EventName.startupMaster: { @@ -248,28 +248,28 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { }, EventName.startupNoControl: { - ET.PERMANENT: StartupAlert("Dashcam mode"), - ET.NO_ENTRY: NoEntryAlert("Dashcam mode"), + ET.PERMANENT: StartupAlert("行车记录模式"), + ET.NO_ENTRY: NoEntryAlert("行车记录模式"), }, EventName.startupNoCar: { - ET.PERMANENT: StartupAlert("Dashcam mode for unsupported car"), + ET.PERMANENT: StartupAlert("车辆未识别"), }, EventName.startupNoSecOcKey: { - ET.PERMANENT: NormalPermanentAlert("Dashcam Mode", + ET.PERMANENT: NormalPermanentAlert("行车记录模式", "Security Key Not Available", priority=Priority.HIGH), }, EventName.dashcamMode: { - ET.PERMANENT: NormalPermanentAlert("Dashcam Mode", + ET.PERMANENT: NormalPermanentAlert("行车记录模式", priority=Priority.LOWEST), }, EventName.invalidLkasSetting: { ET.PERMANENT: invalid_lkas_setting_alert, - ET.NO_ENTRY: NoEntryAlert("Invalid LKAS setting"), + ET.NO_ENTRY: NoEntryAlert("车道保持辅助系统设置无效"), }, EventName.cruiseMismatch: { @@ -280,8 +280,8 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { # read-only mode. This can be solved by adding your fingerprint. # See https://github.com/commaai/openpilot/wiki/Fingerprinting for more information EventName.carUnrecognized: { - ET.PERMANENT: NormalPermanentAlert("Dashcam Mode", - "Car Unrecognized", + ET.PERMANENT: NormalPermanentAlert("行车记录模式", + "车辆未识别", priority=Priority.LOWEST), }, @@ -317,7 +317,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { EventName.ldw: { ET.PERMANENT: Alert( - "Lane Departure Detected", + "检测到车道偏离", "", AlertStatus.userPrompt, AlertSize.small, Priority.LOW, VisualAlert.ldw, AudibleAlert.prompt, 3.), @@ -327,7 +327,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { EventName.steerTempUnavailableSilent: { ET.WARNING: Alert( - "Steering Assist Temporarily Unavailable", + "自动转向暂不可用", "", AlertStatus.userPrompt, AlertSize.small, Priority.LOW, VisualAlert.steerRequired, AudibleAlert.prompt, 1.8), @@ -335,7 +335,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { EventName.preDriverDistracted: { ET.PERMANENT: Alert( - "Pay Attention", + "请注意!专心驾驶", "", AlertStatus.normal, AlertSize.none, Priority.LOW, VisualAlert.none, AudibleAlert.none, .1), @@ -343,23 +343,23 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { EventName.promptDriverDistracted: { ET.PERMANENT: Alert( - "Pay Attention", - "Driver Distracted", + "请注意!专心驾驶", + "驾驶员分心", AlertStatus.userPrompt, AlertSize.mid, Priority.MID, VisualAlert.steerRequired, AudibleAlert.promptDistracted, .1), }, EventName.driverDistracted: { ET.PERMANENT: Alert( - "DISENGAGE IMMEDIATELY", - "Driver Distracted", + "辅助驾驶正在解除", + "驾驶员分心", AlertStatus.critical, AlertSize.full, Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.warningImmediate, .1), }, EventName.preDriverUnresponsive: { ET.PERMANENT: Alert( - "Touch Steering Wheel: No Face Detected", + "请触碰方向盘: 未检测到面部", "", AlertStatus.normal, AlertSize.small, Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .1), @@ -367,31 +367,31 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { EventName.promptDriverUnresponsive: { ET.PERMANENT: Alert( - "Touch Steering Wheel", - "Driver Unresponsive", + "请触碰方向盘", + "驾驶员无反应", AlertStatus.userPrompt, AlertSize.mid, Priority.MID, VisualAlert.steerRequired, AudibleAlert.promptDistracted, .1), }, EventName.driverUnresponsive: { ET.PERMANENT: Alert( - "DISENGAGE IMMEDIATELY", - "Driver Unresponsive", + "辅助驾驶正在解除", + "驾驶员无反应", AlertStatus.critical, AlertSize.full, Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.warningImmediate, .1), }, EventName.manualRestart: { ET.WARNING: Alert( - "TAKE CONTROL", - "Resume Driving Manually", + "请接管车辆", + "辅助驾驶已停用", AlertStatus.userPrompt, AlertSize.mid, Priority.LOW, VisualAlert.none, AudibleAlert.none, .2), }, EventName.resumeRequired: { ET.WARNING: Alert( - "Press Resume to Exit Standstill", + "[ 踩油门 ] 退出刹车保持", "", AlertStatus.userPrompt, AlertSize.small, Priority.LOW, VisualAlert.none, AudibleAlert.none, .2), @@ -403,7 +403,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { EventName.preLaneChangeLeft: { ET.WARNING: Alert( - "Steer Left to Start Lane Change Once Safe", + "确认安全后左转开始变道", "", AlertStatus.normal, AlertSize.small, Priority.LOW, VisualAlert.none, AudibleAlert.none, .1), @@ -411,7 +411,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { EventName.preLaneChangeRight: { ET.WARNING: Alert( - "Steer Right to Start Lane Change Once Safe", + "确认安全后右转开始变道", "", AlertStatus.normal, AlertSize.small, Priority.LOW, VisualAlert.none, AudibleAlert.none, .1), @@ -419,7 +419,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { EventName.laneChangeBlocked: { ET.WARNING: Alert( - "Obstacle Detected in Blindspot", + "盲区检测到障碍", "", AlertStatus.userPrompt, AlertSize.small, Priority.LOW, VisualAlert.none, AudibleAlert.prompt, .1), @@ -427,7 +427,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { EventName.laneChange: { ET.WARNING: Alert( - "Changing Lanes", + "正在变道", "", AlertStatus.normal, AlertSize.small, Priority.LOW, VisualAlert.none, AudibleAlert.none, .1), @@ -435,22 +435,22 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { EventName.steerSaturated: { ET.WARNING: Alert( - "Take Control", - "Turn Exceeds Steering Limit", + "请接管车辆", + "超过转向限制", AlertStatus.userPrompt, AlertSize.mid, Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .1), }, # Thrown when the fan is driven at >50% but is not rotating EventName.fanMalfunction: { - ET.PERMANENT: NormalPermanentAlert("Fan Malfunction", "Likely Hardware Issue"), + ET.PERMANENT: NormalPermanentAlert("散热风扇故障", "这是硬件故障"), }, # Camera is not outputting frames EventName.cameraMalfunction: { ET.PERMANENT: camera_malfunction_alert, ET.SOFT_DISABLE: soft_disable_alert("Camera Malfunction"), - ET.NO_ENTRY: NoEntryAlert("Camera Malfunction: Reboot Your Device"), + ET.NO_ENTRY: NoEntryAlert("相机故障,请尝试重启设备"), }, # Camera framerate too low EventName.cameraFrameRate: { @@ -512,7 +512,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { EventName.brakeHold: { ET.WARNING: Alert( - "Press Resume to Exit Brake Hold", + "[ 踩油门 ] 退出刹车保持", "", AlertStatus.userPrompt, AlertSize.small, Priority.LOW, VisualAlert.none, AudibleAlert.none, .2), @@ -520,23 +520,23 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { EventName.parkBrake: { ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), - ET.NO_ENTRY: NoEntryAlert("Parking Brake Engaged"), + ET.NO_ENTRY: NoEntryAlert("正在使用驻车制动"), }, EventName.pedalPressed: { ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), - ET.NO_ENTRY: NoEntryAlert("Pedal Pressed", + ET.NO_ENTRY: NoEntryAlert("踏板被踩下", visual_alert=VisualAlert.brakePressed), }, EventName.steerDisengage: { ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), - ET.NO_ENTRY: NoEntryAlert("Steering Pressed"), + ET.NO_ENTRY: NoEntryAlert("转向干预已触发"), }, EventName.preEnableStandstill: { ET.PRE_ENABLE: Alert( - "Release Brake to Engage", + "松开刹车以启用", "", AlertStatus.normal, AlertSize.small, Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .1, creation_delay=1.), @@ -564,27 +564,27 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { }, EventName.resumeBlocked: { - ET.NO_ENTRY: NoEntryAlert("Press Set to Engage"), + ET.NO_ENTRY: NoEntryAlert("按下Set键以启用"), }, EventName.wrongCruiseMode: { ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), - ET.NO_ENTRY: NoEntryAlert("Adaptive Cruise Disabled"), + ET.NO_ENTRY: NoEntryAlert("自适应巡航已禁用"), }, EventName.steerTempUnavailable: { - ET.SOFT_DISABLE: soft_disable_alert("Steering Assist Temporarily Unavailable"), - ET.NO_ENTRY: NoEntryAlert("Steering Temporarily Unavailable"), + ET.SOFT_DISABLE: soft_disable_alert("自动转向不可用"), + ET.NO_ENTRY: NoEntryAlert("自动转向不可用"), }, EventName.steerTimeLimit: { - ET.SOFT_DISABLE: soft_disable_alert("Vehicle Steering Time Limit"), - ET.NO_ENTRY: NoEntryAlert("Vehicle Steering Time Limit"), + ET.SOFT_DISABLE: soft_disable_alert("转向时间限制"), + ET.NO_ENTRY: NoEntryAlert("转向时间限制"), }, EventName.outOfSpace: { ET.PERMANENT: out_of_space_alert, - ET.NO_ENTRY: NoEntryAlert("Out of Storage"), + ET.NO_ENTRY: NoEntryAlert("存储空间不足"), }, EventName.belowEngageSpeed: { @@ -605,23 +605,23 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { }, EventName.tooDistracted: { - ET.NO_ENTRY: NoEntryAlert("Distraction Level Too High"), + ET.NO_ENTRY: NoEntryAlert("分心程度过高"), }, EventName.excessiveActuation: { - ET.SOFT_DISABLE: soft_disable_alert("Excessive Actuation"), - ET.NO_ENTRY: NoEntryAlert("Excessive Actuation"), + ET.SOFT_DISABLE: soft_disable_alert("执行器过度动作"), + ET.NO_ENTRY: NoEntryAlert("执行器过度动作"), }, EventName.overheat: { ET.PERMANENT: overheat_alert, - ET.SOFT_DISABLE: soft_disable_alert("System Overheated"), - ET.NO_ENTRY: NoEntryAlert("System Overheated"), + ET.SOFT_DISABLE: soft_disable_alert("系统过热"), + ET.NO_ENTRY: NoEntryAlert("系统过热"), }, EventName.wrongGear: { ET.PERMANENT: Alert( - "Gear not D", + "请切换到D档", "", AlertStatus.normal, AlertSize.none, Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .1), @@ -634,25 +634,25 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { # See https://comma.ai/setup for more information EventName.calibrationInvalid: { ET.PERMANENT: calibration_invalid_alert, - ET.SOFT_DISABLE: soft_disable_alert("Calibration Invalid: Remount Device & Recalibrate"), - ET.NO_ENTRY: NoEntryAlert("Calibration Invalid: Remount Device & Recalibrate"), + ET.SOFT_DISABLE: soft_disable_alert("校准无效:请重新安装并校准设备"), + ET.NO_ENTRY: NoEntryAlert("校准无效:请重新安装并校准设备"), }, EventName.calibrationIncomplete: { ET.PERMANENT: calibration_incomplete_alert, - ET.SOFT_DISABLE: soft_disable_alert("Calibration Incomplete"), - ET.NO_ENTRY: NoEntryAlert("Calibration in Progress"), + ET.SOFT_DISABLE: soft_disable_alert("校准未完成"), + ET.NO_ENTRY: NoEntryAlert("正在校准"), }, EventName.calibrationRecalibrating: { ET.PERMANENT: calibration_incomplete_alert, - ET.SOFT_DISABLE: soft_disable_alert("Device Remount Detected: Recalibrating"), - ET.NO_ENTRY: NoEntryAlert("Remount Detected: Recalibrating"), + ET.SOFT_DISABLE: soft_disable_alert("检测到设备重新安装: 正在校准"), + ET.NO_ENTRY: NoEntryAlert("检测到设备重新安装: 正在校准"), }, EventName.doorOpen: { ET.PERMANENT: Alert( - "Door Open", + "车门未关好", "", AlertStatus.normal, AlertSize.none, Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .1), @@ -660,15 +660,15 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { EventName.seatbeltNotLatched: { ET.PERMANENT: Alert( - "Seatbelt Unlatched", + "请系好安全带", "", AlertStatus.normal, AlertSize.none, Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .1), }, EventName.espDisabled: { - ET.SOFT_DISABLE: soft_disable_alert("Electronic Stability Control Disabled"), - ET.NO_ENTRY: NoEntryAlert("Electronic Stability Control Disabled"), + ET.SOFT_DISABLE: soft_disable_alert("电子稳定控制系统已禁用"), + ET.NO_ENTRY: NoEntryAlert("电子稳定控制系统已禁用"), }, EventName.lowBattery: { @@ -681,7 +681,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { # is thrown. This can mean a service crashed, did not broadcast a message for # ten times the regular interval, or the average interval is more than 10% too high. EventName.commIssue: { - ET.SOFT_DISABLE: soft_disable_alert("Communication Issue Between Processes"), + ET.SOFT_DISABLE: soft_disable_alert("进程通信故障"), ET.NO_ENTRY: comm_issue_alert, }, EventName.commIssueAvgFreq: { @@ -697,7 +697,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { # Thrown when manager detects a service exited unexpectedly while driving EventName.processNotRunning: { ET.NO_ENTRY: process_not_running_alert, - ET.SOFT_DISABLE: soft_disable_alert("Process Not Running"), + ET.SOFT_DISABLE: soft_disable_alert("进程未运行"), }, EventName.radarFault: { @@ -732,30 +732,30 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { # When the localizer detects an acceleration of more than 40 m/s^2 (~4G) we # alert the driver the device might have fallen from the windshield. EventName.deviceFalling: { - ET.SOFT_DISABLE: soft_disable_alert("Device Fell Off Mount"), - ET.NO_ENTRY: NoEntryAlert("Device Fell Off Mount"), + ET.SOFT_DISABLE: soft_disable_alert("设备从支架脱落"), + ET.NO_ENTRY: NoEntryAlert("设备从支架脱落"), }, EventName.lowMemory: { - ET.SOFT_DISABLE: soft_disable_alert("Low Memory: Reboot Your Device"), + ET.SOFT_DISABLE: soft_disable_alert("内存不足: 请重启设备"), ET.PERMANENT: low_memory_alert, - ET.NO_ENTRY: NoEntryAlert("Low Memory: Reboot Your Device"), + ET.NO_ENTRY: NoEntryAlert("内存不足: 请重启设备"), }, EventName.accFaulted: { - ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Cruise Fault: Restart the Car"), - ET.PERMANENT: NormalPermanentAlert("Cruise Fault: Restart the car to engage"), - ET.NO_ENTRY: NoEntryAlert("Cruise Fault: Restart the Car"), + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("巡航故障: 请尝试重启车辆"), + ET.PERMANENT: NormalPermanentAlert("巡航故障: 请尝试重启车辆"), + ET.NO_ENTRY: NoEntryAlert("巡航故障: 请尝试重启车辆"), }, EventName.espActive: { - ET.SOFT_DISABLE: soft_disable_alert("Electronic Stability Control Active"), - ET.NO_ENTRY: NoEntryAlert("Electronic Stability Control Active"), + ET.SOFT_DISABLE: soft_disable_alert("电子稳定系统已激活"), + ET.NO_ENTRY: NoEntryAlert("电子稳定系统已激活"), }, EventName.controlsMismatch: { - ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Controls Mismatch"), - ET.NO_ENTRY: NoEntryAlert("Controls Mismatch"), + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("控制指令不一致"), + ET.NO_ENTRY: NoEntryAlert("控制指令不一致"), }, # Sometimes the USB stack on the device can get into a bad state @@ -771,23 +771,23 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { # - CAN data is received, but some message are not received at the right frequency # If you're not writing a new car port, this is usually cause by faulty wiring EventName.canError: { - ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Unknown Vehicle Variant"), + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("车型数据不匹配"), ET.PERMANENT: Alert( - "Unknown Vehicle Variant", + "车型数据不匹配", "", AlertStatus.normal, AlertSize.small, Priority.LOW, VisualAlert.none, AudibleAlert.none, 1., creation_delay=1.), - ET.NO_ENTRY: NoEntryAlert("Unknown Vehicle Variant"), + ET.NO_ENTRY: NoEntryAlert("车型数据不匹配"), }, EventName.canBusMissing: { ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("CAN Bus Disconnected"), ET.PERMANENT: Alert( - "CAN Bus Disconnected: Likely Faulty Cable", + "CAN Bus Disconnected: 请检查连接", "", AlertStatus.normal, AlertSize.small, Priority.LOW, VisualAlert.none, AudibleAlert.none, 1., creation_delay=1.), - ET.NO_ENTRY: NoEntryAlert("CAN Bus Disconnected: Check Connections"), + ET.NO_ENTRY: NoEntryAlert("CAN Bus Disconnected: 请检查连接"), }, EventName.steerUnavailable: { @@ -798,18 +798,18 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { EventName.reverseGear: { ET.PERMANENT: Alert( - "Reverse\nGear", + "倒车中\n请注意周围环境", "", AlertStatus.normal, AlertSize.full, Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2, creation_delay=0.5), - ET.USER_DISABLE: ImmediateDisableAlert("Reverse Gear"), - ET.NO_ENTRY: NoEntryAlert("Reverse Gear"), + ET.USER_DISABLE: ImmediateDisableAlert("倒车中"), + ET.NO_ENTRY: NoEntryAlert("倒车中"), }, # On cars that use stock ACC the car can decide to cancel ACC for various reasons. # When this happens we can no long control the car so the user needs to be warned immediately. EventName.cruiseDisabled: { - ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Cruise Is Off"), + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("巡航已关闭"), }, # When the relay in the harness box opens the CAN bus between the LKAS camera @@ -837,13 +837,13 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { "Model uncertain at this speed", AlertStatus.userPrompt, AlertSize.mid, Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.promptRepeat, 4.), - ET.NO_ENTRY: NoEntryAlert("Slow down to engage"), + ET.NO_ENTRY: NoEntryAlert("请减速以恢复辅助驾驶"), }, EventName.vehicleSensorsInvalid: { - ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Vehicle Sensors Invalid"), - ET.PERMANENT: NormalPermanentAlert("Vehicle Sensors Calibrating", "Drive to Calibrate"), - ET.NO_ENTRY: NoEntryAlert("Vehicle Sensors Calibrating"), + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("车辆传感器无效"), + ET.PERMANENT: NormalPermanentAlert("车辆传感器校准中", "请行驶以完成校准"), + ET.NO_ENTRY: NoEntryAlert("车辆传感器校准中"), }, EventName.personalityChanged: { diff --git a/selfdrive/ui/sunnypilot/layouts/settings/settings.py b/selfdrive/ui/sunnypilot/layouts/settings/settings.py index e379a7710..65b311f84 100644 --- a/selfdrive/ui/sunnypilot/layouts/settings/settings.py +++ b/selfdrive/ui/sunnypilot/layouts/settings/settings.py @@ -25,7 +25,7 @@ from openpilot.selfdrive.ui.sunnypilot.layouts.settings.trips import TripsLayout from openpilot.selfdrive.ui.sunnypilot.layouts.settings.vehicle import VehicleLayout from openpilot.selfdrive.ui.sunnypilot.layouts.settings.visuals import VisualsLayout from openpilot.system.ui.lib.application import gui_app, MousePos -from openpilot.system.ui.lib.multilang import tr_noop +from openpilot.system.ui.lib.multilang import tr, tr_noop from openpilot.system.ui.lib.text_measure import measure_text_cached from openpilot.system.ui.lib.wifi_manager import WifiManager from openpilot.system.ui.sunnypilot.lib.styles import style @@ -110,22 +110,22 @@ class SettingsLayoutSP(OP.SettingsLayout): wifi_manager.set_active(False) self._panels = { - OP.PanelType.DEVICE: PanelInfo(tr_noop("Device"), DeviceLayoutSP(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_home.png"), - OP.PanelType.NETWORK: PanelInfo(tr_noop("Network"), NetworkUISP(wifi_manager), icon="icons/network.png"), - OP.PanelType.SUNNYLINK: PanelInfo(tr_noop("sunnylink"), SunnylinkLayout(), icon="icons/wifi_strength_full.png"), - OP.PanelType.TOGGLES: PanelInfo(tr_noop("Toggles"), TogglesLayout(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_toggle.png"), - OP.PanelType.SOFTWARE: PanelInfo(tr_noop("Software"), SoftwareLayoutSP(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_software.png"), - OP.PanelType.MODELS: PanelInfo(tr_noop("Models"), ModelsLayout(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_models.png"), - OP.PanelType.STEERING: PanelInfo(tr_noop("Steering"), SteeringLayout(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_lateral.png"), - OP.PanelType.CRUISE: PanelInfo(tr_noop("Cruise"), CruiseLayout(), icon="icons/speed_limit.png"), - OP.PanelType.VISUALS: PanelInfo(tr_noop("Visuals"), VisualsLayout(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_visuals.png"), - OP.PanelType.DISPLAY: PanelInfo(tr_noop("Display"), DisplayLayout(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_display.png"), - OP.PanelType.OSM: PanelInfo(tr_noop("OSM"), OSMLayout(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_map.png"), + OP.PanelType.DEVICE: PanelInfo(tr("Device"), DeviceLayoutSP(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_home.png"), + OP.PanelType.NETWORK: PanelInfo(tr("Network"), NetworkUISP(wifi_manager), icon="icons/network.png"), + OP.PanelType.SUNNYLINK: PanelInfo(tr("sunnylink"), SunnylinkLayout(), icon="icons/wifi_strength_full.png"), + OP.PanelType.TOGGLES: PanelInfo(tr("Toggles"), TogglesLayout(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_toggle.png"), + OP.PanelType.SOFTWARE: PanelInfo(tr("Software"), SoftwareLayoutSP(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_software.png"), + OP.PanelType.MODELS: PanelInfo(tr("Models"), ModelsLayout(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_models.png"), + OP.PanelType.STEERING: PanelInfo(tr("Steering"), SteeringLayout(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_lateral.png"), + OP.PanelType.CRUISE: PanelInfo(tr("Cruise"), CruiseLayout(), icon="icons/speed_limit.png"), + OP.PanelType.VISUALS: PanelInfo(tr("Visuals"), VisualsLayout(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_visuals.png"), + OP.PanelType.DISPLAY: PanelInfo(tr("Display"), DisplayLayout(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_display.png"), + OP.PanelType.OSM: PanelInfo(tr("OSM"), OSMLayout(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_map.png"), # OP.PanelType.NAVIGATION: PanelInfo(tr_noop("Navigation"), NavigationLayout(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_map.png"), - OP.PanelType.TRIPS: PanelInfo(tr_noop("Trips"), TripsLayout(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_trips.png"), - OP.PanelType.VEHICLE: PanelInfo(tr_noop("Vehicle"), VehicleLayout(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_vehicle.png"), - OP.PanelType.FIREHOSE: PanelInfo(tr_noop("Firehose"), FirehoseLayout(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_firehose.png"), - OP.PanelType.DEVELOPER: PanelInfo(tr_noop("Developer"), DeveloperLayoutSP(), icon="icons/shell.png"), + OP.PanelType.TRIPS: PanelInfo(tr("Trips"), TripsLayout(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_trips.png"), + OP.PanelType.VEHICLE: PanelInfo(tr("Vehicle"), VehicleLayout(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_vehicle.png"), + OP.PanelType.FIREHOSE: PanelInfo(tr("Firehose"), FirehoseLayout(), icon="../../sunnypilot/selfdrive/assets/offroad/icon_firehose.png"), + OP.PanelType.DEVELOPER: PanelInfo(tr("Developer"), DeveloperLayoutSP(), icon="icons/shell.png"), } def _draw_sidebar(self, rect: rl.Rectangle): diff --git a/selfdrive/ui/sunnypilot/layouts/settings/steering_sub_layouts/mads_settings.py b/selfdrive/ui/sunnypilot/layouts/settings/steering_sub_layouts/mads_settings.py index 098fcf8ce..360bfaf0a 100644 --- a/selfdrive/ui/sunnypilot/layouts/settings/steering_sub_layouts/mads_settings.py +++ b/selfdrive/ui/sunnypilot/layouts/settings/steering_sub_layouts/mads_settings.py @@ -17,9 +17,9 @@ from openpilot.system.ui.widgets.scroller_tici import Scroller from openpilot.system.ui.sunnypilot.widgets.list_view import multiple_button_item_sp, toggle_item_sp MADS_STEERING_MODE_OPTIONS = [ - (tr("Remain Active"), tr_noop("Remain Active: ALC will remain active when the brake pedal is pressed.")), - (tr("Pause"), tr_noop("Pause: ALC will pause when the brake pedal is pressed.")), - (tr("Disengage"), tr_noop("Disengage: ALC will disengage when the brake pedal is pressed.")), + (tr("Remain Active"), tr("Remain Active: ALC will remain active when the brake pedal is pressed.")), + (tr("Pause"), tr("Pause: ALC will pause when the brake pedal is pressed.")), + (tr("Disengage"), tr("Disengage: ALC will disengage when the brake pedal is pressed.")), ] MADS_MAIN_CRUISE_BASE_DESC = tr("Note: For vehicles without LFA/LKAS button, disabling this will prevent lateral control engagement.") diff --git a/selfdrive/ui/sunnypilot/onroad/circular_alerts.py b/selfdrive/ui/sunnypilot/onroad/circular_alerts.py index 00b69e437..1683e07f8 100644 --- a/selfdrive/ui/sunnypilot/onroad/circular_alerts.py +++ b/selfdrive/ui/sunnypilot/onroad/circular_alerts.py @@ -11,6 +11,7 @@ from openpilot.selfdrive.ui import UI_BORDER_SIZE from openpilot.selfdrive.ui.ui_state import ui_state from openpilot.selfdrive.ui.sunnypilot.onroad.developer_ui import DeveloperUiState from openpilot.system.ui.lib.application import gui_app, FontWeight, FONT_SCALE +from openpilot.system.ui.lib.multilang import tr from openpilot.system.ui.lib.text_measure import measure_text_cached @@ -52,10 +53,10 @@ class CircularAlertsRenderer: self._e2e_alert_display_timer -= 1 if self._green_light_alert: - self._alert_text = "GREEN\nLIGHT" + self._alert_text = tr("GREEN\nLIGHT") self._alert_img = self._green_light_alert_img elif self._lead_depart_alert: - self._alert_text = "LEAD VEHICLE\nDEPARTING" + self._alert_text = tr("LEAD VEHICLE\nDEPARTING") self._alert_img = self._lead_depart_alert_img elif ui_state.standstill_timer and self._is_standstill: @@ -120,7 +121,7 @@ class CircularAlertsRenderer: if self._e2e_alert_display_timer == 0 and ui_state.standstill_timer and self._is_standstill: # Standstill Timer Text - alert_alt_text = "STOPPED" + alert_alt_text = tr("STOPPED") top_text_size = 80 measure_top = measure_text_cached(font, alert_alt_text, top_text_size, spacing) top_y = alert_rect.y + alert_rect.height / 3.5 diff --git a/selfdrive/ui/sunnypilot/onroad/developer_ui/elements.py b/selfdrive/ui/sunnypilot/onroad/developer_ui/elements.py index e58a326fb..ced12af0a 100644 --- a/selfdrive/ui/sunnypilot/onroad/developer_ui/elements.py +++ b/selfdrive/ui/sunnypilot/onroad/developer_ui/elements.py @@ -93,7 +93,7 @@ class RelDistElement(LeadInfoElement): lead_status, lead_d_rel, _ = self.get_lead_status(sm) value = f"{lead_d_rel:.0f}" if lead_status else "-" color = self.get_lead_color(lead_d_rel) if lead_status else rl.WHITE - return UiElement(value, "DIST.", self.unit, color) + return UiElement(value, "前车距离", self.unit, color) class RelSpeedElement(LeadInfoElement): @@ -109,7 +109,7 @@ class RelSpeedElement(LeadInfoElement): value = f"{lead_v_rel * conversion:.0f}" if lead_status else "-" color = self.get_lead_color(0, lead_v_rel, use_v_rel=True) if lead_status else rl.WHITE - return UiElement(value, "REL SPEED", self.unit, color) + return UiElement(value, "相对速度", self.unit, color) class SteeringAngleElement(LateralControlElement): @@ -125,7 +125,7 @@ class SteeringAngleElement(LateralControlElement): value = f"{angle_steers:.1f}°" color = self.get_lat_color(lat_active, steer_override, angle_steers, check_angle=True) - return UiElement(value, "REAL STEER", self.unit, color) + return UiElement(value, "转向角度", self.unit, color) class DesiredSteeringAngleElement(LateralControlElement): @@ -150,7 +150,7 @@ class DesiredSteeringAngleElement(LateralControlElement): else: color = rl.Color(0, 255, 0, 200) - return UiElement(value, "DESIRED STEER", self.unit, color) + return UiElement(value, "期望转向角", self.unit, color) class ActualLateralAccelElement(LateralControlElement): @@ -169,7 +169,7 @@ class ActualLateralAccelElement(LateralControlElement): value = f"{actual_lat_accel:.2f}" color = self.get_lat_color(lat_active, steer_override) - return UiElement(value, "ACTUAL L.A.", self.unit, color) + return UiElement(value, "横向加速", self.unit, color) class DesiredLateralAccelElement(LateralControlElement): @@ -188,7 +188,7 @@ class DesiredLateralAccelElement(LateralControlElement): value = f"{desired_lat_accel:.2f}" if lat_active else "-" color = self.get_lat_color(lat_active, steer_override) - return UiElement(value, "DESIRED L.A.", self.unit, color) + return UiElement(value, "期望横向加速", self.unit, color) class DesiredSteeringPIDElement(LateralControlElement): @@ -213,7 +213,7 @@ class DesiredSteeringPIDElement(LateralControlElement): else: color = rl.Color(0, 255, 0, 200) - return UiElement(value, "DESIRED STEER", self.unit, color) + return UiElement(value, "期望转向角", self.unit, color) class AEgoElement: @@ -223,7 +223,7 @@ class AEgoElement: def update(self, sm, is_metric: bool) -> UiElement: a_ego = sm['carState'].aEgo value = f"{a_ego:.1f}" - return UiElement(value, "ACC.", self.unit, rl.WHITE) + return UiElement(value, "加速", self.unit, rl.WHITE) class LeadSpeedElement(LeadInfoElement): @@ -240,7 +240,7 @@ class LeadSpeedElement(LeadInfoElement): value = f"{(lead_v_rel + v_ego) * conversion:.0f}" if lead_status else "-" color = self.get_lead_color(0, lead_v_rel, use_v_rel=True) if lead_status else rl.WHITE - return UiElement(value, "L.S.", self.unit, color) + return UiElement(value, "参考车速", self.unit, color) class FrictionCoefficientElement: @@ -254,7 +254,7 @@ class FrictionCoefficientElement: value = f"{friction_coef:.3f}" color = rl.Color(0, 255, 0, 200) if live_valid else rl.WHITE - return UiElement(value, "FRIC.", self.unit, color) + return UiElement(value, "摩擦系数", self.unit, color) class StorageElement: @@ -263,7 +263,7 @@ class StorageElement: def update(self, sm, is_metric: bool) -> UiElement: if not sm.valid['deviceState']: - return UiElement("-", "STO.", self.unit, rl.WHITE) + return UiElement("-", "剩余存储", self.unit, rl.WHITE) free_percent = float(sm['deviceState'].freeSpacePercent) value = f"{int(round(free_percent))}" @@ -276,7 +276,7 @@ class StorageElement: else: color = rl.Color(0, 255, 0, 200) - return UiElement(value, "FREE.", self.unit, color) + return UiElement(value, "剩余存储", self.unit, color) class MemoryUsageElement: @@ -285,7 +285,7 @@ class MemoryUsageElement: def update(self, sm, is_metric: bool) -> UiElement: if not sm.valid['deviceState']: - return UiElement("-", "MEM.", self.unit, rl.WHITE) + return UiElement("-", "内存占用", self.unit, rl.WHITE) mem_percent = int(round(sm['deviceState'].memoryUsagePercent)) value = f"{mem_percent}" @@ -298,7 +298,7 @@ class MemoryUsageElement: else: color = rl.Color(0, 255, 0, 200) - return UiElement(value, "MEM.", self.unit, color) + return UiElement(value, "内存占用", self.unit, color) class LatAccelFactorElement: @@ -312,7 +312,7 @@ class LatAccelFactorElement: value = f"{lat_accel_factor:.3f}" color = rl.Color(0, 255, 0, 200) if live_valid else rl.WHITE - return UiElement(value, "L.A.F.", self.unit, color) + return UiElement(value, "实时扭矩", self.unit, color) class CpuTempMaxElement: @@ -321,7 +321,7 @@ class CpuTempMaxElement: def update(self, sm, is_metric: bool) -> UiElement: if not sm.valid['deviceState']: - return UiElement("-", "CPU.", self.unit, rl.WHITE) + return UiElement("-", "CPU温度", self.unit, rl.WHITE) # cpuTempC is a list (multiple cores), get the maximum temperature cpu_temps = sm['deviceState'].cpuTempC @@ -338,7 +338,7 @@ class CpuTempMaxElement: else: color = rl.Color(0, 255, 0, 200) - return UiElement(value, "CPU.", self.unit, color) + return UiElement(value, "CPU温度", self.unit, color) class SteeringTorqueEpsElement: @@ -416,4 +416,4 @@ class AltitudeElement(GpsInfoElement): gps_accuracy = 1.0 # Simulate valid for legacy check value = f"{altitude:.1f}" if gps_accuracy != 0.0 else "-" - return UiElement(value, "ALT.", self.unit, rl.WHITE) + return UiElement(value, "海拔", self.unit, rl.WHITE) diff --git a/selfdrive/ui/translations/app_zh-CHS.po b/selfdrive/ui/translations/app_zh-CHS.po index 2400b6f44..3ffdf43cd 100644 --- a/selfdrive/ui/translations/app_zh-CHS.po +++ b/selfdrive/ui/translations/app_zh-CHS.po @@ -60,13 +60,13 @@ msgstr "5G" #: selfdrive/ui/layouts/settings/developer.py:23 msgid "" -"WARNING: openpilot longitudinal control is in alpha for this car and will " -"disable Automatic Emergency Braking (AEB).

On this car, openpilot " -"defaults to the car's built-in ACC instead of openpilot's longitudinal " -"control. Enable this to switch to openpilot longitudinal control. Enabling " -"Experimental mode is recommended when enabling openpilot longitudinal " -"control alpha. Changing this setting will restart openpilot if the car is " -"powered on." +"WARNING: openpilot longitudinal control is in alpha for this car and will" +" disable Automatic Emergency Braking (AEB).

On this car, " +"openpilot defaults to the car's built-in ACC instead of openpilot's " +"longitudinal control. Enable this to switch to openpilot longitudinal " +"control. Enabling Experimental mode is recommended when enabling openpilot " +"longitudinal control alpha. Changing this setting will restart openpilot if " +"the car is powered on." msgstr "" "警告:此车型的 openpilot 纵向控制仍为 alpha,将会停用自动紧急制动 (AEB)。" "

在此车型上,openpilot 默认使用车载 ACC,而非 openpilot 的纵向控" @@ -133,8 +133,8 @@ msgstr "始终启用驾驶员监控" #: selfdrive/ui/layouts/settings/toggles.py:186 #, python-format msgid "" -"An alpha version of openpilot longitudinal control can be tested, along with " -"Experimental mode, on non-release branches." +"An alpha version of openpilot longitudinal control can be tested, along with" +" Experimental mode, on non-release branches." msgstr "openpilot 纵向控制的 alpha 版本可在非发布分支搭配实验模式进行测试。" #: selfdrive/ui/layouts/settings/device.py:187 @@ -202,8 +202,9 @@ msgstr "CONNECT" msgid "CONNECTING..." msgstr "连接中..." -#: system/ui/widgets/confirm_dialog.py:23 system/ui/widgets/option_dialog.py:35 -#: system/ui/widgets/keyboard.py:81 system/ui/widgets/network.py:318 +#: system/ui/widgets/confirm_dialog.py:23 +#: system/ui/widgets/option_dialog.py:35 system/ui/widgets/keyboard.py:81 +#: system/ui/widgets/network.py:318 #, python-format msgid "Cancel" msgstr "取消" @@ -255,7 +256,7 @@ msgstr "拒绝并卸载 openpilot" #: selfdrive/ui/layouts/settings/settings.py:67 msgid "Developer" -msgstr "开发者" +msgstr "开发人员" #: selfdrive/ui/layouts/settings/settings.py:62 msgid "Device" @@ -356,7 +357,8 @@ msgstr "启用网络共享" #: selfdrive/ui/layouts/settings/toggles.py:30 msgid "Enable driver monitoring even when openpilot is not engaged." -msgstr "即使未启用 openpilot 也启用驾驶员监控。" +msgstr "" +"即使未启用 openpilot 也启用驾驶员监控。" #: selfdrive/ui/layouts/settings/toggles.py:46 #, python-format @@ -368,7 +370,8 @@ msgstr "启用 openpilot" msgid "" "Enable the openpilot longitudinal control (alpha) toggle to allow " "Experimental mode." -msgstr "启用 openpilot 纵向控制(alpha)开关,以使用实验模式。" +msgstr "" +"启用 openpilot 纵向控制(alpha)开关,以使用实验模式。" #: system/ui/widgets/network.py:204 #, python-format @@ -408,9 +411,10 @@ msgstr "实验模式" #: selfdrive/ui/layouts/settings/toggles.py:181 #, python-format msgid "" -"Experimental mode is currently unavailable on this car since the car's stock " -"ACC is used for longitudinal control." -msgstr "此车型当前无法使用实验模式,因为纵向控制使用的是原厂 ACC。" +"Experimental mode is currently unavailable on this car since the car's stock" +" ACC is used for longitudinal control." +msgstr "" +"此车型当前无法使用实验模式,因为纵向控制使用的是原厂 ACC。" #: system/ui/widgets/network.py:373 #, python-format @@ -432,26 +436,20 @@ msgstr "Firehose 模式" #: selfdrive/ui/layouts/settings/firehose.py:25 msgid "" -"For maximum effectiveness, bring your device inside and connect to a good " -"USB-C adapter and Wi-Fi weekly.\n" +"For maximum effectiveness, bring your device inside and connect to a good USB-C adapter and Wi-Fi weekly.\n" "\n" -"Firehose Mode can also work while you're driving if connected to a hotspot " -"or unlimited SIM card.\n" +"Firehose Mode can also work while you're driving if connected to a hotspot or unlimited SIM card.\n" "\n" "\n" "Frequently Asked Questions\n" "\n" -"Does it matter how or where I drive? Nope, just drive as you normally " -"would.\n" +"Does it matter how or where I drive? Nope, just drive as you normally would.\n" "\n" -"Do all of my segments get pulled in Firehose Mode? No, we selectively pull a " -"subset of your segments.\n" +"Do all of my segments get pulled in Firehose Mode? No, we selectively pull a subset of your segments.\n" "\n" -"What's a good USB-C adapter? Any fast phone or laptop charger should be " -"fine.\n" +"What's a good USB-C adapter? Any fast phone or laptop charger should be fine.\n" "\n" -"Does it matter which software I run? Yes, only upstream openpilot (and " -"particular forks) are able to be used for training." +"Does it matter which software I run? Yes, only upstream openpilot (and particular forks) are able to be used for training." msgstr "" "为达到最佳效果,请将设备带到室内,并每周连接优质 USB‑C 充电器与 Wi‑Fi。\n" "\n" @@ -538,13 +536,14 @@ msgstr "纵向操作模式" #: selfdrive/ui/onroad/hud_renderer.py:148 #, python-format msgid "MAX" -msgstr "最大" +msgstr "MAX" #: selfdrive/ui/widgets/setup.py:75 #, python-format msgid "" "Maximize your training data uploads to improve openpilot's driving models." -msgstr "最大化上传训练数据,以改进 openpilot 的驾驶模型。" +msgstr "" +"最大化上传训练数据,以改进 openpilot 的驾驶模型。" #: selfdrive/ui/layouts/settings/device.py:59 #: selfdrive/ui/layouts/settings/device.py:60 @@ -651,18 +650,21 @@ msgstr "关机" #: system/ui/widgets/network.py:144 #, python-format msgid "Prevent large data uploads when on a metered Wi-Fi connection" -msgstr "在计量制 Wi‑Fi 连接时避免大量上传" +msgstr "" +"在计量制 Wi‑Fi 连接时避免大量上传" #: system/ui/widgets/network.py:135 #, python-format msgid "Prevent large data uploads when on a metered cellular connection" -msgstr "在计量制蜂窝网络时避免大量上传" +msgstr "" +"在计量制蜂窝网络时避免大量上传" #: selfdrive/ui/layouts/settings/device.py:25 msgid "" "Preview the driver facing camera to ensure that driver monitoring has good " "visibility. (vehicle must be off)" -msgstr "预览车内摄像头以确保驾驶员监控视野良好。(车辆必须熄火)" +msgstr "" +"预览车内摄像头以确保驾驶员监控视野良好。(车辆必须熄火)" #: selfdrive/ui/widgets/pairing_dialog.py:161 #, python-format @@ -702,11 +704,11 @@ msgstr "重启并更新" #: selfdrive/ui/layouts/settings/toggles.py:27 msgid "" "Receive alerts to steer back into the lane when your vehicle drifts over a " -"detected lane line without a turn signal activated while driving over 31 mph " -"(50 km/h)." +"detected lane line without a turn signal activated while driving over 31 mph" +" (50 km/h)." msgstr "" -"当车辆以超过 31 mph(50 km/h)行驶且未打转向灯越过检测到的车道线时,接收引导" -"回车道的警报。" +"当车辆以超过 31mph(50km/h)行驶且未打转向灯越过检测到的车道线时," +"接收引导回车道的警报。" #: selfdrive/ui/layouts/settings/toggles.py:76 #, python-format @@ -820,8 +822,8 @@ msgstr "标准" #: selfdrive/ui/layouts/settings/toggles.py:22 msgid "" -"Standard is recommended. In aggressive mode, openpilot will follow lead cars " -"closer and be more aggressive with the gas and brake. In relaxed mode " +"Standard is recommended. In aggressive mode, openpilot will follow lead cars" +" closer and be more aggressive with the gas and brake. In relaxed mode " "openpilot will stay further away from lead cars. On supported cars, you can " "cycle through these personalities with your steering wheel distance button." msgstr "" @@ -857,7 +859,7 @@ msgstr "网络共享密码" #: selfdrive/ui/layouts/settings/settings.py:64 msgid "Toggles" -msgstr "切换" +msgstr "设定" #: selfdrive/ui/layouts/settings/software.py:72 #, python-format @@ -898,7 +900,7 @@ msgstr "上传车内摄像头数据,帮助改进驾驶员监控算法。" #: selfdrive/ui/layouts/settings/toggles.py:88 #, python-format msgid "Use Metric System" -msgstr "使用公制" +msgstr "使用公制单位" #: selfdrive/ui/layouts/settings/toggles.py:17 msgid "" @@ -1046,17 +1048,17 @@ msgstr "openpilot 无法使用" #: selfdrive/ui/layouts/settings/toggles.py:158 #, python-format msgid "" -"openpilot defaults to driving in chill mode. Experimental mode enables alpha-" -"level features that aren't ready for chill mode. Experimental features are " -"listed below:

End-to-End Longitudinal Control


Let the driving " -"model control the gas and brakes. openpilot will drive as it thinks a human " -"would, including stopping for red lights and stop signs. Since the driving " -"model decides the speed to drive, the set speed will only act as an upper " -"bound. This is an alpha quality feature; mistakes should be expected." -"

New Driving Visualization


The driving visualization will " -"transition to the road-facing wide-angle camera at low speeds to better show " -"some turns. The Experimental mode logo will also be shown in the top right " -"corner." +"openpilot defaults to driving in chill mode. Experimental mode enables " +"alpha-level features that aren't ready for chill mode. Experimental features" +" are listed below:

End-to-End Longitudinal Control


Let the " +"driving model control the gas and brakes. openpilot will drive as it thinks " +"a human would, including stopping for red lights and stop signs. Since the " +"driving model decides the speed to drive, the set speed will only act as an " +"upper bound. This is an alpha quality feature; mistakes should be " +"expected.

New Driving Visualization


The driving visualization" +" will transition to the road-facing wide-angle camera at low speeds to " +"better show some turns. The Experimental mode logo will also be shown in the" +" top right corner." msgstr "" "openpilot 默认以安稳模式行驶。实验模式会启用尚未准备好用于安稳模式的 Alpha 级" "功能。实验功能如下:

端到端纵向控制


让驾驶模型控制油门与刹车。" @@ -1069,7 +1071,7 @@ msgstr "" #, python-format msgid "" "openpilot is continuously calibrating, resetting is rarely required. " -"Resetting calibration will restart openpilot if the car is powered on." +"Resetting calibration will restart sunnypilot if the car is powered on." msgstr "" "openpilot 持续进行校准,通常无需重置。若车辆通电,重置校准将会重启 " "openpilot。" @@ -1078,9 +1080,7 @@ msgstr "" msgid "" "openpilot learns to drive by watching humans, like you, drive.\n" "\n" -"Firehose Mode allows you to maximize your training data uploads to improve " -"openpilot's driving models. More data means bigger models, which means " -"better Experimental Mode." +"Firehose Mode allows you to maximize your training data uploads to improve openpilot's driving models. More data means bigger models, which means better Experimental Mode." msgstr "" "openpilot 通过观察人类(例如您)的驾驶来学习。\n" "\n" @@ -1094,9 +1094,9 @@ msgstr "openpilot 纵向控制可能会在未来更新中提供。" #: selfdrive/ui/layouts/settings/device.py:26 msgid "" -"openpilot requires the device to be mounted within 4° left or right and " +"sunnypilot requires the device to be mounted within 4° left or right and " "within 5° up or 9° down." -msgstr "openpilot 要求设备安装在左右 4°、上 5° 或下 9° 以内。" +msgstr "sunnypilot 要求设备安装在左右 4°、上 5° 或下 9° 以内。" #: selfdrive/ui/layouts/settings/device.py:134 #, python-format @@ -1172,3 +1172,1536 @@ msgstr "✓ 已订阅" #, python-format msgid "🔥 Firehose Mode 🔥" msgstr "🔥 Firehose 模式 🔥" + +msgid " (Default)" +msgstr " (默认)" + +msgid "%" +msgstr "%" + +msgid "" +"(Only for highest tiers, and does NOT bring ANY benefit to you yet. We are " +"just testing data volume.)" +msgstr "" +"(仅适用于最高级别,尚未给您带来任何好处。" +"我们只是用来测试数据量。)" + +msgid ", but we'll be here when you're ready to come back." +msgstr ", 但当你准备好回来时我们会在这里。" + +msgid "" +"WARNING: sunnypilot longitudinal control is in alpha for this car and " +"will disable Automatic Emergency Braking (AEB).

On this car, " +"sunnypilot defaults to the car's built-in ACC instead of sunnypilot's " +"longitudinal control. Enable this to switch to sunnypilot longitudinal " +"control. Enabling Experimental mode is recommended when enabling sunnypilot " +"longitudinal control alpha. Changing this setting will restart sunnypilot if" +" the car is powered on." +msgstr "" +"警告:此车型的 sunnypilot 纵向控制仍为 alpha,将会停用自动紧急制动 (AEB)。" +"

在此车型上,sunnypilot 默认使用车载 ACC,而非 sunnypilot 的纵向控" +"制。启用此选项可切换为 sunnypilot 纵向控制。建议同时启用实验模式。若车辆通电," +"更改此设置将会重启 sunnypilot。" + +msgid "" +"A beautiful rainbow effect on the path the model wants to take. It does not " +"affect driving in any way." +msgstr "" +"在模型路径上呈现出美丽的彩虹效果。" +"不会影响其他任何功能。" + +msgid "" +"A chime and on-screen alert will play when the traffic light you are waiting" +" for turns green and you have no vehicle in front of you.
Note: This " +"chime is only designed as a notification. It is the driver's responsibility " +"to observe their environment and make decisions accordingly." +msgstr "" +"当您等待的交通信号灯变绿且前方无车辆时,将会播放提示音并显示屏幕提醒。" +"
注意:此提示仅作为通知用途。驾驶员有责任观察周围环境并做出相应决策。" + +msgid "" +"A chime and on-screen alert will play when you are stopped, and the vehicle " +"in front of you start moving.
Note: This chime is only designed as a " +"notification. It is the driver's responsibility to observe their environment" +" and make decisions accordingly." +msgstr "" +"当您处于停车状态,且前方车辆开始移动时,将会播放提示音并显示屏幕提醒。" +"
注意:此提示仅作为通知用途。驾驶员有责任观察周围环境并做出相应决策。" + +msgid "ALL TIME" +msgstr "全部" + +msgid "Actuator Delay:" +msgstr "执行器延迟:" + +msgid "Adjust Lane Turn Speed" +msgstr "调整车道转向速度" + +msgid "Adjust Software Delay" +msgstr "调节软件延迟" + +msgid "" +"Adjust the software delay when Live Learning Steer Delay is toggled off. The" +" default software delay value is 0.2" +msgstr "" +"关闭 实时学习转向延迟 时,可手动调节软件延迟。" +"默认软件延迟值为 0.2" + +msgid "All" +msgstr "全部" + +msgid "All states (~6.0 GB)" +msgstr "所有状态 (~6.0 GB)" + +msgid "" +"Allows the driver to provide limited steering input while openpilot is " +"engaged." +msgstr "" +"允许驾驶员在 openpilot 处于激活状态时提供有限的转向输入。" + +msgid "Always On" +msgstr "始终开启" + +msgid "" +"An alpha version of sunnypilot longitudinal control can be tested, along " +"with Experimental mode, on non-release branches." +msgstr "" +"在正式-release版本以外的分支上,可以测试 sunnypilot " +"纵向控制的 Alpha 版本以及实验模式。" + +msgid "" +"Apply a custom timeout for settings UI.
This is the time after which " +"settings UI closes automatically if user is not interacting with the screen." +msgstr "" +"为设置界面应用自定义超时时间。" +"
该时间为用户在无屏幕操作的情况下,设置界面自动关闭前的等待时长。" + +msgid "Are you sure you want to backup your current sunnypilot settings?" +msgstr "" +"你确定要备份sunnypilot设置吗?" + +msgid "Are you sure you want to enter Always Offroad mode?" +msgstr "您确定要进入 设置模式 吗?" + +msgid "Are you sure you want to exit Always Offroad mode?" +msgstr "您确定要退出 设置模式 吗?" + +msgid "" +"Are you sure you want to reset all sunnypilot settings to default? Once the " +"settings are reset, there is no going back." +msgstr "" +"您确定要将所有Sunnypilot设置恢复为默认值吗? " +"一旦设置被重置,将无法恢复。 " + +msgid "" +"Are you sure you want to restore the last backed up sunnypilot settings?" +msgstr "" +"你确定要恢复上次备份的sunnypilot设置吗?" + +msgid "Assist" +msgstr "辅助调节" + +msgid "" +"Assist: Adjusts the vehicle's cruise speed based on the current road's speed" +" limit when operating the +/- buttons." +msgstr "" +"Assist 辅助调节 : 操作+/-按钮时,根据当前道路限速自动调整巡航车速。 " + +msgid "Auto (Dark)" +msgstr "自动(深色)" + +msgid "Auto (Default)" +msgstr "自动 (默认)" + +msgid "Auto Lane Change by Blinker" +msgstr "通过转向灯实现自动变道" + +msgid "Obstacle Detected in Blindspot" +msgstr "盲区检测到障碍" + +msgid "Auto Lane Change: Delay with Blind Spot" +msgstr "自动变道辅助:盲区有车时延迟" + +msgid "Backup Failed" +msgstr "备份失败" + +msgid "Backup Settings" +msgstr "备份设置" + +msgid "" +"Become a sponsor of sunnypilot to get early access to sunnylink features " +"when they become available." +msgstr "" +"成为sunnypilot的赞助商,即可在sunnylink功能上线时获得优先访问权限。" + +msgid "Bottom" +msgstr "底部" + +msgid "CLEAR" +msgstr "清除" + +msgid "Cancel Download" +msgstr "取消下载" + +msgid "Car First" +msgstr "车辆优先" + +msgid "" +"Car First: Use Speed Limit data from Car if available, else use from " +"OpenStreetMaps" +msgstr "" +"Car First 车辆优先:优先使用车辆限速数据,不可用时采用OpenStreetMaps数据" + +msgid "Car Only" +msgstr "仅车辆" + +msgid "Car Only: Use Speed Limit data only from Car" +msgstr "" +"Car Only 仅车辆:仅使用车辆提供的限速数据" + +msgid "" +"Changing this setting will restart sunnypilot if the car is powered on." +msgstr "" +"如果车辆已通电,更改此设置将会重新启动 sunnypilot" + +msgid "" +"Choose how Automatic Lane Centering (ALC) behaves after the brake pedal is " +"manually pressed in sunnypilot." +msgstr "" +"选择在sunnypilot中踩下制动踏板后自动车道居中 ALC 的行为。" + +msgid "Choose your sponsorship tier and confirm your support" +msgstr "选择您的赞助级别并确认您的支持" + +msgid "Clear Cache" +msgstr "清除缓存" + +msgid "Clear Model Cache" +msgstr "清除驾驶模型缓存" + +msgid "Click the Sponsor button for more details" +msgstr "点击 赞助 按钮了解更多详情" + +msgid "Colors represent vehicle fingerprint status:" +msgstr "颜色指示匹配状态:" + +msgid "Combined" +msgstr "融合数据" + +msgid "Combined: Use combined Speed Limit data from Car & OpenStreetMaps" +msgstr "" +"Combined 融合数据:综合使用车辆与OpenStreetMaps的限速数据" + +msgid "Confirm" +msgstr "确认" + +msgid "Controls state of the device after boot/sleep." +msgstr "设置设备在 启动/唤醒 后的状态。" + +msgid "Cooperative Steering" +msgstr "协作转向(测试)" + +msgid "Cooperative Steering (Beta)" +msgstr "协作转向(测试)" + +msgid "Converts light steering input into steering-wheel rotation." +msgstr "将轻度转向输入转换为方向盘转动。" + +msgid "The faster you go, the stiffer the steering gets." +msgstr "车速越高,转向阻尼越硬。" + +msgid "Country" +msgstr "国家" + +msgid "Cruise" +msgstr "巡航" + +msgid "Current Model" +msgstr "当前驾驶模型" + +msgid "Custom ACC Speed Increments" +msgstr "自定义 ACC 车速调节步长" + +msgid "Custom Longitudinal Tuning" +msgstr "自定义纵向控制调校" + +msgid "Customize Lane Change" +msgstr "自定义变道设置" + +msgid "Customize MADS" +msgstr "自定义 MADS" + +msgid "Customize Source" +msgstr "自定义来源" + +msgid "Customize Torque Params" +msgstr "自定义扭矩参数" + +msgid "DELETE" +msgstr "删除" + +msgid "DISABLED" +msgstr "已禁用" + +msgid "Database Update" +msgstr "数据更新" + +msgid "Decline, uninstall sunnypilot" +msgstr "拒绝并卸载sunnypilot" + +msgid "Default" +msgstr "默认" + +msgid "Default Model" +msgstr "默认模型" + +msgid "Default: Device will boot/wake-up normally & will be ready to engage." +msgstr "默认:设备正常启动并进入行驶模式,可随时启用辅助驾驶。" + +msgid "Delay before lateral control resumes after the turn signal ends." +msgstr "" +"转向信号关闭后,恢复横向控制的延迟时间" + +msgid "Developer UI" +msgstr "数据显示" + +msgid "" +"Device will automatically shutdown after set time once the engine is turned off.\n" +"(30h is the default)" +msgstr "" +"设备离线后会在设定时间后自动关机。\n" +"(默认30小时)" + +msgid "Disable" +msgstr "禁用" + +msgid "Disable Updates" +msgstr "禁用更新" + +msgid "" +"Disable the sunnypilot Longitudinal Control (alpha) toggle to allow " +"Intelligent Cruise Button Management." +msgstr "" +"关闭 sunnypilot 纵向控制 (alpha) 开关以允许智能巡航按键管理。 " + +msgid "Disengage" +msgstr "关闭" + +msgid "Disengage to Enter Always Offroad Mode" +msgstr "请关闭辅助驾驶功能后再进入 设置模式" + +msgid "Disengage: ALC will disengage when the brake pedal is pressed." +msgstr "" +"解除:踩刹车即解除自动车道居中(ALC)" + +msgid "Display" +msgstr "屏幕设置" + +msgid "Display Metrics Below Chevron" +msgstr "前车数据显示" + +msgid "Display Road Name" +msgstr "显示道路名称" + +msgid "Display Turn Signals" +msgstr "显示屏幕转向提示" + +msgid "Display real-time parameters and metrics from various sources." +msgstr "" +"在屏幕底部及(或)右侧显示实时参数指标。" + +msgid "" +"Display steering arc on the driving screen when lateral control is enabled." +msgstr "" +"启用横向控制时,在驾驶屏幕上显示转向弧" + +msgid "" +"Display useful metrics below the chevron that tracks the lead car only " +"applicable to cars with sunnypilot longitudinal control." +msgstr "" +"在跟踪前车的三角标识下方显示相关指标" +"仅适用于开启了sunnypilot纵向控制功能时" + +msgid "" +"Displays the name of the road the car is traveling on.
The OpenStreetMap " +"database of the location must be downloaded from the OSM panel to fetch the " +"road name." +msgstr "" +"显示车辆当前行驶的道路名称。 " +"需从OSM面板下载该地区的OpenStreetMap数据库以获取道路名称信息。 " + +msgid "Distance" +msgstr "距离" + +msgid "Downloaded Maps" +msgstr "已下载地图" + +msgid "Downloading Map" +msgstr "正在下载地图" + +msgid "Downloading Maps..." +msgstr "地图下载中..." + +msgid "Driver Camera Preview" +msgstr "驾驶员监控预览" + +msgid "Drives" +msgstr "行程数量" + +msgid "Driving Model" +msgstr "驾驶模型" + +msgid "Dynamic" +msgstr "动态" + +msgid "Early Access: Become a sunnypilot Sponsor" +msgstr "优先权限:成为sunnypilot赞助者" + +msgid "Enable \"Always Offroad\" in Device panel, or turn vehicle off to toggle." +msgstr "" +"在设备面板中启用 设置模式 ,或关闭车辆进行切换。" + +msgid "Enable Always Offroad" +msgstr "点击进入 设置模式 " + +msgid "Enable Custom Tuning" +msgstr "启用自定义调校" + +msgid "Enable Dynamic Experimental Control" +msgstr "启用动态实验控制 DEC" + +msgid "Enable Standstill Timer" +msgstr "启用停车计时器" + +msgid "Enable Tesla Rainbow Mode" +msgstr "启用特斯拉彩虹大道模式" + +msgid "" +"Enable custom Short & Long press increments for cruise speed " +"increase/decrease." +msgstr "" +"启用自定义 短按/长按 调节巡航车速的增减步长。" + +msgid "Enable driver monitoring even when sunnypilot is not engaged." +msgstr "" +"即使在sunnypilot未激活时也启用驾驶员监控。" + +msgid "Enable sunnylink" +msgstr "启用sunnylink" + +msgid "Enable sunnylink uploader (infrastructure test)" +msgstr "启用 sunnylink 上传器 (测试)" + +msgid "" +"Enable sunnylink uploader to allow sunnypilot to upload your driving data to" +" sunnypilot servers. " +msgstr "" +"启用 sunnylink 上传器,以允许 sunnypilot 将您的驾驶数据上传至 sunnypilot 服务器。" + +msgid "Enable sunnypilot" +msgstr "启用 sunnypilot" + +msgid "" +"Enable the beloved MADS feature. Disable toggle to revert back to stock " +"sunnypilot engagement/disengagement." +msgstr "" +"启用备受喜爱的M.A.D.S.功能。" +"关闭切换按钮可恢复到原厂的openpilot激活/解除激活状态。" + +msgid "" +"Enable the sunnypilot longitudinal control (alpha) toggle to allow " +"Experimental mode." +msgstr "" +"启用 sunnypilot 纵向控制(alpha)开关以允许实验模式。" + +msgid "" +"Enable this for the car to learn and adapt its steering response time. " +"Disable to use a fixed steering response time. Keeping this on provides the " +"stock openpilot experience." +msgstr "" +"启用此选项后,车辆将学习并自适应调整转向响应时间 " +"禁用则使用固定的转向响应时间。 " +"保持开启可获得原厂 openpilot 的默认体验。" + +msgid "" +"Enable this to enforce sunnypilot to steer with Torque lateral control." +msgstr "" +"启用此选项可强制sunnypilot使用扭矩横向控制进行转向。" + +msgid "" +"Enable toggle to allow the model to determine when to use sunnypilot ACC or " +"sunnypilot End to End Longitudinal." +msgstr "" +"启用开关,让模型决定何时使用sunnypilot ACC或sunnypilot端到端纵向控制。" + +msgid "" +"Enables custom tuning for Torque lateral control. Modifying Lateral " +"Acceleration Factor and Friction below will override the offline values " +"indicated in the YAML files within \"opendbc/car/torque_data\". The values " +"will also be used live when \"Manual Real-Time Tuning\" toggle is enabled." +msgstr "" +"启用扭矩横向控制的自定义调校。" +"修改下方的 横向加速度系数 和 摩擦系数 将" +" 覆盖 \"opendbc/car/torque_data\"目录下 YAML 文件中指定的离线值。 " +"当 手动实时调校 开关启用时,这些值也将被实时应用。" + +msgid "Enables or disables the GitHub runner service." +msgstr "启用或禁用GitHub运行器服务。" + +msgid "" +"Enables self-tune for Torque lateral control for platforms that do not use " +"Torque lateral control by default." +msgstr "" +"为默认不使用扭矩横向控制的平台启用扭矩横向控制的自学习调校功能。" + +msgid "" +"Enabling this will display warnings when a vehicle is detected in your blind" +" spot as long as your car has BSM supported." +msgstr "" +"启用后,若车辆配备盲区监测系统BSM,当检测到盲区内有车辆时将显示警告。" + +msgid "Enforce Factory Longitudinal Control" +msgstr "启用原厂的纵向控制" + +msgid "Enforce Torque Lateral Control" +msgstr "强制扭矩横向控制" + +msgid "" +"Enforces the torque lateral controller to use the fixed values instead of " +"the learned values from Self-Tune. Enabling this toggle overrides Self-Tune " +"values." +msgstr "" +"强制扭矩横向控制器使用固定值而非自学习调校的学习值。" +"启用此开关将覆盖自学习调校的值。" + +msgid "" +"Engage lateral and longitudinal control with cruise control engagement." +msgstr "" +"通过激活巡航控制来启用横向和纵向控制。" + +msgid "Enter model year (e.g., 2021) and model (Toyota Corolla):" +msgstr "输入车辆年份(例如:2021)和车型名称(例如:Toyota Corolla):" + +msgid "Enter search query" +msgstr "输入搜索查询" + +msgid "Error Log" +msgstr "错误日志" + +msgid "Error: Invalid download. Retry." +msgstr "错误:下载失败。重试。" + +msgid "Exit Always Offroad" +msgstr "点击进入 行驶模式 " + +msgid "" +"Experimental feature to enable auto-resume during stop-and-go for certain " +"supported Subaru platforms." +msgstr "" +"实验性功能,用于在停车起步路况下" +"为某些支持的斯巴鲁平台自动恢复行驶。" + +msgid "" +"Experimental feature to enable stop and go for Subaru Global models with " +"manual handbrake. Models with electric parking brake should keep this " +"disabled. Thanks to martinl for this implementation!" +msgstr "" +"实验性功能,用于为配备手动手刹的斯巴鲁全球车型 " +"启用停车起步功能。 " +"配备电子驻车制动的车型应保持此功能关闭。" +" 感谢martinl实现此功能!" + +msgid "FAULT" +msgstr "错误" + +msgid "FETCHING..." +msgstr "正在获取..." + +msgid "Fetching Latest Models" +msgstr "正在获取最新驾驶模型列表" + +msgid "Fingerprinted automatically" +msgstr "自动匹配车辆型号" + +msgid "Fixed" +msgstr "固定值" + +msgid "Fixed: Adds a fixed offset [Speed Limit + Offset]" +msgstr "Fixed 固定值:添加固定偏移量 [限速值 + 偏移量]" + +msgid "Follow the prompts to complete the pairing process" +msgstr "按照提示完成绑定" + +msgid "" +"For applicable vehicles, always display the true vehicle current speed from " +"wheel speed sensors." +msgstr "" +"对于适用的车辆," +" 始终显示来自轮速传感器的车辆当前真实速度。" + +msgid "For secure backup, restore, and remote configuration" +msgstr "" +"用于安全备份、恢复及远程配置" + +msgid "Friction" +msgstr "摩擦系数" + +msgid "GitHub Runner Service" +msgstr "启用GitHub运行器服务" + +msgid "Green Traffic Light Alert (Beta)" +msgstr "绿灯提示 (Beta)" + +msgid "Hours" +msgstr "驾驶时长(小时)" + +msgid "" +"If sponsorship status was not updated, please contact a moderator on the " +"community forum at https://community.sunnypilot.ai" +msgstr "" +"如果赞助状态没有更新,请联系社区管理员, " +"网址为 https://community.sunnypilot.ai" + +msgid "" +"If you're driving at 20 mph (32 km/h) or below and have your blinker on, the" +" car will plan a turn in that direction at the nearest drivable path. This " +"prevents situations (like at red lights) where the car might plan the wrong " +"turn direction." +msgstr "" +"如果你的车速在20英里/小时(32公里/小时)或以下,并且已打开转向灯, " +"汽车将在最近的可行驶路径上计划朝该方向转弯。 " +"这可以避免在红绿灯等情况下, " +"汽车可能会计划错误的转弯方向的情况。" + +msgid "Info" +msgstr "信息提示" + +msgid "Information: Displays the current road's speed limit." +msgstr "Information 息提示:显示当前道路限速。" + +msgid "Intelligent Cruise Button Management (ICBM) (Alpha)" +msgstr "智能巡航按键管理 (ICBM) (Alpha)" + +msgid "" +"Intelligent Cruise Button Management is currently unavailable on this " +"platform." +msgstr "" +"该车辆目前不支持智能巡航按键管理。" + +msgid "Interactivity Timeout" +msgstr "交互超时" + +msgid "" +"Join our Community Forum at https://community.sunnypilot.ai and reach out to" +" a moderator if you have issues" +msgstr "" +"加入我们的社区 https://community.sunnypilot.ai " +"并联系管理员确认赞助者身份" + +msgid "KM" +msgstr "KM" + +msgid "Last checked {}" +msgstr "已经是最新版本 {}" + +msgid "Lateral Acceleration Factor" +msgstr "横向加速度系数" + +msgid "Lead Departure Alert (Beta)" +msgstr "前车起步提示 (Beta)" + +msgid "GREEN\nLIGHT" +msgstr "绿灯" + +msgid "LEAD VEHICLE\nDEPARTING" +msgstr "前车起步" + +msgid "STOPPED" +msgstr "等待中" + +msgid "" +"ALT. MEM. STO. DESIRED STEER" +msgstr "" +"海拔 内存占用 剩余存储 期望转向角 抄 代码 局部还有" +"倒车 边缘 优秀 习惯 汉字 分钟 触​碰 踩​掉落 刹​踏​板" +"系​带齿条 胎​压 轮​档 关门 书​签 倒车 录像 驾驶" +"脱齿 请倒车 环境 关系 驻车制动 启动横向 左右 至少" +"个人 配置值得 混合控制" + +msgid "Less Restrict Settings for Self-Tune (Beta)" +msgstr "自学习调校宽松设置(测试版)" + +msgid "" +"Less strict settings when using Self-Tune. This allows torqued to be more " +"forgiving when learning values." +msgstr "" +"使用自学习调校时采用较宽松的设置。 " +"这使扭矩控制在学习数值时容错性更高。" + +msgid "Live Learning Steer Delay" +msgstr "实时学习转向延迟" + +msgid "Live Steer Delay:" +msgstr "实时转向延迟:" + +msgid "Long Press Increment" +msgstr "长按调节量" + +msgid "Manual Real-Time Tuning" +msgstr "手动实时调校" + +msgid "Manually selected fingerprint" +msgstr "手动选择车辆型号" + +msgid "Map First" +msgstr "地图优先" + +msgid "" +"Map First: Use Speed Limit data from OpenStreetMaps if available, else use " +"from Car" +msgstr "" +"Map First 地图优先:优先使用OpenStreetMaps限速数据,不可用时采用车辆数据" + +msgid "Map Only" +msgstr "仅地图" + +msgid "Map Only: Use Speed Limit data only from OpenStreetMaps" +msgstr "" +"Map Only 仅地图:仅使用OpenStreetMaps提供的限速数据" + +msgid "Mapd Version" +msgstr "地图版本" + +msgid "Max Time Offroad" +msgstr "最大离线时间" + +msgid "Miles" +msgstr "英里" + +msgid "Minimum Speed to Pause Lateral Control" +msgstr "暂停横向控制的最低速度" + +msgid "" +"Model download has started in the background. We suggest resetting " +"calibration. Would you like to do that now?" +msgstr "" +"已在后台开始下载驾驶模型。我们强烈建议您重置校准。 " +"您现在想做这个操作吗?" + +msgid "Models" +msgstr "模型" + +msgid "Modular Assistive Driving System (MADS)" +msgstr "模块化辅助驾驶系统(MADS)" + +msgid "Near" +msgstr "附近" + +msgid "Neural Network Lateral Control (NNLC)" +msgstr "神经网络横向控制(NNLC)" + +msgid "No" +msgstr "无" + +msgid "No vehicle selected" +msgstr "未选择车辆型号" + +msgid "None" +msgstr "无" + +msgid "None: No Offset" +msgstr "None 无:不设置偏移量" + +msgid "Not Paired" +msgstr "未绑定" + +msgid "Not Sponsor" +msgstr "非赞助商" + +msgid "Not fingerprinted or manually selected" +msgstr "未自动匹配或手动选择车型" + +msgid "Not going to lie, it's sad to see you disabled sunnylink" +msgstr "说实话,看你禁用了sunnylink有点难过,但我们会在这里等你回来。" + +msgid "" +"Note: For vehicles without LFA/LKAS button, disabling this will prevent " +"lateral control engagement." +msgstr "" +"注意:对于没有LFA(车道跟随辅助)/LKA(车道保持辅助)" +"按钮的车辆,禁用此功能将无法启用横向控制。" + +msgid "" +"Note: Once lateral control is engaged via UEM, it will remain engaged until " +"it is manually disabled via the MADS button or car shut off." +msgstr "" +"注意:通过MADS按钮启用横向控制后, " +"横向控制将保持启用状态, " +"直到通过MADS按钮手动禁用或车辆熄火。" + +msgid "Nudge" +msgstr "轻推" + +msgid "Nudgeless" +msgstr "自动" + +msgid "OSM" +msgstr "OSM地图" + +msgid "Off" +msgstr "关闭" + +msgid "Off: Disables the Speed Limit functions." +msgstr "Off 关闭:停用限速功能。" + +msgid "Offline Only" +msgstr "仅离线" + +msgid "Offroad" +msgstr "设置模式" + +msgid "Offroad: Device will be in Always Offroad mode after boot/wake-up." +msgstr "" +"设置模式:设备 启动/唤醒 后将始终保持 设置模式 状态。" + +msgid "Only available when vehicle is off, or always offroad mode is on" +msgstr "" +"仅在车辆处于设置模式时可用" + +msgid "Onroad Brightness" +msgstr "行驶时的屏幕亮度" + +msgid "Onroad Brightness Delay" +msgstr "行驶时屏幕设置启用延迟" + +msgid "Onroad Uploads" +msgstr "行驶时数据上传" + +msgid "PAST WEEK" +msgstr "最近一周" + +msgid "Pair GitHub Account" +msgstr "绑定 GitHub 账号" + +msgid "Pair your GitHub account" +msgstr "绑定您的GitHub帐户" + +msgid "" +"Pair your GitHub account to grant your device sponsor benefits, including " +"API access on sunnylink." +msgstr "" +"绑定您的GitHub账户,以授予您的设备赞助商权益," +" 包括在sunnylink上访问API的权限。" + +msgid "Paired" +msgstr "已绑定" + +msgid "Pause" +msgstr "暂停" + +msgid "Pause Lateral Control with Blinker" +msgstr "打转向灯时暂停横向控制" + +msgid "" +"Pause lateral control with blinker when traveling below the desired speed " +"selected." +msgstr "" +"当车速低于设定值时,打转向灯将暂停横向控制。" + +msgid "Pause: ALC will pause when the brake pedal is pressed." +msgstr "" +"暂停保持:当踩下制动踏板时,ALC将暂停。" + +msgid "Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]" +msgstr "" +"Percent 百分比:添加百分比偏移量 [限速值 + (限速值 × 偏移量 %)]" + +msgid "" +"Please enable \"Always Offroad\" mode or turn off the vehicle to adjust " +"these toggles." +msgstr "" +"请启用 设置模式 后再调整这些切换开关" + +msgid "Please reboot and try again." +msgstr "请重启设备并重试。" + +msgid "Policy Model" +msgstr "决策模型" + +msgid "Post-Blinker Delay" +msgstr "转向延时" + +msgid "Predictive" +msgstr "预测" + +msgid "Quickboot Mode" +msgstr "启用快速启动模式" + +msgid "" +"Quickboot mode requires updates to be disabled.
Enable 'Disable Updates' " +"in the Software panel first." +msgstr "" +"快速启动模式需要先关闭系统更新。 " +"请先在 软件 面板中启用 禁用更新。" + +msgid "Quiet Mode" +msgstr "静音模式" + +msgid "REFRESH" +msgstr "刷新" + +msgid "REGIST..." +msgstr "正在注册..." + +msgid "Re-enter the \"sunnylink\" panel to verify sponsorship status" +msgstr "" +"重新进入sunnylink面板确认赞助状态" + +msgid "Real-Time & Offline" +msgstr "实时与离线" + +msgid "Real-time Acceleration Bar" +msgstr "实时加速度显示条" + +msgid "Refresh Model List" +msgstr "更新驾驶模型列表" + +msgid "Remain Active" +msgstr "保持激活" + +msgid "Remain Active: ALC will remain active when the brake pedal is pressed." +msgstr "" +"保持激活:即使踩下制动踏板,ALC仍将保持激活状态。" + +msgid "Reset Settings" +msgstr "重置设置" + +msgid "Restore Failed" +msgstr "恢复失败" + +msgid "Restore Settings" +msgstr "恢复设置" + +msgid "Review the rules, features, and limitations of sunnypilot" +msgstr "查看 sunnypilot 的使用规则,以及其功能和限制" + +msgid "Right" +msgstr "右侧" + +msgid "Right & Bottom" +msgstr "右侧及底部" + +msgid "SPONSOR" +msgstr "赞助者" + +msgid "SUNNYLINK" +msgstr "SUNNYLINK" + +msgid "Scan" +msgstr "搜索" + +msgid "Scan the QR code to login to your GitHub account" +msgstr "扫描二维码绑定GitHub账号" + +msgid "Scan the QR code to visit sunnyhaibin's GitHub Sponsors page" +msgstr "" +"扫描二维码访问赞助者页面" + +msgid "Scanning..." +msgstr "搜索网络中..." + +msgid "Search" +msgstr "搜索" + +msgid "Search your vehicle" +msgstr "搜索您的车型" + +msgid "Select a Model" +msgstr "选择一个驾驶模型" + +msgid "Select a vehicle" +msgstr "选择一个车型" + +msgid "Select vehicle to force fingerprint manually." +msgstr "选择车型以手动匹配。" + +msgid "Self-Tune" +msgstr "自学习调校" + +msgid "" +"Set a timer to delay the auto lane change operation when the blinker is " +"used. No nudge on the steering wheel is required to auto lane change if a " +"timer is set. Default is Nudge.
Please use caution when using this " +"feature. Only use the blinker when traffic and road conditions permit." +msgstr "" +"选项中设置时间则在使用转向灯时延迟进行自动变道操作。" +"如果以上选项中设置了自动或时间,则打开转向灯后无需轻推方向盘即可进行自动变道。 " +"默认值为“轻推”:打开转向灯、轻推方向盘后进行自动变道操作。" +" 使用此功能时请小心。只有在交通和道路条件允许的情况下 " +"才能使用转向灯进行自动变道。" + +msgid "Set the maximum speed for lane turn desires. Default is 19 mph." +msgstr "" +"设置车道转向意图的最大速度。默认值为 30 km/h." + +msgid "Settings backup completed." +msgstr "设置备份已完成。" + +msgid "Settings restored. Confirm to restart the interface." +msgstr "设置已恢复。请确认界面已重启。" + +msgid "Short Press Increment" +msgstr "短按增量" + +msgid "Show Advanced Controls" +msgstr "显示高级控制选项" + +msgid "Show Blind Spot Warnings" +msgstr "显示盲区警示" + +msgid "Show a timer on the HUD when the car is at a standstill." +msgstr "当车辆停止时,在行驶界面上显示一个计时器记录停车时间。" + +msgid "" +"Show an indicator on the left side of the screen to display real-time " +"vehicle acceleration and deceleration. This displays what the car is " +"currently doing, not what the planner is requesting." +msgstr "" +"在屏幕左侧显示指示器,用于显示车辆实时加速度和减速度。" +" 此功能显示车辆当前的实际状态," +"而非规划系统所请求的状态。" + +msgid "Smart Cruise Control - Map" +msgstr "弯道地图速度控制(SCC-M)" + +msgid "Smart Cruise Control - Vision" +msgstr "弯道视觉速度控制(SCC-V)" + +msgid "Software Delay:" +msgstr "软件延迟:" + +msgid "Speed" +msgstr "速度" + +msgid "Speed Limit" +msgstr "速度限制设置" + +msgid "Speed Limit Offset" +msgstr "速度限制偏移" + +msgid "Speed Limit Source" +msgstr "速度限制来源" + +msgid "Speedometer: Always Display True Speed" +msgstr "车速表:始终显示真实车速" + +msgid "Speedometer: Hide from Onroad Screen" +msgstr "车速表:在行驶时的屏幕上隐藏" + +msgid "Sponsor Status" +msgstr "赞助状态" + +msgid "Sponsorship isn't required for basic backup/restore" +msgstr "" +"基本的 备份/恢复 功能不需要赞助" + +msgid "" +"Standard is recommended. In aggressive mode, sunnypilot will follow lead " +"cars closer and be more aggressive with the gas and brake. In relaxed mode " +"sunnypilot will stay further away from lead cars. On supported cars, you can" +" cycle through these personalities with your steering wheel distance button." +msgstr "" +"推荐使用 标准模式。在 激进模式 下,sunnypilot 会更靠近前方车辆, " +"并在油门和刹车方面更加激进。 " +"在 从容模式 下,sunnypilot 会与前方车辆保持更远距离。 " +"在支持的车型上,你可以使用方向盘上的距离按钮来循环切换这些驾驶风格。 " + +msgid "Start Download" +msgstr "开始下载" + +msgid "Start the vehicle to check vehicle compatibility." +msgstr "请启动车辆以检查兼容性。" + +msgid "State" +msgstr "省" + +msgid "Steering" +msgstr "转向" + +msgid "Steering Arc" +msgstr "显示转向弧" + +msgid "Steering Mode on Brake Pedal" +msgstr "自定义踩刹车后车道保持状态" + +msgid "Stop and Go (Beta)" +msgstr "停止与行驶辅助系统 (Beta)" + +msgid "Stop and Go Hack (Alpha)" +msgstr "停止与行驶辅助系统 (Alpha)" + +msgid "" +"sunnypilot Longitudinal Control must be available and " +"enabled for your vehicle to use this feature." +msgstr "" +"要使用此功能,您的车辆必须启用 sunnypilot 纵向控制功能。" + +msgid "" +"sunnypilot will allow some Toyota/Lexus cars to " +"auto resume during stop and go traffic. " +"This feature is only applicable to certain models " +"that are able to use longitudinal control. " +"This is an alpha feature. Use at your own risk." +msgstr "" +"sunnypilot 可让部分丰田/雷克萨斯车型在拥堵路况下自动重启行驶。" +"该功能仅适用于支持纵向控制的特定车型。" +"请注意这是测试版功能,使用风险自担。" + +msgid "Stop and Go for Manual Parking Brake (Beta)" +msgstr "带手动驻车制动的停止与行驶辅助系统 (Beta)" + +msgid "System reboot required for changes to take effect. Reboot now?" +msgstr "" +"需要重启系统以使更改生效。 " +"现在重启吗?" + +msgid "THANKS ♥" +msgstr "THANKS ♥" + +msgid "The reset cannot be undone. You have been warned." +msgstr "重置操作无法撤销。请谨慎选择。" + +msgid "" +"This feature can only be used with sunnypilot longitudinal control enabled." +msgstr "" +"此功能仅在启用 sunnypilot 纵向控制时可用。" + +msgid "" +"This feature defaults to OFF, and does not allow selection due to vehicle " +"limitations." +msgstr "" +"该功能默认为关闭状态,因车辆限制无法选择开启。" + +msgid "" +"This feature defaults to ON, and does not allow selection due to vehicle " +"limitations." +msgstr "" +"该功能默认为开启状态,因车辆限制无法关闭。" + +msgid "This feature is currently not available on this platform." +msgstr "" +"此功能在当前车辆平台上暂不可用。" + +msgid "" +"This feature is not supported on this platform due to vehicle limitations." +msgstr "" +"由于车辆限制,该平台不支持此功能。" + +msgid "" +"This feature is unavailable because sunnypilot Longitudinal Control (Alpha) " +"is not enabled." +msgstr "" +"此功能不可用,因为sunnypilot纵向控制(alpha)未启用。" + +msgid "This feature is unavailable while the car is onroad." +msgstr "" +"车辆在道路行驶时此功能不可用。" + +msgid "This feature requires sunnypilot longitudinal control to be available." +msgstr "" +"此功能需要启用sunnypilot纵向控制功能才能使用。" + +msgid "" +"This is the master switch, it will allow you to cutoff any sunnylink " +"requests should you want to do that." +msgstr "" +"这是主开关,它将允许你切断任何sunnylink请求。" + +msgid "" +"This may be due to weak internet connection or sunnylink registration issue." +" " +msgstr "" +"未找到sunnylink ID。这可能是由于网络连接较弱或sunnylink注册问题导致的。 " + +msgid "This platform only supports Disengage mode due to vehicle limitations." +msgstr "" +"受车辆限制,本平台仅支持 解除 模式。" + +msgid "This platform supports all MADS settings." +msgstr "该平台支持所有 MADS 设置。" + +msgid "This platform supports limited MADS settings." +msgstr "该平台仅支持部分 MADS 设置。" + +msgid "This setting will take effect immediately." +msgstr "此设置将立即生效。" + +msgid "This setting will take effect once the device enters offroad state." +msgstr "此设置将在设备进入 设置模式 时生效。" + +msgid "" +"This will delete ALL downloaded maps\n" +"\n" +"Are you sure you want to delete all maps?" +msgstr "" +"这将删除所有已下载的地图。\n" +"\n" +"你确定要删除所有地图吗?" + +msgid "" +"This will delete ALL downloaded models from the cache except the currently " +"active model. Are you sure?" +msgstr "" +"此操作将删除 除当前正在使用的模型外 缓存中的所有已下载模型。 " +"确定要继续吗?" + +msgid "" +"This will start the download process and it might take a while to complete." +msgstr "即将开始下载,可能需要一段时间才能完成。" + +msgid "Time" +msgstr "时间" + +msgid "" +"Toggle to enable a delay timer for seamless lane changes when blind spot " +"monitoring (BSM) detects a obstructing vehicle, ensuring safe maneuvering." +msgstr "" +"切换以启用盲区监测(BSM)检测到阻碍车辆时的延迟计时器," +"确保安全地进行无缝变道操作。" + +msgid "" +"Toggle visibility of advanced sunnypilot controls.
This only changes the " +"visibility of the toggles; it does not change the actual enabled/disabled " +"state." +msgstr "" +"切换高级 sunnypilot 控件的显示状态。
此操作仅 " +"改变控件的可见性,并不会实际启用或禁用对应功能。" + +msgid "Toggle with Main Cruise" +msgstr "通过巡航主按钮开关功能" + +msgid "Total Delay:" +msgstr "总延迟:" + +msgid "Training Guide" +msgstr "新手指南" + +msgid "Trips" +msgstr "行程" + +msgid "UI Debug Mode" +msgstr "用户界面调试模式" + +msgid "Unable to restore the settings, try again later." +msgstr "无法恢复设置,请稍后再试。" + +msgid "Unified Engagement Mode (UEM)" +msgstr "统一激活模式(UEM)" + +msgid "Unrecognized Vehicle" +msgstr "未识别车型" + +msgid "Use Lane Turn Desires" +msgstr "使用车道转向意图" + +msgid "" +"Use map data to estimate the appropriate speed to drive through turns ahead." +msgstr "" +"利用地图数据预测前方弯道并估算合适的通过车速。" + +msgid "" +"Use the sunnypilot system for adaptive cruise control and lane keep driver " +"assistance. Your attention is required at all times to use this feature." +msgstr "" +"使用sunnypilot进行自适应巡航和车道保持辅助。 " +"使用此功能时您必须时刻保持注意力。" + +msgid "" +"Use vision path predictions to estimate the appropriate speed to drive " +"through turns ahead." +msgstr "" +"使用视觉路径预测来估算通过前方弯道时的合适车速。" + +msgid "Vehicle" +msgstr "车辆型号" + +msgid "View the error log for sunnypilot crashes." +msgstr "查看导致Sunnypilot崩溃的错误日志。" + +msgid "Vision Model" +msgstr "视觉模型" + +msgid "Visuals" +msgstr "视觉" + +msgid "Wake Up Behavior" +msgstr "系统唤醒行为设置" + +msgid "Warning" +msgstr "超速警告" + +msgid "" +"Warning: Provides a warning when exceeding the current road's speed limit." +msgstr "" +"Warning 超速警告:超过当前道路限速时发出警告。" + +msgid "Welcome back!! We're excited to see you've enabled sunnylink again!" +msgstr "" +"欢迎回来!!很高兴您重新开启了sunnylink功能!" + +msgid "Welcome to sunnypilot" +msgstr "欢迎使用Sunnypilot" + +msgid "" +"When enabled, automatic software updates will be off.
This requires a " +"reboot to take effect." +msgstr "" +"启用后,软件更新将被禁用。 " +"
此操作需重启后方可生效。" + +msgid "" +"When enabled, pressing the accelerator pedal will disengage sunnypilot." +msgstr "" +"启用后,踩下油门踏板将取消sunnypilot。" + +msgid "" +"When enabled, sunnypilot will attempt to manage the built-in cruise control " +"buttons by emulating button presses for limited longitudinal control." +msgstr "" +"启用后,sunnypilot将通过模拟按键操作来管理原车巡航控制按键, " +"实现有限的纵向控制功能。" + +msgid "When enabled, the speedometer on the onroad screen is not displayed." +msgstr "" +"启用后,行驶时屏幕上的车速将不再显示。" + +msgid "When enabled, visual turn indicators are drawn on the HUD." +msgstr "" +"启用后,屏幕上将显示可视化的转向指示。" + +msgid "" +"When toggled on, this creates a prebuilt file to allow accelerated boot " +"times. When toggled off, it removes the prebuilt file so compilation of " +"locally edited cpp files can be made." +msgstr "" +"开启后,系统会生成预编译文件以缩短启动时间; " +"关闭后,预编译文件会立即被删除," +"从而允许重新编译本地修改的 cpp 文件。" + +msgid "Would you like to delete this log?" +msgstr "是否要删除此日志记录?" + +msgid "Yes" +msgstr "是" + +msgid "Yes, delete all maps" +msgstr "是的,删除所有地图" + +msgid "You must accept the Terms of Service in order to use sunnypilot." +msgstr "" +"您需要接受服务条款才能使用sunnypilot功能。" + +msgid "" +"You must accept the Terms of Service to use sunnypilot. Read the latest " +"terms at https://sunnypilot.ai/terms before continuing." +msgstr "" +"您必须接受服务条款才能使用sunnypilot。" +"使用前请在 https://sunnypilot.ai/terms 阅读最新条款。" + +msgid "Your vehicle will use the Default longitudinal tuning." +msgstr "您的车辆将采用默认的纵向控制参数设置。" + +msgid "Your vehicle will use the Dynamic longitudinal tuning." +msgstr "您的车辆将采用动态纵向控制参数设置。" + +msgid "Your vehicle will use the Predictive longitudinal tuning." +msgstr "您的车辆将采用预测性纵向控制参数设置。" + +msgid "backing up" +msgstr "正在备份" + +msgid "backup" +msgstr "备份" + +msgid "backup settings" +msgstr "备份设置" + +msgid "become a sunnypilot sponsor" +msgstr "成为sunnypilot赞助者" + +msgid "cancel download" +msgstr "取消下载" + +msgid "checking..." +msgstr "正在查找..." + +msgid "copyparty Service" +msgstr "Copyparty服务" + +msgid "" +"copyparty is a very capable file server, you can use it to download your " +"routes, view your logs and even make some edits on some files from your " +"browser. Requires you to connect to your comma locally via its IP address." +msgstr "" +"Copyparty是一个功能强大的文件服务器," +" 你可以使用它来下载你的路线,查看你的日志," +"甚至可以通过浏览器对某些文件进行一些编辑。 " +"它需要你通过其IP地址本地连接到你的comma。" + +msgid "current model" +msgstr "当前驾驶模型" + +msgid "default model" +msgstr "默认驾驶模型" + +msgid "downloading..." +msgstr "正在下载..." + +msgid "enable sunnylink" +msgstr "启用 sunnylink" + +msgid "failed" +msgstr "失败" + +msgid "finalizing update..." +msgstr "正在完成更新..." + +msgid "from cache" +msgstr "从缓存中" + +msgid "h" +msgstr "小时" + +msgid "m" +msgstr "分钟" + +msgid "pair" +msgstr "配对" + +msgid "pair with sunnylink" +msgstr "与 sunnylink 配对" + +msgid "paired" +msgstr "已配对" + +msgid "ready" +msgstr "准备" + +msgid "recommend disabling this feature if you experience these." +msgstr "" +"如果您遇到这些情况,请考虑禁用此功能。" + +msgid "restore" +msgstr "恢复" + +msgid "restore settings" +msgstr "恢复设置" + +msgid "restoring" +msgstr "正在恢复" + +msgid "s" +msgstr "秒" + +msgid "settings backed up" +msgstr "设置已备份" + +msgid "slide to backup" +msgstr "滑动以备份" + +msgid "slide to restore" +msgstr "滑动以恢复" + +msgid "sponsor" +msgstr "赞助者" + +msgid "sunnylink" +msgstr "sunnylink" + +msgid "sunnylink Dongle ID not found. " +msgstr "未找到 Dongle ID。" + +msgid "sunnylink Dongle ID not found. Please reboot & try again." +msgstr "未找到sunnylink ID。请重启设备并重试。" + +msgid "" +"sunnylink enables secured remote access to your comma device from anywhere, " +"including settings management, remote monitoring, real-time dashboard, etc." +msgstr "" +"Sunnylink功能可让您从任何地方" +"安全地访问您的comma设备,包括" +"设置管理、远程监控、实时仪表板等功能。" + +msgid "" +"sunnylink is designed to be enabled as part of sunnypilot's core " +"functionality. If sunnylink is disabled, features such as settings " +"management, remote monitoring, real-time dashboards will be unavailable." +msgstr "" +"Sunnylink被设计为sunnypilot核心功能的一部分。 " +"如果禁用Sunnylink,设置管理、远程监控、实时仪表板等功能将无法使用。" + +msgid "sunnylink uploader" +msgstr "sunnylink 上传器" + +msgid "sunnypilot Longitudinal Control (Alpha)" +msgstr "sunnypilot 纵向控制 (Alpha)" + +msgid "" +"sunnypilot Longitudinal Control is the default longitudinal control for this" +" platform." +msgstr "" +"sunnypilot 纵向控制是该车辆上的默认纵向控制。" + +msgid "sunnypilot Unavailable" +msgstr "无法使用 sunnypilot" + +msgid "" +"sunnypilot defaults to driving in chill mode. Experimental mode enables " +"alpha-level features that aren't ready for chill mode. Experimental features" +" are listed below:

End-to-End Longitudinal Control


Let the " +"driving model control the gas and brakes. sunnypilot will drive as it thinks" +" a human would, including stopping for red lights and stop signs. Since the " +"driving model decides the speed to drive, the set speed will only act as an " +"upper bound. This is an alpha quality feature; mistakes should be " +"expected.

New Driving Visualization


The driving visualization" +" will transition to the road-facing wide-angle camera at low speeds to " +"better show some turns. The Experimental mode logo will also be shown in the" +" top right corner." +msgstr "" +"sunnypilot默认以舒适模式驾驶。实验模式启用尚未准备好" +" 进入舒适模式的alpha级功能。实验功能如下所示: " +"

端到端纵向控制


让驾驶模型控制油门和刹车。 " +"sunnypilot将按照人类的驾驶方式来行驶,包括在红灯和停车标志前停车。 " +"由于驾驶模型决定行驶速度,设定速度仅作为上限。 " +"这是一个alpha质量的功能;应预期会出现错误。" +"

新的驾驶可视化


驾驶可视化 " +"将在低速时切换到面向道路的广角摄像头," +" 以更好地显示某些转弯。实验模式标识也将显示在右上角。" + +msgid "" +"sunnypilot is continuously calibrating, resetting is rarely required. " +"Resetting calibration will restart sunnypilot if the car is powered on." +msgstr "" +"sunnypilot 会持续进行校准,因此很少需要重置。 " +"如果车辆电源已开启,重置校准需要重新启动 sunnypilot" + +msgid "" +"sunnypilot learns to drive by watching humans, like you, drive.\n" +"\n" +"Firehose Mode allows you to maximize your training data uploads to improve openpilot's driving models. More data means bigger models, which means better Experimental Mode." +msgstr "" +"sunnypilot通过观察人类(比如您)驾驶来学习驾驶。\n" +"\n" +"训练数据上传模式 可让您最大化训练数据的上传量,以提升openpilot的驾驶模型性能。" +"数据越多,模型越大,实验模式的性能也就越好。" + +msgid "sunnypilot longitudinal control may come in a future update." +msgstr "" +"sunnypilot纵向控制可能会在未来的更新中提供。" + +msgid "" +"sunnypilot will not take over control of gas and brakes. Factory Toyota " +"longitudinal control will be used." +msgstr "" +"sunnypilot不会接管油门和刹车的控制权。 " +"系统将使用丰田原厂的纵向控制功能。" diff --git a/sunnypilot/selfdrive/selfdrived/events.py b/sunnypilot/selfdrive/selfdrived/events.py index e07afa05d..ef31fa8cb 100644 --- a/sunnypilot/selfdrive/selfdrived/events.py +++ b/sunnypilot/selfdrive/selfdrived/events.py @@ -29,7 +29,7 @@ IS_MICI = HARDWARE.get_device_type() == 'mici' def speed_limit_adjust_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: speedLimit = sm['longitudinalPlanSP'].speedLimit.resolver.speedLimit speed = round(speedLimit * (CV.MS_TO_KPH if metric else CV.MS_TO_MPH)) - message = f'Adjusting to {speed} {"km/h" if metric else "mph"} speed limit' + message = f'正在调整限速速度至 {speed} {"km/h" if metric else "mph"} ' return Alert( message, "", @@ -55,13 +55,13 @@ def speed_limit_pre_active_alert(CP: car.CarParams, CS: car.CarState, sm: messag pcm_long_required_max_set_speed_conv = round(pcm_long_required_max * speed_conv) speed_unit = "km/h" if metric else "mph" - alert_1_str = f"Speed Limit Assist: set to {pcm_long_required_max_set_speed_conv} {speed_unit} to engage" + alert_1_str = f"限速辅助:手动将设定速度更改为 {pcm_long_required_max_set_speed_conv} {speed_unit} 以激活" else: if IS_MICI: if set_speed_conv < speed_limit_final_last_conv: - alert_1_str = "Press + to confirm speed limit" + alert_1_str = "按 + 确认速度限制" elif set_speed_conv > speed_limit_final_last_conv: - alert_1_str = "Press - to confirm speed limit" + alert_1_str = "按 - 确认速度限制" else: alert_size = AlertSize.none @@ -99,16 +99,16 @@ EVENTS_SP: dict[int, dict[str, Alert | AlertCallbackType]] = { EventNameSP.manualSteeringRequired: { ET.USER_DISABLE: Alert( - "Automatic Lane Centering is OFF", - "Manual Steering Required", + "自动车道居中功能已关闭", + "请手动控制方向", AlertStatus.normal, AlertSize.mid, Priority.LOW, VisualAlert.none, AudibleAlert.disengage, 1.), }, EventNameSP.manualLongitudinalRequired: { ET.WARNING: Alert( - "Smart/Adaptive Cruise Control: OFF", - "Manual Speed Control Required", + "自适应巡航控制:关闭", + "请手动控制车速", AlertStatus.normal, AlertSize.mid, Priority.LOW, VisualAlert.none, AudibleAlert.none, 1.), }, @@ -123,7 +123,7 @@ EVENTS_SP: dict[int, dict[str, Alert | AlertCallbackType]] = { EventNameSP.silentBrakeHold: { ET.WARNING: EngagementAlert(AudibleAlert.none), - ET.NO_ENTRY: NoEntryAlert("Brake Hold Active"), + ET.NO_ENTRY: NoEntryAlert("正在使用刹车保持"), }, EventNameSP.silentWrongGear: { @@ -133,19 +133,19 @@ EVENTS_SP: dict[int, dict[str, Alert | AlertCallbackType]] = { AlertStatus.normal, AlertSize.none, Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.), ET.NO_ENTRY: Alert( - "Gear not D", - "openpilot Unavailable", + "请切换到D档", + "openpilot 暂不可用", AlertStatus.normal, AlertSize.none, Priority.LOW, VisualAlert.none, AudibleAlert.none, 0.), }, EventNameSP.silentReverseGear: { ET.PERMANENT: Alert( - "Reverse\nGear", + "倒车中\n请注意周围环境", "", AlertStatus.normal, AlertSize.full, Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2, creation_delay=0.5), - ET.NO_ENTRY: NoEntryAlert("Reverse Gear"), + ET.NO_ENTRY: NoEntryAlert("倒车中"), }, EventNameSP.silentDoorOpen: { @@ -154,7 +154,7 @@ EVENTS_SP: dict[int, dict[str, Alert | AlertCallbackType]] = { "", AlertStatus.normal, AlertSize.none, Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.), - ET.NO_ENTRY: NoEntryAlert("Door Open"), + ET.NO_ENTRY: NoEntryAlert("车门未关好"), }, EventNameSP.silentSeatbeltNotLatched: { @@ -163,7 +163,7 @@ EVENTS_SP: dict[int, dict[str, Alert | AlertCallbackType]] = { "", AlertStatus.normal, AlertSize.none, Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.), - ET.NO_ENTRY: NoEntryAlert("Seatbelt Unlatched"), + ET.NO_ENTRY: NoEntryAlert("请系好安全带"), }, EventNameSP.silentParkBrake: { @@ -172,16 +172,16 @@ EVENTS_SP: dict[int, dict[str, Alert | AlertCallbackType]] = { "", AlertStatus.normal, AlertSize.none, Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.), - ET.NO_ENTRY: NoEntryAlert("Parking Brake Engaged"), + ET.NO_ENTRY: NoEntryAlert("驻车制动已启用"), }, EventNameSP.controlsMismatchLateral: { - ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Controls Mismatch: Lateral"), - ET.NO_ENTRY: NoEntryAlert("Controls Mismatch: Lateral"), + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("控制不匹配:横向"), + ET.NO_ENTRY: NoEntryAlert("控制不匹配:横向"), }, EventNameSP.experimentalModeSwitched: { - ET.WARNING: NormalPermanentAlert("Experimental Mode Switched", duration=1.5) + ET.WARNING: NormalPermanentAlert("已切换到实验模式", duration=1.5) }, EventNameSP.wrongCarModeAlertOnly: { @@ -189,12 +189,12 @@ EVENTS_SP: dict[int, dict[str, Alert | AlertCallbackType]] = { }, EventNameSP.pedalPressedAlertOnly: { - ET.WARNING: NoEntryAlert("Pedal Pressed") + ET.WARNING: NoEntryAlert("踏板被踩下") }, EventNameSP.laneTurnLeft: { ET.WARNING: Alert( - "Turning Left", + "正在左转", "", AlertStatus.normal, AlertSize.small, Priority.LOW, VisualAlert.none, AudibleAlert.none, 1.), @@ -202,7 +202,7 @@ EVENTS_SP: dict[int, dict[str, Alert | AlertCallbackType]] = { EventNameSP.laneTurnRight: { ET.WARNING: Alert( - "Turning Right", + "正在右转", "", AlertStatus.normal, AlertSize.small, Priority.LOW, VisualAlert.none, AudibleAlert.none, 1.), @@ -210,7 +210,7 @@ EVENTS_SP: dict[int, dict[str, Alert | AlertCallbackType]] = { EventNameSP.speedLimitActive: { ET.WARNING: Alert( - "Auto adjusting to speed limit", + "正在自动调整至当前道路限速", "", AlertStatus.normal, AlertSize.small, Priority.LOW, VisualAlert.none, AudibleAlertSP.promptSingleHigh, 5.), @@ -218,7 +218,7 @@ EVENTS_SP: dict[int, dict[str, Alert | AlertCallbackType]] = { EventNameSP.speedLimitChanged: { ET.WARNING: Alert( - "Set speed changed", + "设定速度已更改", "", AlertStatus.normal, AlertSize.small, Priority.LOW, VisualAlert.none, AudibleAlertSP.promptSingleHigh, 5.), @@ -230,7 +230,7 @@ EVENTS_SP: dict[int, dict[str, Alert | AlertCallbackType]] = { EventNameSP.speedLimitPending: { ET.WARNING: Alert( - "Auto adjusting to last speed limit", + "正在自动调整至上个限速值", "", AlertStatus.normal, AlertSize.small, Priority.LOW, VisualAlert.none, AudibleAlertSP.promptSingleHigh, 5.),