diff --git a/selfdrive/ui/mici/layouts/onboarding.py b/selfdrive/ui/mici/layouts/onboarding.py index d6d3f703..bd064ef5 100644 --- a/selfdrive/ui/mici/layouts/onboarding.py +++ b/selfdrive/ui/mici/layouts/onboarding.py @@ -60,7 +60,7 @@ class TrainingGuidePreDMTutorial(NavScroller): continue_button.set_click_callback(continue_callback) self._scroller.add_widgets([ - GreyBigButton("driver monitoring\ncheck", "scroll to continue", + GreyBigButton(tr("driver monitoring\ncheck"), "scroll to continue", gui_app.texture("icons_mici/setup/green_dm.png", 64, 64)), GreyBigButton("", "Next, we'll check if comma four can detect the driver properly."), GreyBigButton("", "sunnypilot uses the cabin camera to check if the driver is distracted."), @@ -82,7 +82,7 @@ class DMBadFaceDetected(NavScroller): back_button.set_click_callback(self.dismiss) self._scroller.add_widgets([ - GreyBigButton("looking for driver", "make sure comma\nfour can see your face", + GreyBigButton(tr("looking for driver"), "make sure comma\nfour can see your face", gui_app.texture("icons_mici/setup/orange_dm.png", 64, 64)), GreyBigButton("", "Remount if your face is blocked, or driver monitoring has difficulty tracking your face."), back_button, @@ -233,7 +233,7 @@ class TrainingGuideRecordFront(NavScroller): exit_on_confirm=False) self._scroller.add_widgets([ - GreyBigButton("driver camera data", "do you want to share video data for training?", + GreyBigButton(tr("driver camera data"), "do you want to share video data for training?", gui_app.texture("icons_mici/setup/green_dm.png", 64, 64)), GreyBigButton("", "Sharing your data with comma helps improve openpilot and sunnypilot for everyone."), self._accept_button, @@ -249,7 +249,7 @@ class TrainingGuideAttentionNotice(Scroller): continue_button.set_click_callback(continue_callback) self._scroller.add_widgets([ - GreyBigButton("what is sunnypilot?", "scroll to continue", + GreyBigButton(tr("what is sunnypilot?"), "scroll to continue", gui_app.texture("icons_mici/setup/green_info.png", 64, 64)), GreyBigButton("", "1. sunnypilot is a driver assistance system."), GreyBigButton("", "2. You must pay attention at all times."), @@ -320,13 +320,13 @@ class TermsPage(Scroller): self._decline_button = BigConfirmationCircleButton("decline &\nuninstall", gui_app.texture("icons_mici/setup/cancel.png", 64, 64), on_decline, red=True, exit_on_confirm=False) - self._terms_header = GreyBigButton("terms of\nservice", "scroll to continue", + self._terms_header = GreyBigButton(tr("terms of\nservice"), "scroll to continue", gui_app.texture("icons_mici/setup/green_info.png", 64, 64)) self._must_accept_card = GreyBigButton("", "You must accept the Terms of Service to use sunnypilot.") self._scroller.add_widgets([ self._terms_header, - GreyBigButton("swipe for QR code", "or go to https://sunnypilot.ai/terms", + GreyBigButton(tr("swipe for QR code"), "or go to https://sunnypilot.ai/terms", gui_app.texture("icons_mici/setup/small_slider/slider_arrow.png", 64, 56, flip_x=True)), QRCodeWidget("https://sunnypilot.ai/terms"), self._must_accept_card, diff --git a/selfdrive/ui/mici/layouts/settings/developer.py b/selfdrive/ui/mici/layouts/settings/developer.py index f47614c0..802e96a8 100644 --- a/selfdrive/ui/mici/layouts/settings/developer.py +++ b/selfdrive/ui/mici/layouts/settings/developer.py @@ -1,4 +1,5 @@ from openpilot.common.time_helpers import system_time_valid +from openpilot.system.ui.lib.multilang import tr from openpilot.system.ui.widgets.scroller import NavScroller from openpilot.selfdrive.ui.mici.widgets.button import BigButton, BigToggle, BigParamControl, BigCircleParamControl from openpilot.selfdrive.ui.mici.widgets.dialog import BigDialog, BigInputDialog @@ -42,26 +43,26 @@ class DeveloperLayoutMici(NavScroller): txt_ssh = gui_app.texture("icons_mici/settings/developer/ssh.png", 56, 64) github_username = ui_state.params.get("GithubUsername") or "" - self._ssh_keys_btn = BigButton("SSH keys", "Not set" if not github_username else github_username, icon=txt_ssh) + self._ssh_keys_btn = BigButton(tr("SSH keys"), "Not set" if not github_username else github_username, icon=txt_ssh) self._ssh_keys_btn.set_click_callback(ssh_keys_callback) # adb, ssh, ssh keys, debug mode, joystick debug mode, longitudinal maneuver mode, ip address # ******** Main Scroller ******** self._adb_toggle = BigCircleParamControl(gui_app.texture("icons_mici/adb_short.png", 82, 82), "AdbEnabled", icon_offset=(0, 12)) self._ssh_toggle = BigCircleParamControl(gui_app.texture("icons_mici/ssh_short.png", 82, 82), "SshEnabled", icon_offset=(0, 12)) - self._joystick_toggle = BigToggle("joystick debug mode", + self._joystick_toggle = BigToggle(tr("joystick debug mode"), initial_state=ui_state.params.get_bool("JoystickDebugMode"), toggle_callback=self._on_joystick_debug_mode) - self._long_maneuver_toggle = BigToggle("longitudinal maneuver mode", + self._long_maneuver_toggle = BigToggle(tr("longitudinal maneuver mode"), initial_state=ui_state.params.get_bool("LongitudinalManeuverMode"), toggle_callback=self._on_long_maneuver_mode) - self._lat_maneuver_toggle = BigToggle("lateral maneuver mode", + self._lat_maneuver_toggle = BigToggle(tr("lateral maneuver mode"), initial_state=ui_state.params.get_bool("LateralManeuverMode"), toggle_callback=self._on_lat_maneuver_mode) - self._alpha_long_toggle = BigToggle("alpha longitudinal", + self._alpha_long_toggle = BigToggle(tr("alpha longitudinal"), initial_state=ui_state.params.get_bool("AlphaLongitudinalEnabled"), toggle_callback=self._on_alpha_long_enabled) - self._debug_mode_toggle = BigParamControl("ui debug mode", "ShowDebugInfo", + self._debug_mode_toggle = BigParamControl(tr("ui debug mode"), "ShowDebugInfo", toggle_callback=lambda checked: (gui_app.set_show_touches(checked), gui_app.set_show_fps(checked))) diff --git a/selfdrive/ui/mici/layouts/settings/device.py b/selfdrive/ui/mici/layouts/settings/device.py index e0d89a54..67f9adce 100644 --- a/selfdrive/ui/mici/layouts/settings/device.py +++ b/selfdrive/ui/mici/layouts/settings/device.py @@ -323,18 +323,18 @@ class DeviceLayoutMici(NavScroller): power_off_callback, exit_on_confirm=False, red=True) self._power_off_btn.set_visible(lambda: not ui_state.ignition) - regulatory_btn = BigButton("regulatory info", "", gui_app.texture("icons_mici/settings/device/info.png", 64, 64)) + regulatory_btn = BigButton(tr("regulatory info"), "", gui_app.texture("icons_mici/settings/device/info.png", 64, 64)) regulatory_btn.set_click_callback(self._on_regulatory) - driver_cam_btn = BigButton("driver\ncamera preview", "", gui_app.texture("icons_mici/settings/device/cameras.png", 64, 64)) + driver_cam_btn = BigButton(tr("driver\ncamera preview"), "", gui_app.texture("icons_mici/settings/device/cameras.png", 64, 64)) driver_cam_btn.set_click_callback(lambda: gui_app.push_widget(DriverCameraDialog())) driver_cam_btn.set_enabled(lambda: ui_state.is_offroad()) - review_training_guide_btn = BigButton("review\ntraining guide", "", gui_app.texture("icons_mici/settings/device/info.png", 64, 64)) + review_training_guide_btn = BigButton(tr("review\ntraining guide"), "", gui_app.texture("icons_mici/settings/device/info.png", 64, 64)) review_training_guide_btn.set_click_callback(lambda: gui_app.push_widget(ReviewTrainingGuide(completed_callback=lambda: gui_app.pop_widgets_to(self)))) review_training_guide_btn.set_enabled(lambda: ui_state.is_offroad()) - terms_btn = BigButton("terms &\nconditions", "", gui_app.texture("icons_mici/settings/device/info.png", 64, 64)) + terms_btn = BigButton(tr("terms &\nconditions"), "", gui_app.texture("icons_mici/settings/device/info.png", 64, 64)) terms_btn.set_click_callback(lambda: gui_app.push_widget(ReviewTermsPage())) self._scroller.add_widgets([ diff --git a/selfdrive/ui/mici/layouts/settings/network/network_layout.py b/selfdrive/ui/mici/layouts/settings/network/network_layout.py index 9f6fae4b..0ae31cfa 100644 --- a/selfdrive/ui/mici/layouts/settings/network/network_layout.py +++ b/selfdrive/ui/mici/layouts/settings/network/network_layout.py @@ -1,3 +1,4 @@ +from openpilot.system.ui.lib.multilang import tr from openpilot.system.ui.widgets.scroller import NavScroller from openpilot.selfdrive.ui.mici.layouts.settings.network import WifiNetworkButton from openpilot.selfdrive.ui.mici.layouts.settings.network.wifi_ui import WifiUIMici @@ -28,7 +29,7 @@ class NetworkLayoutMici(NavScroller): self._network_metered_btn.set_enabled(False) self._wifi_manager.set_tethering_active(checked) - self._tethering_toggle_btn = BigToggle("enable tethering", "", toggle_callback=tethering_toggle_callback) + self._tethering_toggle_btn = BigToggle(tr("enable tethering"), "", toggle_callback=tethering_toggle_callback) def tethering_password_callback(password: str): if password: @@ -43,7 +44,7 @@ class NetworkLayoutMici(NavScroller): gui_app.push_widget(dlg) txt_tethering = gui_app.texture("icons_mici/settings/network/tethering.png", 64, 54) - self._tethering_password_btn = BigButton("tethering password", "", txt_tethering) + self._tethering_password_btn = BigButton(tr("tethering password"), "", txt_tethering) self._tethering_password_btn.set_click_callback(tethering_password_clicked) # ******** Network Metered ******** @@ -58,7 +59,7 @@ class NetworkLayoutMici(NavScroller): # TODO: signal for current network metered type when changing networks, this is wrong until you press it once # TODO: disable when not connected - self._network_metered_btn = BigMultiToggle("network usage", ["default", "metered", "unmetered"], select_callback=network_metered_callback) + self._network_metered_btn = BigMultiToggle(tr("network usage"), ["default", "metered", "unmetered"], select_callback=network_metered_callback) self._network_metered_btn.set_enabled(False) self._wifi_button = WifiNetworkButton(self._wifi_manager) @@ -66,14 +67,14 @@ class NetworkLayoutMici(NavScroller): # ******** Advanced settings ******** # ******** Roaming toggle ******** - self._roaming_btn = BigParamControl("enable roaming", "GsmRoaming", toggle_callback=self._toggle_roaming) + self._roaming_btn = BigParamControl(tr("enable roaming"), "GsmRoaming", toggle_callback=self._toggle_roaming) # ******** APN settings ******** - self._apn_btn = BigButton("apn settings", "edit") + self._apn_btn = BigButton(tr("apn settings"), "edit") self._apn_btn.set_click_callback(self._edit_apn) # ******** Cellular metered toggle ******** - self._cellular_metered_btn = BigParamControl("cellular metered", "GsmMetered", toggle_callback=self._toggle_cellular_metered) + self._cellular_metered_btn = BigParamControl(tr("cellular metered"), "GsmMetered", toggle_callback=self._toggle_cellular_metered) # Main scroller ---------------------------------- self._scroller.add_widgets([ diff --git a/selfdrive/ui/mici/layouts/settings/settings.py b/selfdrive/ui/mici/layouts/settings/settings.py index 4ccc5ba1..632e002c 100644 --- a/selfdrive/ui/mici/layouts/settings/settings.py +++ b/selfdrive/ui/mici/layouts/settings/settings.py @@ -1,4 +1,5 @@ from openpilot.common.params import Params +from openpilot.system.ui.lib.multilang import tr from openpilot.system.ui.widgets.scroller import NavScroller from openpilot.selfdrive.ui.mici.widgets.button import BigButton from openpilot.selfdrive.ui.mici.layouts.settings.toggles import TogglesLayoutMici @@ -20,15 +21,15 @@ class SettingsLayout(NavScroller): self._params = Params() toggles_panel = TogglesLayoutMici() - toggles_btn = SettingsBigButton("toggles", "", gui_app.texture("icons_mici/settings.png", 64, 64)) + toggles_btn = SettingsBigButton(tr("toggles"), "", gui_app.texture("icons_mici/settings.png", 64, 64)) toggles_btn.set_click_callback(lambda: gui_app.push_widget(toggles_panel)) network_panel = NetworkLayoutMici() - network_btn = SettingsBigButton("network", "", gui_app.texture("icons_mici/settings/network/wifi_strength_full.png", 76, 56)) + network_btn = SettingsBigButton(tr("network"), "", gui_app.texture("icons_mici/settings/network/wifi_strength_full.png", 76, 56)) network_btn.set_click_callback(lambda: gui_app.push_widget(network_panel)) device_panel = DeviceLayoutMici() - device_btn = SettingsBigButton("device", "", gui_app.texture("icons_mici/settings/device_icon.png", 72, 58)) + device_btn = SettingsBigButton(tr("device"), "", gui_app.texture("icons_mici/settings/device_icon.png", 72, 58)) device_btn.set_click_callback(lambda: gui_app.push_widget(device_panel)) developer_panel = DeveloperLayoutMici() diff --git a/selfdrive/ui/mici/layouts/settings/toggles.py b/selfdrive/ui/mici/layouts/settings/toggles.py index 8635336f..ec69688f 100644 --- a/selfdrive/ui/mici/layouts/settings/toggles.py +++ b/selfdrive/ui/mici/layouts/settings/toggles.py @@ -1,5 +1,6 @@ from cereal import log +from openpilot.system.ui.lib.multilang import tr from openpilot.system.ui.widgets.scroller import NavScroller from openpilot.selfdrive.ui.mici.widgets.button import BigParamControl, BigMultiParamToggle from openpilot.system.ui.lib.application import gui_app @@ -13,14 +14,14 @@ class TogglesLayoutMici(NavScroller): def __init__(self): super().__init__() - self._personality_toggle = BigMultiParamToggle("driving personality", "LongitudinalPersonality", ["aggressive", "standard", "relaxed"]) - self._experimental_btn = BigParamControl("experimental mode", "ExperimentalMode") - is_metric_toggle = BigParamControl("use metric units", "IsMetric") - ldw_toggle = BigParamControl("lane departure warnings", "IsLdwEnabled") - always_on_dm_toggle = BigParamControl("always-on driver monitor", "AlwaysOnDM") - record_front = BigParamControl("record & upload driver camera", "RecordFront", toggle_callback=restart_needed_callback) - record_mic = BigParamControl("record & upload mic audio", "RecordAudio", toggle_callback=restart_needed_callback) - enable_openpilot = BigParamControl("enable sunnypilot", "OpenpilotEnabledToggle", toggle_callback=restart_needed_callback) + self._personality_toggle = BigMultiParamToggle(tr("driving personality"), "LongitudinalPersonality", ["aggressive", "standard", "relaxed"]) + self._experimental_btn = BigParamControl(tr("experimental mode"), "ExperimentalMode") + is_metric_toggle = BigParamControl(tr("use metric units"), "IsMetric") + ldw_toggle = BigParamControl(tr("lane departure warnings"), "IsLdwEnabled") + always_on_dm_toggle = BigParamControl(tr("always-on driver monitor"), "AlwaysOnDM") + record_front = BigParamControl(tr("record & upload driver camera"), "RecordFront", toggle_callback=restart_needed_callback) + record_mic = BigParamControl(tr("record & upload mic audio"), "RecordAudio", toggle_callback=restart_needed_callback) + enable_openpilot = BigParamControl(tr("enable sunnypilot"), "OpenpilotEnabledToggle", toggle_callback=restart_needed_callback) self._scroller.add_widgets([ self._personality_toggle, diff --git a/selfdrive/ui/sunnypilot/layouts/settings/sunnylink.py b/selfdrive/ui/sunnypilot/layouts/settings/sunnylink.py index 1d9b99d5..66ca30a0 100644 --- a/selfdrive/ui/sunnypilot/layouts/settings/sunnylink.py +++ b/selfdrive/ui/sunnypilot/layouts/settings/sunnylink.py @@ -223,14 +223,14 @@ class SunnylinkLayout(Widget): gui_app.push_widget(self._sunnylink_pairing_dialog) def _handle_backup_btn(self): - backup_dialog = ConfirmDialog(text=tr("Are you sure you want to backup your current sunnypilot settings?"), confirm_text="Backup", + backup_dialog = ConfirmDialog(text=tr("Are you sure you want to backup your current sunnypilot settings?"), confirm_text=tr("Backup"), callback=self._backup_handler) gui_app.push_widget(backup_dialog) def _handle_restore_btn(self): self._restore_btn.set_enabled(False) restore_dialog = ConfirmDialog(text=tr("Are you sure you want to restore the last backed up sunnypilot settings?"), - confirm_text="Restore", callback=self._restore_handler) + confirm_text=tr("Restore"), callback=self._restore_handler) gui_app.push_widget(restore_dialog) def _backup_handler(self, dialog_result: int): diff --git a/selfdrive/ui/sunnypilot/mici/layouts/onboarding.py b/selfdrive/ui/sunnypilot/mici/layouts/onboarding.py index a98f5a2e..6f4a2477 100644 --- a/selfdrive/ui/sunnypilot/mici/layouts/onboarding.py +++ b/selfdrive/ui/sunnypilot/mici/layouts/onboarding.py @@ -7,6 +7,7 @@ See the LICENSE.md file in the root directory for more details. from collections.abc import Callable from openpilot.selfdrive.ui.mici.widgets.dialog import BigConfirmationCircleButton +from openpilot.system.ui.lib.multilang import tr from openpilot.system.ui.lib.application import gui_app from openpilot.system.ui.mici_setup import GreyBigButton from openpilot.system.ui.widgets.scroller import NavScroller @@ -16,14 +17,14 @@ class SunnylinkConsentPage(NavScroller): def __init__(self, on_accept: Callable | None = None, on_decline: Callable | None = None): super().__init__() - self._accept_button = BigConfirmationCircleButton("enable\nsunnylink", gui_app.texture("icons_mici/setup/driver_monitoring/dm_check.png", 64, 64), + self._accept_button = BigConfirmationCircleButton(tr("enable\nsunnylink"), gui_app.texture("icons_mici/setup/driver_monitoring/dm_check.png", 64, 64), on_accept, exit_on_confirm=False) - self._decline_button = BigConfirmationCircleButton("disable\nsunnylink", gui_app.texture("icons_mici/setup/cancel.png", 64, 64), + self._decline_button = BigConfirmationCircleButton(tr("disable\nsunnylink"), gui_app.texture("icons_mici/setup/cancel.png", 64, 64), on_decline, red=True, exit_on_confirm=False) self._scroller.add_widgets([ - GreyBigButton("sunnylink", "scroll to continue", + GreyBigButton(tr("sunnylink"), "scroll to continue", gui_app.texture("../../sunnypilot/selfdrive/assets/logo.png", 64, 64)), GreyBigButton("", "sunnylink enables secured remote access to your comma device from anywhere."), self._accept_button, diff --git a/selfdrive/ui/translations/app_zh-CHS.po b/selfdrive/ui/translations/app_zh-CHS.po index 843bfd30..202bb112 100644 --- a/selfdrive/ui/translations/app_zh-CHS.po +++ b/selfdrive/ui/translations/app_zh-CHS.po @@ -2074,3 +2074,175 @@ msgstr "✓ 已订阅" #: openpilot/selfdrive/ui/widgets/setup.py msgid "🔥 Firehose Mode 🔥" msgstr "🔥 Firehose 模式 🔥" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py +msgid "toggles" +msgstr "开关" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py +msgid "network" +msgstr "网络" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py +msgid "device" +msgstr "设备" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py +msgid "developer" +msgstr "开发者" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py +msgid "firehose" +msgstr "Firehose" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py +msgid "driving personality" +msgstr "驾驶风格" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py +msgid "experimental mode" +msgstr "实验模式" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py +msgid "use metric units" +msgstr "使用公制单位" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py +msgid "lane departure warnings" +msgstr "车道偏离警告" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py +msgid "always-on driver monitor" +msgstr "始终开启驾驶员监控" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py +msgid "record & upload driver camera" +msgstr "录制并上传驾驶员摄像头" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py +msgid "record & upload mic audio" +msgstr "录制并上传麦克风音频" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py +msgid "enable sunnypilot" +msgstr "启用 sunnypilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network_layout.py +msgid "enable tethering" +msgstr "启用网络共享" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network_layout.py +msgid "tethering password" +msgstr "网络共享密码" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network_layout.py +msgid "network usage" +msgstr "网络用量" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network_layout.py +msgid "enable roaming" +msgstr "启用漫游" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network_layout.py +msgid "apn settings" +msgstr "APN 设置" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network_layout.py +msgid "cellular metered" +msgstr "移动数据按流量计费" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py +msgid "SSH keys" +msgstr "SSH 密钥" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py +msgid "joystick debug mode" +msgstr "摇杆调试模式" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py +msgid "longitudinal maneuver mode" +msgstr "纵向操控模式" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py +msgid "lateral maneuver mode" +msgstr "横向操控模式" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py +msgid "alpha longitudinal" +msgstr "Alpha 纵向控制" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py +msgid "ui debug mode" +msgstr "UI 调试模式" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py +msgid "regulatory info" +msgstr "监管信息" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py +msgid "driver\ncamera preview" +msgstr "驾驶员\n摄像头预览" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py +msgid "review\ntraining guide" +msgstr "复习\n培训指南" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py +msgid "terms &\nconditions" +msgstr "条款与\n条件" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py +msgid "driver monitoring\ncheck" +msgstr "驾驶员监控\n检测" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py +msgid "looking for driver" +msgstr "寻找驾驶员" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py +msgid "driver camera data" +msgstr "驾驶员摄像头数据" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py +msgid "what is sunnypilot?" +msgstr "什么是 sunnypilot?" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py +msgid "terms of\nservice" +msgstr "服务条款" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py +msgid "swipe for QR code" +msgstr "滑动查看二维码" + +#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/sunnylink.py +msgid "Backup" +msgstr "备份" + +#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/sunnylink.py +msgid "Restore" +msgstr "恢复" + +#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/sunnylink.py +msgid "This may be due to weak internet connection or sunnylink registration issue." +msgstr "这可能是由于网络连接较弱或 sunnylink 注册问题导致的。" + +#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/sunnylink.py +msgid "sunnylink Dongle ID not found." +msgstr "未找到 sunnylink Dongle ID。" + +#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/sunnylink.py +msgid "Enable sunnylink uploader to allow sunnypilot to upload your driving data to sunnypilot servers." +msgstr "启用 sunnylink 上传器,让 sunnypilot 将您的驾驶数据上传至 sunnypilot 服务器。" + +#: openpilot/selfdrive/ui/sunnypilot/mici/layouts/onboarding.py +msgid "sunnylink" +msgstr "Sunnylink" + +#: openpilot/selfdrive/ui/sunnypilot/mici/layouts/onboarding.py +msgid "enable\nsunnylink" +msgstr "启用\nSunnylink" + +#: openpilot/selfdrive/ui/sunnypilot/mici/layouts/onboarding.py +msgid "disable\nsunnylink" +msgstr "禁用\nSunnylink"