translations: make selfdrived alerts translatable via po (tr_noop + extraction + renderer tr) with 101 Chinese alerts

This commit is contained in:
Comma Device
2026-08-15 22:02:39 +08:00
parent f65f7b7a72
commit 0ec3400af4
6 changed files with 986 additions and 178 deletions
+139 -137
View File
@@ -11,6 +11,8 @@ from openpilot.common.realtime import DT_CTRL
from openpilot.selfdrive.locationd.calibrationd import MIN_SPEED_FILTER
from openpilot.common.hardware import HARDWARE
from openpilot.system.ui.lib.multilang import tr_noop
from openpilot.sunnypilot.selfdrive.selfdrived.events_base import EventsBase, Priority, ET, Alert, \
NoEntryAlert, SoftDisableAlert, UserSoftDisableAlert, ImmediateDisableAlert, EngagementAlert, NormalPermanentAlert, \
StartupAlert, AlertCallbackType, wrong_car_mode_alert
@@ -72,7 +74,7 @@ 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(tr_noop("WARNING: This branch is not tested"), 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")
@@ -98,40 +100,40 @@ def calibration_incomplete_alert(CP: car.CarParams, CS: car.CarState, sm: messag
def too_distracted_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert:
if sm['driverMonitoringState'].lockout:
mins_left = sm['driverMonitoringState'].lockoutMinutesRemaining
return NoEntryAlert("Too Distracted", f"{mins_left} minute{'s' if mins_left != 1 else ''} Left", priority=Priority.HIGH)
return NoEntryAlert("Pay Attention to Engage", priority=Priority.HIGH)
return NoEntryAlert(tr_noop("Too Distracted"), f"{mins_left} minute{'s' if mins_left != 1 else ''} Left", priority=Priority.HIGH)
return NoEntryAlert(tr_noop("Pay Attention to Engage"), priority=Priority.HIGH)
# *** debug alerts ***
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(tr_noop("Out of Storage"), f"{full_perc}% full")
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")
return NoEntryAlert(msg, alert_text_1=tr_noop("Posenet Speed Invalid"))
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=tr_noop("Process Not Running"))
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=tr_noop("Communication Issue Between Processes"))
def camera_malfunction_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert:
all_cams = ('narrowRoadCameraState', 'cabinCameraState', '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(tr_noop("Camera Malfunction"), ', '.join(bad_cams))
def calibration_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert:
@@ -139,7 +141,7 @@ def calibration_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging
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)
return NormalPermanentAlert(tr_noop("Calibration Invalid"), angles)
def paramsd_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert:
@@ -156,7 +158,7 @@ def paramsd_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.Sub
title = "Abnormal tire stiffness"
text = f"Check tires, pressure, or alignment (Factor: {stiffness_factor:.1f})"
else:
return NoEntryAlert("paramsd Temporary Error")
return NoEntryAlert(tr_noop("paramsd Temporary Error"))
return NoEntryAlert(alert_text_1=title, alert_text_2=text)
@@ -164,22 +166,22 @@ 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(tr_noop("System Overheated"), 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(tr_noop("Low Memory"), f"{sm['deviceState'].memoryUsagePercent}% used")
def modeld_lagging_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert:
return NormalPermanentAlert("Driving Model Lagging", f"{sm['modelV2'].frameDropPerc:.1f}% frames dropped")
return NormalPermanentAlert(tr_noop("Driving Model Lagging"), f"{sm['modelV2'].frameDropPerc:.1f}% frames dropped")
def joystick_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert:
gb = sm['carControl'].actuators.accel / 4.
steer = sm['carControl'].actuators.torque
vals = f"Gas: {round(gb * 100.)}%, Steer: {round(steer * 100.)}%"
return NormalPermanentAlert("Joystick Mode", vals)
return NormalPermanentAlert(tr_noop("Joystick Mode"), vals)
def longitudinal_maneuver_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert:
@@ -198,14 +200,14 @@ def personality_changed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging
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 = tr_noop("Toggle stock LKAS on or off to engage")
if CP.brand == "tesla":
text = "Switch to Traffic-Aware Cruise Control to engage"
text = tr_noop("Switch to Traffic-Aware Cruise Control to engage")
elif CP.brand == "mazda":
text = "Enable your car's LKAS to engage"
text = tr_noop("Enable your car's LKAS to engage")
elif CP.brand == "nissan":
text = "Disable your car's stock LKAS to engage"
return NormalPermanentAlert("Invalid LKAS setting", text)
text = tr_noop("Disable your car's stock LKAS to engage")
return NormalPermanentAlert(tr_noop("Invalid LKAS setting"), text)
@@ -220,34 +222,34 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.joystickDebug: {
ET.WARNING: joystick_alert,
ET.PERMANENT: NormalPermanentAlert("Joystick Mode"),
ET.PERMANENT: NormalPermanentAlert(tr_noop("Joystick Mode")),
},
EventName.longitudinalManeuver: {
ET.WARNING: longitudinal_maneuver_alert,
ET.PERMANENT: NormalPermanentAlert("Longitudinal Maneuver Mode",
ET.PERMANENT: NormalPermanentAlert(tr_noop("Longitudinal Maneuver Mode"),
"Ensure road ahead is clear"),
},
EventName.bigModelLoading: {
ET.NO_ENTRY: NoEntryAlert("Big Model Loading"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Big Model Loading")),
},
EventName.bigModelFailed: {
ET.PERMANENT: NormalPermanentAlert("Big Model Failed ", "Restart the car to retry,\nnow driving on small model", duration=20.),
ET.PERMANENT: NormalPermanentAlert(tr_noop("Big Model Failed "), "Restart the car to retry,\nnow driving on small model", duration=20.),
},
EventName.lateralManeuver: {
ET.WARNING: longitudinal_maneuver_alert,
ET.PERMANENT: NormalPermanentAlert("Lateral Maneuver Mode"),
ET.PERMANENT: NormalPermanentAlert(tr_noop("Lateral Maneuver Mode")),
},
EventName.selfdriveInitializing: {
ET.NO_ENTRY: NoEntryAlert("System Initializing"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("System Initializing")),
},
EventName.startup: {
ET.PERMANENT: StartupAlert("Be ready to take over at any time")
ET.PERMANENT: StartupAlert(tr_noop("Be ready to take over at any time"))
},
EventName.startupMaster: {
@@ -255,68 +257,68 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
},
EventName.startupNoControl: {
ET.PERMANENT: StartupAlert("Dashcam mode"),
ET.NO_ENTRY: NoEntryAlert("Dashcam mode"),
ET.PERMANENT: StartupAlert(tr_noop("Dashcam mode")),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Dashcam mode")),
},
EventName.startupNoCar: {
ET.PERMANENT: StartupAlert("Dashcam mode for unsupported car"),
ET.PERMANENT: StartupAlert(tr_noop("Dashcam mode for unsupported car")),
},
EventName.startupNoSecOcKey: {
ET.PERMANENT: NormalPermanentAlert("Dashcam Mode",
ET.PERMANENT: NormalPermanentAlert(tr_noop("Dashcam Mode"),
"Security Key Not Available",
priority=Priority.HIGH),
},
EventName.dashcamMode: {
ET.PERMANENT: NormalPermanentAlert("Dashcam Mode",
ET.PERMANENT: NormalPermanentAlert(tr_noop("Dashcam Mode"),
priority=Priority.LOWEST),
},
EventName.invalidLkasSetting: {
ET.PERMANENT: invalid_lkas_setting_alert,
ET.NO_ENTRY: NoEntryAlert("Invalid LKAS setting"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Invalid LKAS setting")),
},
EventName.cruiseMismatch: {
#ET.PERMANENT: ImmediateDisableAlert("openpilot failed to cancel cruise"),
#ET.PERMANENT: ImmediateDisableAlert(tr_noop("openpilot failed to cancel cruise")),
},
# openpilot doesn't recognize the car. This switches openpilot into a
# 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",
ET.PERMANENT: NormalPermanentAlert(tr_noop("Dashcam Mode"),
"Car Unrecognized",
priority=Priority.LOWEST),
},
EventName.aeb: {
ET.PERMANENT: Alert(
"BRAKE!",
tr_noop("BRAKE!"),
"Emergency Braking: Risk of Collision",
AlertStatus.critical, AlertSize.full,
Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.none, 2.),
ET.NO_ENTRY: NoEntryAlert("AEB: Risk of Collision"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("AEB: Risk of Collision")),
},
EventName.stockAeb: {
ET.PERMANENT: Alert(
"BRAKE!",
tr_noop("BRAKE!"),
"Stock AEB: Risk of Collision",
AlertStatus.critical, AlertSize.full,
Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.none, 2.),
ET.NO_ENTRY: NoEntryAlert("Stock AEB: Risk of Collision"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Stock AEB: Risk of Collision")),
},
EventName.stockLkas: {
ET.NO_ENTRY: NoEntryAlert("Stock LKAS: Lane Departure Detected"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Stock LKAS: Lane Departure Detected")),
},
EventName.fcw: {
ET.PERMANENT: Alert(
"BRAKE!",
tr_noop("BRAKE!"),
"Risk of Collision",
AlertStatus.critical, AlertSize.full,
Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.warningSoft, 2.),
@@ -324,7 +326,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.ldw: {
ET.PERMANENT: Alert(
"Lane Departure Detected",
tr_noop("Lane Departure Detected"),
"",
AlertStatus.userPrompt, AlertSize.small,
Priority.LOW, VisualAlert.ldw, AudibleAlert.prompt, 3.),
@@ -334,7 +336,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.steerTempUnavailableSilent: {
ET.WARNING: Alert(
"Steering Assist Temporarily Unavailable",
tr_noop("Steering Assist Temporarily Unavailable"),
"",
AlertStatus.userPrompt, AlertSize.small,
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.prompt, 1.8),
@@ -342,7 +344,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.driverDistracted1: {
ET.PERMANENT: Alert(
"Pay Attention",
tr_noop("Pay Attention"),
"",
AlertStatus.normal, AlertSize.small,
Priority.LOW, VisualAlert.none, AudibleAlert.preAlert, .1),
@@ -350,7 +352,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.driverDistracted2: {
ET.PERMANENT: Alert(
"Pay Attention",
tr_noop("Pay Attention"),
"Driver Distracted",
AlertStatus.userPrompt, AlertSize.mid,
Priority.MID, VisualAlert.steerRequired, AudibleAlert.promptDistracted, .1),
@@ -358,7 +360,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.driverDistracted3: {
ET.PERMANENT: Alert(
"DISENGAGE IMMEDIATELY",
tr_noop("DISENGAGE IMMEDIATELY"),
"Driver Distracted",
AlertStatus.critical, AlertSize.full,
Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.warningImmediate, .1),
@@ -366,7 +368,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.driverUnresponsive1: {
ET.PERMANENT: Alert(
"Touch Steering Wheel: No Face Detected",
tr_noop("Touch Steering Wheel: No Face Detected"),
"",
AlertStatus.normal, AlertSize.small,
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .1),
@@ -374,7 +376,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.driverUnresponsive2: {
ET.PERMANENT: Alert(
"Touch Steering Wheel",
tr_noop("Touch Steering Wheel"),
"Driver Unresponsive",
AlertStatus.userPrompt, AlertSize.mid,
Priority.MID, VisualAlert.steerRequired, AudibleAlert.promptDistracted, .1),
@@ -382,7 +384,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.driverUnresponsive3: {
ET.PERMANENT: Alert(
"DISENGAGE IMMEDIATELY",
tr_noop("DISENGAGE IMMEDIATELY"),
"Driver Unresponsive",
AlertStatus.critical, AlertSize.full,
Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.warningImmediate, .1),
@@ -390,7 +392,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.manualRestart: {
ET.WARNING: Alert(
"TAKE CONTROL",
tr_noop("TAKE CONTROL"),
"Resume Driving Manually",
AlertStatus.userPrompt, AlertSize.mid,
Priority.LOW, VisualAlert.none, AudibleAlert.none, .2),
@@ -398,7 +400,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.resumeRequired: {
ET.WARNING: Alert(
"Press Resume to Exit Standstill",
tr_noop("Press Resume to Exit Standstill"),
"",
AlertStatus.userPrompt, AlertSize.small,
Priority.LOW, VisualAlert.none, AudibleAlert.none, .2),
@@ -410,7 +412,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.preLaneChangeLeft: {
ET.WARNING: Alert(
"Steer Left to Start Lane Change Once Safe",
tr_noop("Steer Left to Start Lane Change Once Safe"),
"",
AlertStatus.normal, AlertSize.small,
Priority.LOW, VisualAlert.none, AudibleAlert.none, .1),
@@ -418,7 +420,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.preLaneChangeRight: {
ET.WARNING: Alert(
"Steer Right to Start Lane Change Once Safe",
tr_noop("Steer Right to Start Lane Change Once Safe"),
"",
AlertStatus.normal, AlertSize.small,
Priority.LOW, VisualAlert.none, AudibleAlert.none, .1),
@@ -426,7 +428,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.laneChangeBlocked: {
ET.WARNING: Alert(
"Car Detected in Blindspot",
tr_noop("Car Detected in Blindspot"),
"",
AlertStatus.userPrompt, AlertSize.small,
Priority.LOW, VisualAlert.none, AudibleAlert.prompt, .1),
@@ -434,7 +436,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.laneChange: {
ET.WARNING: Alert(
"Changing Lanes",
tr_noop("Changing Lanes"),
"",
AlertStatus.normal, AlertSize.small,
Priority.LOW, VisualAlert.none, AudibleAlert.none, .1),
@@ -442,7 +444,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.steerSaturated: {
ET.WARNING: Alert(
"Take Control",
tr_noop("Take Control"),
"Turn Exceeds Steering Limit",
AlertStatus.userPrompt, AlertSize.mid,
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.promptRepeat, 2.),
@@ -450,33 +452,33 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
# Thrown when the fan is driven at >50% but is not rotating
EventName.fanMalfunction: {
ET.PERMANENT: NormalPermanentAlert("Fan Malfunction", "Contact comma.ai/support"),
ET.PERMANENT: NormalPermanentAlert(tr_noop("Fan Malfunction"), "Contact comma.ai/support"),
},
# 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(tr_noop("Camera Malfunction: Reboot Your Device")),
},
# Camera framerate too low
EventName.cameraFrameRate: {
ET.PERMANENT: NormalPermanentAlert("Camera Frame Rate Low", "Reboot your Device"),
ET.PERMANENT: NormalPermanentAlert(tr_noop("Camera Frame Rate Low"), "Reboot your Device"),
ET.SOFT_DISABLE: soft_disable_alert("Camera Frame Rate Low"),
ET.NO_ENTRY: NoEntryAlert("Camera Frame Rate Low: Reboot Your Device"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Camera Frame Rate Low: Reboot Your Device")),
},
# Unused
EventName.locationdTemporaryError: {
ET.NO_ENTRY: NoEntryAlert("locationd Temporary Error"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("locationd Temporary Error")),
ET.SOFT_DISABLE: soft_disable_alert("locationd Temporary Error"),
},
EventName.locationdPermanentError: {
ET.NO_ENTRY: NoEntryAlert("locationd Permanent Error"),
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("locationd Permanent Error"),
ET.PERMANENT: NormalPermanentAlert("locationd Permanent Error"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("locationd Permanent Error")),
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert(tr_noop("locationd Permanent Error")),
ET.PERMANENT: NormalPermanentAlert(tr_noop("locationd Permanent Error")),
},
# openpilot tries to learn certain parameters about your car by observing
@@ -493,9 +495,9 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
},
EventName.paramsdPermanentError: {
ET.NO_ENTRY: NoEntryAlert("paramsd Permanent Error"),
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("paramsd Permanent Error"),
ET.PERMANENT: NormalPermanentAlert("paramsd Permanent Error"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("paramsd Permanent Error")),
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert(tr_noop("paramsd Permanent Error")),
ET.PERMANENT: NormalPermanentAlert(tr_noop("paramsd Permanent Error")),
},
# ********** events that affect controls state transitions **********
@@ -514,12 +516,12 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.buttonCancel: {
ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage),
ET.NO_ENTRY: NoEntryAlert("Cancel Pressed"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Cancel Pressed")),
},
EventName.brakeHold: {
ET.WARNING: Alert(
"Press Resume to Exit Brake Hold",
tr_noop("Press Resume to Exit Brake Hold"),
"",
AlertStatus.userPrompt, AlertSize.small,
Priority.LOW, VisualAlert.none, AudibleAlert.none, .2),
@@ -527,23 +529,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(tr_noop("Parking Brake Engaged")),
},
EventName.pedalPressed: {
ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage),
ET.NO_ENTRY: NoEntryAlert("Pedal Pressed",
ET.NO_ENTRY: NoEntryAlert(tr_noop("Pedal Pressed"),
visual_alert=VisualAlert.brakePressed),
},
EventName.steerDisengage: {
ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage),
ET.NO_ENTRY: NoEntryAlert("Steering Pressed"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Steering Pressed")),
},
EventName.preEnableStandstill: {
ET.PRE_ENABLE: Alert(
"Release Brake to Engage",
tr_noop("Release Brake to Engage"),
"",
AlertStatus.normal, AlertSize.small,
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .1, creation_delay=1.),
@@ -551,7 +553,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.gasPressedOverride: {
ET.OVERRIDE_LONGITUDINAL: Alert(
"",
tr_noop(""),
"",
AlertStatus.normal, AlertSize.none,
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .1),
@@ -559,7 +561,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.steerOverride: {
ET.OVERRIDE_LATERAL: Alert(
"",
tr_noop(""),
"",
AlertStatus.normal, AlertSize.none,
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .1),
@@ -571,31 +573,31 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
},
EventName.resumeBlocked: {
ET.NO_ENTRY: NoEntryAlert("Press Set to Engage"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Press Set to Engage")),
},
EventName.carNotReady: {
ET.NO_ENTRY: NoEntryAlert("Car Not Ready"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Car Not Ready")),
},
EventName.wrongCruiseMode: {
ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage),
ET.NO_ENTRY: NoEntryAlert("Adaptive Cruise Disabled"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Adaptive Cruise Disabled")),
},
EventName.steerTempUnavailable: {
ET.SOFT_DISABLE: soft_disable_alert("Steering Assist Temporarily Unavailable"),
ET.NO_ENTRY: NoEntryAlert("Steering Temporarily Unavailable"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Steering Temporarily Unavailable")),
},
EventName.steerTimeLimit: {
ET.SOFT_DISABLE: soft_disable_alert("Vehicle Steering Time Limit"),
ET.NO_ENTRY: NoEntryAlert("Vehicle Steering Time Limit"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Vehicle Steering Time Limit")),
},
EventName.outOfSpace: {
ET.PERMANENT: out_of_space_alert,
ET.NO_ENTRY: NoEntryAlert("Out of Storage"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Out of Storage")),
},
EventName.belowEngageSpeed: {
@@ -604,11 +606,11 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.sensorDataInvalid: {
ET.PERMANENT: Alert(
"Sensor Data Invalid",
tr_noop("Sensor Data Invalid"),
"Contact comma.ai/support",
AlertStatus.normal, AlertSize.mid,
Priority.LOWER, VisualAlert.none, AudibleAlert.none, .2, creation_delay=1.),
ET.NO_ENTRY: NoEntryAlert("Sensor Data Invalid"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Sensor Data Invalid")),
ET.SOFT_DISABLE: soft_disable_alert("Sensor Data Invalid"),
},
@@ -618,18 +620,18 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.excessiveActuation: {
ET.SOFT_DISABLE: soft_disable_alert("Excessive Actuation"),
ET.NO_ENTRY: NoEntryAlert("Excessive Actuation"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Excessive Actuation")),
},
EventName.overheat: {
ET.PERMANENT: overheat_alert,
ET.SOFT_DISABLE: soft_disable_alert("System Overheated"),
ET.NO_ENTRY: NoEntryAlert("System Overheated"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("System Overheated")),
},
EventName.wrongGear: {
ET.SOFT_DISABLE: user_soft_disable_alert("Gear not D"),
ET.NO_ENTRY: NoEntryAlert("Gear not D"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Gear not D")),
},
# This alert is thrown when the calibration angles are outside of the acceptable range.
@@ -640,34 +642,34 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
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.NO_ENTRY: NoEntryAlert(tr_noop("Calibration Invalid: Remount Device & Recalibrate")),
},
EventName.calibrationIncomplete: {
ET.PERMANENT: calibration_incomplete_alert,
ET.SOFT_DISABLE: soft_disable_alert("Calibration Incomplete"),
ET.NO_ENTRY: NoEntryAlert("Calibration in Progress"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Calibration in Progress")),
},
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.NO_ENTRY: NoEntryAlert(tr_noop("Remount Detected: Recalibrating")),
},
EventName.doorOpen: {
ET.SOFT_DISABLE: user_soft_disable_alert("Door Open"),
ET.NO_ENTRY: NoEntryAlert("Door Open"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Door Open")),
},
EventName.seatbeltNotLatched: {
ET.SOFT_DISABLE: user_soft_disable_alert("Seatbelt Unlatched"),
ET.NO_ENTRY: NoEntryAlert("Seatbelt Unlatched"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Seatbelt Unlatched")),
},
EventName.espDisabled: {
ET.SOFT_DISABLE: soft_disable_alert("Electronic Stability Control Disabled"),
ET.NO_ENTRY: NoEntryAlert("Electronic Stability Control Disabled"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Electronic Stability Control Disabled")),
},
# Different openpilot services communicate between each other at a certain
@@ -680,12 +682,12 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
},
EventName.commIssueAvgFreq: {
ET.SOFT_DISABLE: soft_disable_alert("Low Communication Rate Between Processes"),
ET.NO_ENTRY: NoEntryAlert("Low Communication Rate Between Processes"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Low Communication Rate Between Processes")),
},
EventName.selfdrivedLagging: {
ET.SOFT_DISABLE: soft_disable_alert("System Lagging"),
ET.NO_ENTRY: NoEntryAlert("Selfdrive Process Lagging: Reboot Your Device"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Selfdrive Process Lagging: Reboot Your Device")),
},
# Thrown when manager detects a service exited unexpectedly while driving
@@ -696,12 +698,12 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.radarFault: {
ET.SOFT_DISABLE: soft_disable_alert("Radar Error: Restart the Car"),
ET.NO_ENTRY: NoEntryAlert("Radar Error: Restart the Car"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Radar Error: Restart the Car")),
},
EventName.radarTempUnavailable: {
ET.SOFT_DISABLE: soft_disable_alert("Radar Temporarily Unavailable"),
ET.NO_ENTRY: NoEntryAlert("Radar Temporarily Unavailable"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Radar Temporarily Unavailable")),
},
# Every frame from the camera should be processed by the model. If modeld
@@ -709,7 +711,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
# thrown when over 20% of frames are dropped.
EventName.modeldLagging: {
ET.SOFT_DISABLE: soft_disable_alert("Driving Model Lagging"),
ET.NO_ENTRY: NoEntryAlert("Driving Model Lagging"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Driving Model Lagging")),
ET.PERMANENT: modeld_lagging_alert,
},
@@ -726,23 +728,23 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName.lowMemory: {
ET.SOFT_DISABLE: soft_disable_alert("Low Memory: Reboot Your Device"),
ET.PERMANENT: low_memory_alert,
ET.NO_ENTRY: NoEntryAlert("Low Memory: Reboot Your Device"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Low Memory: Reboot Your Device")),
},
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(tr_noop("Cruise Fault: Restart the Car")),
ET.PERMANENT: NormalPermanentAlert(tr_noop("Cruise Fault: Restart the car to engage")),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Cruise Fault: Restart the Car")),
},
EventName.espActive: {
ET.SOFT_DISABLE: soft_disable_alert("Electronic Stability Control Active"),
ET.NO_ENTRY: NoEntryAlert("Electronic Stability Control Active"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Electronic Stability Control Active")),
},
EventName.controlsMismatch: {
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Controls Mismatch"),
ET.NO_ENTRY: NoEntryAlert("Controls Mismatch"),
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert(tr_noop("Controls Mismatch")),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Controls Mismatch")),
},
# This alert can be thrown for the following reasons:
@@ -750,45 +752,45 @@ 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(tr_noop("Unknown Vehicle Variant")),
ET.PERMANENT: Alert(
"Unknown Vehicle Variant",
tr_noop("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(tr_noop("Unknown Vehicle Variant")),
},
EventName.canBusMissing: {
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("CAN Bus Disconnected"),
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert(tr_noop("CAN Bus Disconnected")),
ET.PERMANENT: Alert(
"CAN Bus Disconnected: Likely Faulty Cable",
tr_noop("CAN Bus Disconnected: Likely Faulty Cable"),
"",
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(tr_noop("CAN Bus Disconnected: Check Connections")),
},
EventName.steerUnavailable: {
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("LKAS Fault: Restart the Car"),
ET.PERMANENT: NormalPermanentAlert("LKAS Fault: Restart the car to engage"),
ET.NO_ENTRY: NoEntryAlert("LKAS Fault: Restart the Car"),
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert(tr_noop("LKAS Fault: Restart the Car")),
ET.PERMANENT: NormalPermanentAlert(tr_noop("LKAS Fault: Restart the car to engage")),
ET.NO_ENTRY: NoEntryAlert(tr_noop("LKAS Fault: Restart the Car")),
},
EventName.reverseGear: {
ET.PERMANENT: Alert(
"Reverse\nGear",
tr_noop("Reverse\nGear"),
"",
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(tr_noop("Reverse Gear")),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Reverse Gear")),
},
# 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(tr_noop("Cruise Is Off")),
},
# When the relay in the harness box opens the CAN bus between the LKAS camera
@@ -796,14 +798,14 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
# are received on the car side this usually means the relay hasn't opened correctly
# and this alert is thrown.
EventName.relayMalfunction: {
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Harness Relay Malfunction"),
ET.PERMANENT: NormalPermanentAlert("Harness Relay Malfunction", "Contact comma.ai/support"),
ET.NO_ENTRY: NoEntryAlert("Harness Relay Malfunction"),
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert(tr_noop("Harness Relay Malfunction")),
ET.PERMANENT: NormalPermanentAlert(tr_noop("Harness Relay Malfunction"), "Contact comma.ai/support"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Harness Relay Malfunction")),
},
EventName.speedTooLow: {
ET.IMMEDIATE_DISABLE: Alert(
"openpilot Canceled",
tr_noop("openpilot Canceled"),
"Speed too low",
AlertStatus.normal, AlertSize.mid,
Priority.HIGH, VisualAlert.none, AudibleAlert.disengage, 3.),
@@ -812,17 +814,17 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
# When the car is driving faster than most cars in the training data, the model outputs can be unpredictable.
EventName.speedTooHigh: {
ET.WARNING: Alert(
"Speed Too High",
tr_noop("Speed Too High"),
"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(tr_noop("Slow down to engage")),
},
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(tr_noop("Vehicle Sensors Invalid")),
ET.PERMANENT: NormalPermanentAlert(tr_noop("Vehicle Sensors Calibrating"), "Drive to Calibrate"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Vehicle Sensors Calibrating")),
},
EventName.personalityChanged: {
@@ -830,7 +832,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
},
EventName.userBookmark: {
ET.PERMANENT: NormalPermanentAlert("Bookmark Saved", duration=1.5),
ET.PERMANENT: NormalPermanentAlert(tr_noop("Bookmark Saved"), duration=1.5),
},
}
@@ -839,49 +841,49 @@ if HARDWARE.get_device_type() == 'mici':
EVENTS.update({
EventName.driverDistracted1: {
ET.PERMANENT: Alert(
"Pay Attention",
tr_noop("Pay Attention"),
"",
AlertStatus.normal, AlertSize.small,
Priority.LOW, VisualAlert.none, AudibleAlert.preAlert, 2),
},
EventName.driverDistracted2: {
ET.PERMANENT: Alert(
"Pay Attention",
tr_noop("Pay Attention"),
"Driver Distracted",
AlertStatus.userPrompt, AlertSize.mid,
Priority.MID, VisualAlert.steerRequired, AudibleAlert.promptDistracted, 1),
},
EventName.resumeRequired: {
ET.WARNING: Alert(
"Press Resume",
tr_noop("Press Resume"),
"",
AlertStatus.userPrompt, AlertSize.small,
Priority.LOW, VisualAlert.none, AudibleAlert.none, .2),
},
EventName.preLaneChangeLeft: {
ET.WARNING: Alert(
"Steer Left",
tr_noop("Steer Left"),
"Confirm Lane Change",
AlertStatus.normal, AlertSize.mid,
Priority.LOW, VisualAlert.none, AudibleAlert.none, .1),
},
EventName.preLaneChangeRight: {
ET.WARNING: Alert(
"Steer Right",
tr_noop("Steer Right"),
"Confirm Lane Change",
AlertStatus.normal, AlertSize.mid,
Priority.LOW, VisualAlert.none, AudibleAlert.none, .1),
},
EventName.laneChangeBlocked: {
ET.WARNING: Alert(
"Car in Blindspot",
tr_noop("Car in Blindspot"),
"",
AlertStatus.userPrompt, AlertSize.small,
Priority.LOW, VisualAlert.none, AudibleAlert.prompt, .1),
},
EventName.steerSaturated: {
ET.WARNING: Alert(
"take control",
tr_noop("take control"),
"turn exceeds limit",
AlertStatus.userPrompt, AlertSize.mid,
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.promptRepeat, 2.),
@@ -889,16 +891,16 @@ if HARDWARE.get_device_type() == 'mici':
EventName.calibrationIncomplete: {
ET.PERMANENT: calibration_incomplete_alert,
ET.SOFT_DISABLE: soft_disable_alert("Calibration Incomplete"),
ET.NO_ENTRY: NoEntryAlert("Calibrating"),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Calibrating")),
},
EventName.reverseGear: {
ET.PERMANENT: Alert(
"Reverse",
tr_noop("Reverse"),
"",
AlertStatus.normal, AlertSize.full,
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2, creation_delay=0.5),
ET.USER_DISABLE: ImmediateDisableAlert("Reverse"),
ET.NO_ENTRY: NoEntryAlert("Reverse"),
ET.USER_DISABLE: ImmediateDisableAlert(tr_noop("Reverse")),
ET.NO_ENTRY: NoEntryAlert(tr_noop("Reverse")),
},
})
@@ -148,7 +148,7 @@ class AlertRenderer(Widget, SpeedLimitAlertRenderer):
return None
# Return current alert
ret = Alert(text1=ss.alertText1, text2=ss.alertText2, size=ss.alertSize.raw, status=ss.alertStatus.raw,
ret = Alert(text1=tr(ss.alertText1), text2=tr(ss.alertText2), size=ss.alertSize.raw, status=ss.alertStatus.raw,
visual_alert=ss.alertHudVisual, alert_type=ss.alertType)
self._prev_alert = ret
return ret
@@ -112,7 +112,7 @@ class AlertRenderer(Widget):
return None
# Return current alert
return Alert(text1=ss.alertText1, text2=ss.alertText2, size=ss.alertSize.raw, status=ss.alertStatus.raw)
return Alert(text1=tr(ss.alertText1), text2=tr(ss.alertText2), size=ss.alertSize.raw, status=ss.alertStatus.raw)
def _render(self, rect: rl.Rectangle):
alert = self.get_alert(ui_state.sm)
+421 -15
View File
@@ -127,7 +127,6 @@ msgstr ""
msgid "Hidden Network"
msgstr ""
#: openpilot/selfdrive/ui/layouts/sidebar.py
#: openpilot/system/ui/widgets/network.py
msgid "CONNECT"
msgstr ""
@@ -381,7 +380,7 @@ msgid "GOOD"
msgstr ""
#: openpilot/selfdrive/ui/layouts/sidebar.py
msgid "VEHICLE"
msgid "VI"
msgstr ""
#: openpilot/selfdrive/ui/layouts/sidebar.py
@@ -389,6 +388,10 @@ msgstr ""
msgid "ONLINE"
msgstr ""
#: openpilot/selfdrive/ui/layouts/sidebar.py
msgid "RA"
msgstr ""
#: openpilot/selfdrive/ui/layouts/sidebar.py
#: openpilot/selfdrive/ui/sunnypilot/layouts/sidebar.py
msgid "OFFLINE"
@@ -398,10 +401,6 @@ msgstr ""
msgid "Unknown"
msgstr ""
#: openpilot/selfdrive/ui/layouts/sidebar.py
msgid "HIGH"
msgstr ""
#: openpilot/selfdrive/ui/layouts/sidebar.py
msgid "NO"
msgstr ""
@@ -734,7 +733,6 @@ msgid "Software"
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/settings.py
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/settings.py
msgid "Firehose"
msgstr ""
@@ -850,10 +848,12 @@ msgstr ""
msgid "Joystick Debug Mode"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
#: openpilot/selfdrive/ui/layouts/settings/developer.py
msgid "Longitudinal Maneuver Mode"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
#: openpilot/selfdrive/ui/layouts/settings/developer.py
msgid "Lateral Maneuver Mode"
msgstr ""
@@ -1377,14 +1377,6 @@ msgstr ""
msgid "Display"
msgstr ""
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/settings.py
msgid "OSM"
msgstr ""
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/settings.py
msgid "Trips"
msgstr ""
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/settings.py
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/platform_selector.py
msgid "Vehicle"
@@ -2390,3 +2382,417 @@ msgid_plural "{} segments of your driving is in the training dataset so far."
msgstr[0] ""
msgstr[1] ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Toggle stock LKAS on or off to engage"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "WARNING: This branch is not tested"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Pay Attention to Engage"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Out of Storage"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Camera Malfunction"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Calibration Invalid"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "System Overheated"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Low Memory"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Driving Model Lagging"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Joystick Mode"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Switch to Traffic-Aware Cruise Control to engage"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Invalid LKAS setting"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Too Distracted"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Posenet Speed Invalid"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Process Not Running"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Communication Issue Between Processes"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Enable your car's LKAS to engage"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Big Model Loading"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Big Model Failed "
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "System Initializing"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Be ready to take over at any time"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Dashcam mode"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Dashcam mode for unsupported car"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Dashcam Mode"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "BRAKE!"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "AEB: Risk of Collision"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Stock AEB: Risk of Collision"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Stock LKAS: Lane Departure Detected"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Lane Departure Detected"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Steering Assist Temporarily Unavailable"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Pay Attention"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "DISENGAGE IMMEDIATELY"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Touch Steering Wheel: No Face Detected"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Touch Steering Wheel"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "TAKE CONTROL"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Press Resume to Exit Standstill"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Steer Left to Start Lane Change Once Safe"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Steer Right to Start Lane Change Once Safe"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Car Detected in Blindspot"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Changing Lanes"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Take Control"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Fan Malfunction"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Camera Malfunction: Reboot Your Device"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Camera Frame Rate Low"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Camera Frame Rate Low: Reboot Your Device"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "locationd Temporary Error"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "locationd Permanent Error"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "paramsd Permanent Error"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Cancel Pressed"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Press Resume to Exit Brake Hold"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Parking Brake Engaged"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Pedal Pressed"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Steering Pressed"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Release Brake to Engage"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid ""
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Press Set to Engage"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Car Not Ready"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Adaptive Cruise Disabled"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Steering Temporarily Unavailable"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Vehicle Steering Time Limit"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Sensor Data Invalid"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Excessive Actuation"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Gear not D"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Calibration Invalid: Remount Device & Recalibrate"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Calibration in Progress"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Remount Detected: Recalibrating"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Door Open"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Seatbelt Unlatched"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Electronic Stability Control Disabled"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Low Communication Rate Between Processes"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Selfdrive Process Lagging: Reboot Your Device"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Radar Error: Restart the Car"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Radar Temporarily Unavailable"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Low Memory: Reboot Your Device"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Cruise Fault: Restart the Car"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Cruise Fault: Restart the car to engage"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Electronic Stability Control Active"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Controls Mismatch"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Unknown Vehicle Variant"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "CAN Bus Disconnected"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "CAN Bus Disconnected: Likely Faulty Cable"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "CAN Bus Disconnected: Check Connections"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "LKAS Fault: Restart the Car"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "LKAS Fault: Restart the car to engage"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid ""
"Reverse\n"
"Gear"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Reverse Gear"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Cruise Is Off"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Harness Relay Malfunction"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "openpilot Canceled"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Speed Too High"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Slow down to engage"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Vehicle Sensors Invalid"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Vehicle Sensors Calibrating"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Bookmark Saved"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Disable your car's stock LKAS to engage"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "paramsd Temporary Error"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Press Resume"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Steer Left"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Steer Right"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Car in Blindspot"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "take control"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Calibrating"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Reverse"
msgstr ""
+422 -23
View File
@@ -84,6 +84,10 @@ msgstr "激活"
msgid "ADD"
msgstr "添加"
#: openpilot/selfdrive/selfdrived/events.py
msgid "AEB: Risk of Collision"
msgstr "AEB:碰撞风险"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/trips.py
msgid "ALL TIME"
msgstr "全部时间"
@@ -100,6 +104,10 @@ msgstr "确认过度作动"
msgid "Actuator Delay:"
msgstr "执行器延迟:"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Adaptive Cruise Disabled"
msgstr "自适应巡航已禁用"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/models.py
msgid "Adjust Camera Offset"
msgstr "调整摄像头偏移"
@@ -212,6 +220,10 @@ msgstr "转向灯自动变道"
msgid "Auto Lane Change: Delay with Blind Spot"
msgstr "自动变道:盲区延迟"
#: openpilot/selfdrive/selfdrived/events.py
msgid "BRAKE!"
msgstr "刹车!"
#: openpilot/selfdrive/ui/layouts/onboarding.py
#: openpilot/selfdrive/ui/sunnypilot/layouts/onboarding.py
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/cruise_sub_layouts/speed_limit_policy.py
@@ -231,6 +243,10 @@ msgstr "备份失败"
msgid "Backup Settings"
msgstr "备份设置"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Be ready to take over at any time"
msgstr "随时准备接管"
#: openpilot/selfdrive/ui/widgets/prime.py
msgid "Become a comma prime member at connect.comma.ai"
msgstr "前往 connect.comma.ai 成为 comma prime 会员"
@@ -239,6 +255,14 @@ msgstr "前往 connect.comma.ai 成为 comma prime 会员"
msgid "Become a sponsor of sunnypilot to get early access to sunnylink features when they become available."
msgstr "成为 sunnypilot 赞助者,抢先体验 sunnylink 即将推出的功能。"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Big Model Failed "
msgstr "大模型加载失败"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Big Model Loading"
msgstr "大模型加载中"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/steering_sub_layouts/lane_change_settings.py
msgid "Block Lane Change: Road Edge Detection"
msgstr "阻断变道:道路边缘检测"
@@ -247,6 +271,10 @@ msgstr "阻断变道:道路边缘检测"
msgid "Blocks the lane change if the model sees a road edge on your signaled side."
msgstr "如果模型在您打灯一侧检测到道路边缘,则阻止变道。"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Bookmark Saved"
msgstr "已保存书签"
#: openpilot/selfdrive/ui/widgets/pairing_dialog.py
msgid "Bookmark connect.comma.ai to your home screen to use it like an app"
msgstr "将 connect.comma.ai 添加到主屏幕,像应用一样使用"
@@ -255,6 +283,18 @@ msgstr "将 connect.comma.ai 添加到主屏幕,像应用一样使用"
msgid "Bottom"
msgstr "底部"
#: openpilot/selfdrive/selfdrived/events.py
msgid "CAN Bus Disconnected"
msgstr "CAN 总线断开"
#: openpilot/selfdrive/selfdrived/events.py
msgid "CAN Bus Disconnected: Check Connections"
msgstr "CAN 总线断开:请检查连接"
#: openpilot/selfdrive/selfdrived/events.py
msgid "CAN Bus Disconnected: Likely Faulty Cable"
msgstr "CAN 总线断开:可能是线缆故障"
#: openpilot/selfdrive/ui/layouts/settings/device.py
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/device.py
msgid "CHANGE"
@@ -273,19 +313,46 @@ msgstr "安稳模式已开启"
msgid "CLEAR"
msgstr "清除"
#: openpilot/selfdrive/ui/layouts/sidebar.py
#: openpilot/system/ui/widgets/network.py
msgid "CONNECT"
msgstr "连接"
#: openpilot/selfdrive/ui/layouts/sidebar.py
msgid "RA"
msgstr "远程协助"
#: openpilot/system/ui/widgets/network.py
msgid "CONNECTING..."
msgstr "连接中..."
#: openpilot/selfdrive/selfdrived/events.py
msgid "Calibrating"
msgstr "正在标定"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Calibration Invalid"
msgstr "标定无效"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Calibration Invalid: Remount Device & Recalibrate"
msgstr "标定无效:请重新安装设备并重新标定"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Calibration in Progress"
msgstr "标定进行中"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Camera Frame Rate Low"
msgstr "摄像头帧率过低"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Camera Frame Rate Low: Reboot Your Device"
msgstr "摄像头帧率过低:请重启设备"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Camera Malfunction"
msgstr "摄像头故障"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Camera Malfunction: Reboot Your Device"
msgstr "摄像头故障:请重启设备"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/models.py
#: openpilot/system/ui/widgets/confirm_dialog.py
#: openpilot/system/ui/widgets/keyboard.py
@@ -298,6 +365,14 @@ msgstr "取消"
msgid "Cancel Download"
msgstr "取消下载"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Cancel Pressed"
msgstr "已按取消"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Car Detected in Blindspot"
msgstr "盲区检测到车辆"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/cruise_sub_layouts/speed_limit_policy.py
msgid "Car First"
msgstr "优先车辆数据"
@@ -306,6 +381,10 @@ msgstr "优先车辆数据"
msgid "Car First: Use Speed Limit data from Car if available, else use from OpenStreetMaps"
msgstr "优先车辆数据:优先使用车辆限速数据,否则使用 OpenStreetMaps 数据"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Car Not Ready"
msgstr "车辆未就绪"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/cruise_sub_layouts/speed_limit_policy.py
msgid "Car Only"
msgstr "仅车辆数据"
@@ -314,6 +393,10 @@ msgstr "仅车辆数据"
msgid "Car Only: Use Speed Limit data only from Car"
msgstr "仅车辆数据:仅使用车辆的限速数据"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Car in Blindspot"
msgstr "盲区有车辆"
#: openpilot/system/ui/widgets/network.py
msgid "Cellular Metered"
msgstr "蜂窝计量"
@@ -323,6 +406,10 @@ msgstr "蜂窝计量"
msgid "Change Language"
msgstr "更改语言"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Changing Lanes"
msgstr "正在变道"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Changing this setting will restart sunnypilot if the car is powered on."
msgstr "如果车辆已通电,更改此设置将重启 sunnypilot。"
@@ -367,11 +454,19 @@ msgstr "组合"
msgid "Combined: Use combined Speed Limit data from Car & OpenStreetMaps"
msgstr "组合:使用车辆与 OpenStreetMaps 的组合限速数据"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Communication Issue Between Processes"
msgstr "进程间通信异常"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/device.py
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/platform_selector.py
msgid "Confirm"
msgstr "确认"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Controls Mismatch"
msgstr "控制不匹配"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/device.py
msgid "Controls state of the device after boot/sleep."
msgstr "控制设备开机/休眠后的状态。"
@@ -388,6 +483,18 @@ msgstr "国家/地区"
msgid "Cruise"
msgstr "巡航"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Cruise Fault: Restart the Car"
msgstr "巡航故障:请重启车辆"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Cruise Fault: Restart the car to engage"
msgstr "巡航故障:请重启车辆后启用"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Cruise Is Off"
msgstr "巡航已关闭"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/models.py
msgid "Current Model"
msgstr "当前模型"
@@ -428,10 +535,26 @@ msgstr "删除"
msgid "DISABLED"
msgstr "已禁用"
#: openpilot/selfdrive/selfdrived/events.py
msgid "DISENGAGE IMMEDIATELY"
msgstr "立即退出"
#: openpilot/selfdrive/ui/layouts/settings/software.py
msgid "DOWNLOAD"
msgstr "下载"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Dashcam Mode"
msgstr "行车记录模式"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Dashcam mode"
msgstr "行车记录模式"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Dashcam mode for unsupported car"
msgstr "不支持的车辆:行车记录模式"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/osm.py
msgid "Database Update"
msgstr "数据库更新"
@@ -480,7 +603,9 @@ msgstr "设备必须先在 comma.ai 后端注册才能配对。"
msgid ""
"Device will automatically shutdown after set time once the engine is turned off.\n"
"(30h is the default)"
msgstr "发动机关闭后,设备将在设定时间后自动关机。\n(默认为 30 小时)"
msgstr ""
"发动机关闭后,设备将在设定时间后自动关机。\n"
"(默认为 30 小时)"
#: openpilot/selfdrive/ui/sunnypilot/layouts/onboarding.py
msgid "Disable"
@@ -494,6 +619,10 @@ msgstr "禁用更新"
msgid "Disable the sunnypilot Longitudinal Control (alpha) toggle to allow Intelligent Cruise Button Management."
msgstr "禁用 sunnypilot 纵向控制(测试版)开关以允许智能巡航按钮管理。"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Disable your car's stock LKAS to engage"
msgstr "请关闭车辆的原始 LKAS 以启用"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/steering_sub_layouts/mads_settings.py
msgid "Disengage"
msgstr "脱离"
@@ -572,6 +701,10 @@ msgstr "我运行的软件有关系吗?"
msgid "Dongle ID"
msgstr "设备 ID"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Door Open"
msgstr "车门未关"
#: openpilot/selfdrive/ui/layouts/settings/software.py
msgid "Download"
msgstr "下载"
@@ -604,6 +737,10 @@ msgstr "行程"
msgid "Driving Model"
msgstr "驾驶模型"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Driving Model Lagging"
msgstr "驾驶模型延迟"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Driving Personality"
msgstr "驾驶风格"
@@ -633,6 +770,14 @@ msgstr "实验模式已开启"
msgid "Early Access: Become a sunnypilot Sponsor"
msgstr "抢先体验:成为 sunnypilot 赞助者"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Electronic Stability Control Active"
msgstr "电子稳定控制已激活"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Electronic Stability Control Disabled"
msgstr "电子稳定控制已禁用"
#: openpilot/selfdrive/ui/layouts/settings/developer.py
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
#: openpilot/selfdrive/ui/sunnypilot/layouts/onboarding.py
@@ -725,6 +870,10 @@ 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 端到端纵向控制。"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Enable your car's LKAS to engage"
msgstr "请开启车辆的 LKAS 以启用"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/developer.py
msgid "Enables or disables the GitHub runner service."
msgstr "启用或禁用 GitHub runner 服务。"
@@ -781,6 +930,10 @@ msgstr "错误日志"
msgid "Error: Invalid download. Retry."
msgstr "错误:下载无效。请重试。"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Excessive Actuation"
msgstr "过度执行"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/device.py
msgid "Exit Always Offroad"
msgstr "退出停车设置模式"
@@ -809,6 +962,10 @@ msgstr "获取中..."
msgid "FORGETTING..."
msgstr "正在遗忘..."
#: openpilot/selfdrive/selfdrived/events.py
msgid "Fan Malfunction"
msgstr "风扇故障"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/models.py
msgid "Fetching Latest Models"
msgstr "正在获取最新模型"
@@ -822,7 +979,6 @@ msgid "Finish Setup"
msgstr "完成设置"
#: openpilot/selfdrive/ui/layouts/settings/settings.py
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/settings.py
msgid "Firehose"
msgstr "数据洪流"
@@ -872,6 +1028,10 @@ msgstr "摩擦"
msgid "GOOD"
msgstr "良好"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Gear not D"
msgstr "挡位不在 D 挡"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/developer.py
msgid "GitHub Runner Service"
msgstr "GitHub Runner 服务"
@@ -884,9 +1044,9 @@ msgstr "在手机上前往 https://connect.comma.ai"
msgid "Green Traffic Light Alert (Beta)"
msgstr "绿灯提醒(测试版)"
#: openpilot/selfdrive/ui/layouts/sidebar.py
msgid "HIGH"
msgstr "高"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Harness Relay Malfunction"
msgstr "线束继电器故障"
#: openpilot/system/ui/widgets/network.py
msgid "Hidden Network"
@@ -940,6 +1100,10 @@ msgstr "此平台当前不支持智能巡航按钮管理。"
msgid "Interactivity Timeout"
msgstr "交互超时"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Invalid LKAS setting"
msgstr "LKAS 设置无效"
#: openpilot/system/ui/sunnypilot/widgets/sunnylink_pairing_dialog.py
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,如有问题请联系管理员"
@@ -948,10 +1112,22 @@ msgstr "加入我们的社区论坛 https://community.sunnypilot.ai,如有问
msgid "Joystick Debug Mode"
msgstr "摇杆调试模式"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Joystick Mode"
msgstr "遥杆模式"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/trips.py
msgid "KM"
msgstr "公里"
#: openpilot/selfdrive/selfdrived/events.py
msgid "LKAS Fault: Restart the Car"
msgstr "LKAS 故障:请重启车辆"
#: openpilot/selfdrive/selfdrived/events.py
msgid "LKAS Fault: Restart the car to engage"
msgstr "LKAS 故障:请重启车辆后启用"
#: openpilot/selfdrive/ui/widgets/ssh_key.py
msgid "LOADING"
msgstr "加载中"
@@ -960,6 +1136,10 @@ msgstr "加载中"
msgid "LTE"
msgstr "LTE"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Lane Departure Detected"
msgstr "检测到车道偏离"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/osm.py
msgid "Last checked {}"
msgstr "上次检查 {}"
@@ -972,6 +1152,7 @@ msgstr "横向加速度系数"
msgid "Lateral Jerk Torque Controller"
msgstr "横向冲击扭矩控制器"
#: openpilot/selfdrive/selfdrived/events.py
#: openpilot/selfdrive/ui/layouts/settings/developer.py
msgid "Lateral Maneuver Mode"
msgstr "横向操作模式"
@@ -996,10 +1177,23 @@ msgstr "实时转向延迟:"
msgid "Long Press Increment"
msgstr "长按增量"
#: openpilot/selfdrive/selfdrived/events.py
#: openpilot/selfdrive/ui/layouts/settings/developer.py
msgid "Longitudinal Maneuver Mode"
msgstr "纵向操作模式"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Low Communication Rate Between Processes"
msgstr "进程间通信速率过低"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Low Memory"
msgstr "内存不足"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Low Memory: Reboot Your Device"
msgstr "内存不足:请重启设备"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/brands/tesla.py
msgid "MADS Screen Activation"
msgstr "MADS 屏幕激活"
@@ -1173,10 +1367,6 @@ msgstr "确定"
msgid "ONLINE"
msgstr "在线"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/settings.py
msgid "OSM"
msgstr "OSM"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/cruise_sub_layouts/speed_limit_settings.py
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/steering_sub_layouts/lane_change_settings.py
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/brands/hyundai.py
@@ -1229,6 +1419,10 @@ msgstr "行车上传"
msgid "Open"
msgstr "打开"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Out of Storage"
msgstr "存储空间不足"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "PAIR"
msgstr "配对"
@@ -1282,6 +1476,10 @@ msgstr "将设备与 comma connect(connect.comma.ai)配对,领取您的 co
msgid "Paired"
msgstr "已配对"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Parking Brake Engaged"
msgstr "手刹已拉起"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/steering_sub_layouts/mads_settings.py
msgid "Pause"
msgstr "暂停"
@@ -1298,6 +1496,18 @@ msgstr "当车速低于所选期望速度时,使用转向灯暂停横向控制
msgid "Pause: ALC will pause when the brake pedal is pressed."
msgstr "暂停:踩下刹车踏板时 ALC 将暂停。"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Pay Attention"
msgstr "请注意"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Pay Attention to Engage"
msgstr "请注意以启用"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Pedal Pressed"
msgstr "已踩踏板"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/cruise_sub_layouts/speed_limit_settings.py
msgid "Percent: Adds a percent offset [Speed Limit + (Offset % Speed Limit)]"
msgstr "百分比:添加百分比偏移 [限速 + (偏移 % 限速)]"
@@ -1326,6 +1536,10 @@ msgstr "请重启后重试。"
msgid "Policy Model"
msgstr "策略模型"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Posenet Speed Invalid"
msgstr "Posenet 速度无效"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/steering.py
msgid "Post-Blinker Delay"
msgstr "转向灯后延迟"
@@ -1339,6 +1553,22 @@ msgstr "关机"
msgid "Predictive"
msgstr "预测"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Press Resume"
msgstr "按恢复键"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Press Resume to Exit Brake Hold"
msgstr "按恢复键退出刹车保持"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Press Resume to Exit Standstill"
msgstr "按恢复键退出驻车"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Press Set to Engage"
msgstr "按设定键启用"
#: openpilot/system/ui/widgets/network.py
msgid "Prevent large data uploads when on a metered Wi-Fi connection"
msgstr "在计量制 Wi‑Fi 连接时避免大量上传"
@@ -1351,6 +1581,10 @@ msgstr "在计量制蜂窝网络时避免大量上传"
msgid "Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr "预览车内摄像头以确保驾驶员监控视野良好。(车辆必须熄火)"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Process Not Running"
msgstr "进程未运行"
#: openpilot/selfdrive/ui/widgets/pairing_dialog.py
msgid "QR Code Error"
msgstr "二维码错误"
@@ -1367,6 +1601,10 @@ msgstr "快速启动模式需要禁用更新。<br>请先在软件面板中启
msgid "Quiet Mode"
msgstr "安静模式"
#: openpilot/selfdrive/ui/layouts/sidebar.py
msgid "RA"
msgstr "远程协助"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/models.py
msgid "REFRESH"
msgstr "刷新"
@@ -1388,6 +1626,14 @@ msgstr "重置"
msgid "REVIEW"
msgstr "查看"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Radar Error: Restart the Car"
msgstr "雷达错误:请重启车辆"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Radar Temporarily Unavailable"
msgstr "雷达暂时不可用"
#: openpilot/system/ui/sunnypilot/widgets/sunnylink_pairing_dialog.py
msgid "Re-enter the \"sunnylink\" panel to verify sponsorship status"
msgstr "重新进入「sunnylink」面板以确认赞助状态"
@@ -1439,6 +1685,10 @@ msgstr "法规"
msgid "Relaxed"
msgstr "从容"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Release Brake to Engage"
msgstr "松开刹车以启用"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/steering_sub_layouts/mads_settings.py
msgid "Remain Active"
msgstr "保持激活"
@@ -1455,6 +1705,10 @@ msgstr "远程访问"
msgid "Remote snapshots"
msgstr "远程快照"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Remount Detected: Recalibrating"
msgstr "检测到重新安装:正在重新标定"
#: openpilot/selfdrive/ui/widgets/ssh_key.py
msgid "Request timed out"
msgstr "请求超时"
@@ -1481,6 +1735,20 @@ msgstr "恢复失败"
msgid "Restore Settings"
msgstr "恢复设置"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Reverse"
msgstr "倒车"
#: openpilot/selfdrive/selfdrived/events.py
msgid ""
"Reverse\n"
"Gear"
msgstr ""
#: openpilot/selfdrive/selfdrived/events.py
msgid "Reverse Gear"
msgstr "倒挡"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Review Training Guide"
msgstr "查看训练指南"
@@ -1557,6 +1825,10 @@ msgstr "搜索"
msgid "Search your vehicle"
msgstr "搜索您的车辆"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Seatbelt Unlatched"
msgstr "安全带未系"
#: openpilot/system/ui/widgets/option_dialog.py
msgid "Select"
msgstr "选择"
@@ -1594,6 +1866,14 @@ msgstr "选择更高的手指计数可以减少意外激活。"
msgid "Self-Tune"
msgstr "自调校"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Selfdrive Process Lagging: Reboot Your Device"
msgstr "驾驶进程延迟:请重启设备"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Sensor Data Invalid"
msgstr "传感器数据无效"
#: openpilot/selfdrive/ui/layouts/settings/device.py
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/device.py
msgid "Serial"
@@ -1631,6 +1911,10 @@ msgstr "设备停车闲置时显示屏幕保护程序,而不是关闭屏幕。
msgid "Show a timer on the HUD when the car is at a standstill."
msgstr "车辆静止时在 HUD 上显示计时器。"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Slow down to engage"
msgstr "减速以启用"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/cruise.py
msgid "Smart Cruise Control - Map"
msgstr "智能巡航控制 - 地图"
@@ -1669,6 +1953,10 @@ msgstr "限速偏移"
msgid "Speed Limit Source"
msgstr "限速来源"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Speed Too High"
msgstr "速度过高"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/visuals.py
msgid "Speedometer: Always Display True Speed"
msgstr "速度表:始终显示真实速度"
@@ -1704,6 +1992,22 @@ msgstr "启动车辆以检查车辆兼容性。"
msgid "State"
msgstr "状态"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Steer Left"
msgstr "向左转向"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Steer Left to Start Lane Change Once Safe"
msgstr "安全后向左转向开始变道"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Steer Right"
msgstr "向右转向"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Steer Right to Start Lane Change Once Safe"
msgstr "安全后向右转向开始变道"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/settings.py
msgid "Steering"
msgstr "转向"
@@ -1712,10 +2016,30 @@ msgstr "转向"
msgid "Steering Arc"
msgstr "转向弧"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Steering Assist Temporarily Unavailable"
msgstr "转向辅助暂时不可用"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/steering_sub_layouts/mads_settings.py
msgid "Steering Mode on Brake Pedal"
msgstr "刹车踏板转向模式"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Steering Pressed"
msgstr "已转方向盘"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Steering Temporarily Unavailable"
msgstr "转向暂时不可用"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Stock AEB: Risk of Collision"
msgstr "原厂 AEB:碰撞风险"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Stock LKAS: Lane Departure Detected"
msgstr "原厂 LKAS:检测到车道偏离"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/brands/subaru.py
msgid "Stop and Go (Beta)"
msgstr "停车起步(测试版)"
@@ -1728,6 +2052,18 @@ msgstr "停车起步 Hack(测试版)"
msgid "Stop and Go for Manual Parking Brake (Beta)"
msgstr "手动驻车制动停车起步(测试版)"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Switch to Traffic-Aware Cruise Control to engage"
msgstr "切换到自适应巡航以启用"
#: openpilot/selfdrive/selfdrived/events.py
msgid "System Initializing"
msgstr "系统初始化中"
#: openpilot/selfdrive/selfdrived/events.py
msgid "System Overheated"
msgstr "系统过热"
#: openpilot/selfdrive/ui/onroad/alert_renderer.py
msgid "System Unresponsive"
msgstr "系统无响应"
@@ -1736,6 +2072,10 @@ msgstr "系统无响应"
msgid "System reboot required for changes to take effect. Reboot now?"
msgstr "更改需要重启系统才能生效。现在重启吗?"
#: openpilot/selfdrive/selfdrived/events.py
msgid "TAKE CONTROL"
msgstr "接管控制"
#: openpilot/selfdrive/ui/onroad/alert_renderer.py
msgid "TAKE CONTROL IMMEDIATELY"
msgstr "请立即接管控制"
@@ -1748,6 +2088,10 @@ msgstr "温度"
msgid "THANKS ♥"
msgstr "谢谢 ♥"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Take Control"
msgstr "接管控制"
#: openpilot/selfdrive/ui/layouts/settings/software.py
msgid "Target Branch"
msgstr "目标分支"
@@ -1829,7 +2173,10 @@ msgid ""
"This will delete ALL downloaded maps\n"
"\n"
"Are you sure you want to delete all maps?"
msgstr "这将删除所有已下载的地图\n\n您确定要删除所有地图吗?"
msgstr ""
"这将删除所有已下载的地图\n"
"\n"
"您确定要删除所有地图吗?"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/models.py
msgid "This will delete ALL downloaded models from the cache except the currently active model. Are you sure?"
@@ -1843,6 +2190,10 @@ msgstr "这将开始下载过程,可能需要一段时间才能完成。"
msgid "Time"
msgstr "时间"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Toggle stock LKAS on or off to engage"
msgstr "切换原厂 LKAS 开关以启用"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/steering_sub_layouts/mads_settings.py
msgid "Toggle with Main Cruise"
msgstr "主巡航切换"
@@ -1852,6 +2203,10 @@ msgstr "主巡航切换"
msgid "Toggles"
msgstr "切换"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Too Distracted"
msgstr "分心过久"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/steering_sub_layouts/torque_settings.py
msgid "Torque Control Tune Version"
msgstr "扭矩控制调校版本"
@@ -1860,14 +2215,18 @@ msgstr "扭矩控制调校版本"
msgid "Total Delay:"
msgstr "总延迟:"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Touch Steering Wheel"
msgstr "请握住方向盘"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Touch Steering Wheel: No Face Detected"
msgstr "请握住方向盘:未检测到人脸"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/device.py
msgid "Training Guide"
msgstr "使用指南"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/settings.py
msgid "Trips"
msgstr "行程"
#: openpilot/selfdrive/ui/layouts/settings/developer.py
msgid "UI Debug Mode"
msgstr "界面调试模式"
@@ -1897,6 +2256,10 @@ msgstr "卸载"
msgid "Unknown"
msgstr "未知"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Unknown Vehicle Variant"
msgstr "未知车型"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/platform_selector.py
msgid "Unrecognized Vehicle"
msgstr "无法识别的车辆"
@@ -1933,10 +2296,6 @@ msgstr "使用地图数据估算前方转弯的合适速度。"
msgid "Use vision path predictions to estimate the appropriate speed to drive through turns ahead."
msgstr "使用视觉路径预测估算前方转弯的合适速度。"
#: openpilot/selfdrive/ui/layouts/sidebar.py
msgid "VEHICLE"
msgstr "车辆"
#: openpilot/selfdrive/ui/layouts/sidebar.py
msgid "VI"
msgstr "车辆接口"
@@ -1951,6 +2310,18 @@ msgstr "查看"
msgid "Vehicle"
msgstr "车辆"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Vehicle Sensors Calibrating"
msgstr "车辆传感器标定中"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Vehicle Sensors Invalid"
msgstr "车辆传感器无效"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Vehicle Steering Time Limit"
msgstr "车辆转向时间限制"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/developer.py
msgid "View the error log for sunnypilot crashes."
msgstr "查看 sunnypilot 崩溃的错误日志。"
@@ -1967,6 +2338,10 @@ msgstr "视觉模型"
msgid "Visuals"
msgstr "视觉"
#: openpilot/selfdrive/selfdrived/events.py
msgid "WARNING: This branch is not tested"
msgstr "警告:此分支未经测试"
#: openpilot/selfdrive/ui/onroad/alert_renderer.py
msgid "Waiting to start"
msgstr "等待开始"
@@ -2176,6 +2551,14 @@ msgstr "留空以自动配置"
msgid "left"
msgstr "左"
#: openpilot/selfdrive/selfdrived/events.py
msgid "locationd Permanent Error"
msgstr "locationd 永久错误"
#: openpilot/selfdrive/selfdrived/events.py
msgid "locationd Temporary Error"
msgstr "locationd 临时错误"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/device.py
msgid "m"
msgstr "分钟"
@@ -2211,6 +2594,10 @@ msgstr "无网络"
msgid "now"
msgstr "现在"
#: openpilot/selfdrive/selfdrived/events.py
msgid "openpilot Canceled"
msgstr "openpilot 已取消"
#: openpilot/selfdrive/ui/sunnypilot/mici/layouts/sunnylink.py
msgid "pair"
msgstr "配对"
@@ -2223,6 +2610,14 @@ msgstr "与 sunnylink 配对"
msgid "paired"
msgstr "已配对"
#: openpilot/selfdrive/selfdrived/events.py
msgid "paramsd Permanent Error"
msgstr "paramsd 永久错误"
#: openpilot/selfdrive/selfdrived/events.py
msgid "paramsd Temporary Error"
msgstr "paramsd 临时错误"
#: openpilot/selfdrive/ui/sunnypilot/mici/layouts/sunnylink.py
msgid "please connect to WiFi & try again"
msgstr "请连接 WiFi 并重试"
@@ -2337,6 +2732,10 @@ msgstr "sunnypilot 要求设备安装倾斜度在左右 4°、上下 5°/9° 以
msgid "sunnypilot will not take over control of gas and brakes. Factory Toyota longitudinal control will be used."
msgstr "sunnypilot 不会接管油门和刹车控制。将使用原厂 Toyota 纵向控制。"
#: openpilot/selfdrive/selfdrived/events.py
msgid "take control"
msgstr "接管控制"
#: openpilot/selfdrive/ui/sunnypilot/mici/layouts/sunnylink.py
msgid "thanks"
msgstr "谢谢"
@@ -16,7 +16,8 @@ def update_translations():
os.walk(os.path.join(str(UI_DIR), "layouts")),
os.walk(os.path.join(str(UI_DIR), "onroad")),
os.walk(os.path.join(str(UI_DIR), "sunnypilot")),
os.walk(os.path.join(str(UI_DIR), "mici"))):
os.walk(os.path.join(str(UI_DIR), "mici")),
os.walk(os.path.join(str(UI_DIR), "..", "selfdrived"))):
for filename in filenames:
if filename.endswith(".py"):
files.append(os.path.relpath(os.path.join(root, filename), BASEDIR))