Share display translations across Galaxy and native UI

This commit is contained in:
firestar5683
2026-10-29 19:44:16 -05:00
parent 4fcf11f07a
commit 5e057b9848
26 changed files with 5370 additions and 11 deletions
@@ -0,0 +1,92 @@
This Font Software is licensed under the SIL Open Font License,
Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font
creation efforts of academic and linguistic communities, and to
provide a free and open framework in which fonts may be shared and
improved in partnership with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply to
any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software
components as distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to,
deleting, or substituting -- in part or in whole -- any of the
components of the Original Version, by changing formats or by porting
the Font Software to a new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed,
modify, redistribute, and sell modified and unmodified copies of the
Font Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components, in
Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the
corresponding Copyright Holder. This restriction only applies to the
primary font name as presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created using
the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -0,0 +1,14 @@
Japanese and Korean subsets expanded for the shared StarPilot UI catalogs.
Generated with fontTools.subset, retaining the union of each original font cmap
and all characters in app_ja.po/app_ko.po. Original subset: Dom 1f1b1d5db9.
The official upstream source fonts are licensed under Noto-OFL.txt.
NotoSansCJKjp-Regular.otf
Source: https://raw.githubusercontent.com/notofonts/noto-cjk/main/Sans/OTF/Japanese/NotoSansCJKjp-Regular.otf
Source SHA-256: 68a3fc98800b2a27b371f2fb79991daf3633bd89309d4ffaa6946fd587f375b5
Subset SHA-256: 7d165e774b66b35b3d0b814aacf8739525d04110bc4f7d316d45378a4758684b
NotoSansCJKkr-Regular.otf
Source: https://raw.githubusercontent.com/notofonts/noto-cjk/main/Sans/OTF/Korean/NotoSansCJKkr-Regular.otf
Source SHA-256: 6bcb2a0703aa137e874fc2dffa85f6c21ba9a67fa329e81b8c801663af7e992a
Subset SHA-256: 6ee92618137820bfb2671c0601f43cb797ee4b440e52497d0b9fb5e1c923c19c
+672
View File
@@ -824,3 +824,675 @@ msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Max speed when engaging openpilot. If you are already driving faster, your current speed is used. Resume restores the previous max speed. Changes apply the next time you engage."
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Home"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Driving"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Controls"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Localization"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Language"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Use Kilometers (km/h)"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Right-Hand Drive"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Device display language. Untranslated text uses English. Park before changing language."
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Language, units and steering-wheel side for every vehicle."
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "On"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Off"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Auto"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Stock"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Custom"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Unavailable"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Available"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Invalid saved choice"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Invalid saved value"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saved choice cannot be read"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Save"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saved"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saving"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Save changes"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Could not save"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Discard changes"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Unsaved changes"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Next"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Previous"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Continue"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Confirm"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Apply"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Reset to defaults"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Restore"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Default"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Delete"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Remove"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Add"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Edit"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Search"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Refresh"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Retry"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Loading"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Loading…"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Opening page…"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "This page could not open."
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Reload page"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Refresh Galaxy"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Connected"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Disconnected"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Connecting"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Connect"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Disconnect"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Pair"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Pairing"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sign in"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sign out"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Password"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "System"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Settings"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Appearance"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Display"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Custom Display Settings"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sounds & Alerts"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sounds"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Alerts"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Driving Controls"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Vehicle Settings"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Vehicle"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Wheel Controls"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Driving Model"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Models"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Model Laboratory"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Maps"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Navigation"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Favorites"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "History"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Drive History"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Recent drives"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Last drive"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Your driving"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "This week"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Personal records"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Vitals"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Storage"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Tools"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Logs"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Recordings"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Replay"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Cameras"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Camera"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Bluetooth"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Offline maps"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Downloaded"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Installed"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Install"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Update"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Updates"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Check for updates"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Parked Power"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Force Drive State"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Onroad"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Offroad"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Always On Lateral"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Long Planner"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Conditional Driving Modes"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Curve Speed Controller"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Speed Limit Controller"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Lane Centering"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Lane Change"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Lane Change Settings"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Following distance"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Following time"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Traffic Mode"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Chill"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Experimental"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Personality"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Personalities"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saved settings"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Backup"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Backups"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Export"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Import"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Play"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Pause"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Stop"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Start"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Front"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Rear"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Left"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Right"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Small"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Big"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "None"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Enabled"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Disabled"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Not reported"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Not detected"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Warning"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Accept"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Reject"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Not now"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Done"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Details"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "View"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "More"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "No drives"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "History unavailable"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Loading history"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Date unavailable"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "No results"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Search settings"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Take control"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "LEAD"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "CURVE"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "STOP LIGHT"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "SPEED"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "OFF"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "PREVIOUS"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "PERSONAL RECORDS"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "REPLAY"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "PAUSE"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "STOP"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "BIG"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "UNKNOWN"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "DETAILS"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "ALL TIME"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "PAST WEEK"
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "DISTANCE THIS WEEK"
msgstr ""
@@ -826,3 +826,675 @@ msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Max speed when engaging openpilot. If you are already driving faster, your current speed is used. Resume restores the previous max speed. Changes apply the next time you engage."
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Home"
msgstr "Startseite"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Driving"
msgstr "Fahren"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Controls"
msgstr "Steuerung"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Localization"
msgstr "Sprache und Region"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Language"
msgstr "Sprache"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Use Kilometers (km/h)"
msgstr "Kilometer verwenden (km/h)"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Right-Hand Drive"
msgstr "Rechtslenker"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Device display language. Untranslated text uses English. Park before changing language."
msgstr "Anzeigesprache des Geräts. Nicht übersetzter Text erscheint auf Englisch. Sprache nur im geparkten Zustand ändern."
#: openpilot/starpilot/ui/translation_strings.py
msgid "Language, units and steering-wheel side for every vehicle."
msgstr "Sprache, Einheiten und Lenkradseite für alle Fahrzeuge."
#: openpilot/starpilot/ui/translation_strings.py
msgid "On"
msgstr "Ein"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Off"
msgstr "Aus"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Auto"
msgstr "Automatisch"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Stock"
msgstr "Serie"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Custom"
msgstr "Benutzerdefiniert"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Unavailable"
msgstr "Nicht verfügbar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Available"
msgstr "Verfügbar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Invalid saved choice"
msgstr "Gespeicherte Auswahl ungültig"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Invalid saved value"
msgstr "Gespeicherter Wert ungültig"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saved choice cannot be read"
msgstr "Gespeicherte Auswahl nicht lesbar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Save"
msgstr "Speichern"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saved"
msgstr "Gespeichert"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saving"
msgstr "Wird gespeichert"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Save changes"
msgstr "Änderungen speichern"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Could not save"
msgstr "Speichern fehlgeschlagen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Discard changes"
msgstr "Änderungen verwerfen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Unsaved changes"
msgstr "Ungespeicherte Änderungen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Next"
msgstr "Weiter"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Previous"
msgstr "Zurück"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Continue"
msgstr "Fortfahren"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Confirm"
msgstr "Bestätigen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Apply"
msgstr "Anwenden"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Reset to defaults"
msgstr "Auf Standard zurücksetzen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Restore"
msgstr "Wiederherstellen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Default"
msgstr "Standard"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Delete"
msgstr "Löschen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Remove"
msgstr "Entfernen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Add"
msgstr "Hinzufügen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Edit"
msgstr "Bearbeiten"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Search"
msgstr "Suchen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Refresh"
msgstr "Aktualisieren"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Retry"
msgstr "Erneut versuchen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Loading"
msgstr "Wird geladen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Loading…"
msgstr "Wird geladen…"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Opening page…"
msgstr "Seite wird geöffnet…"
#: openpilot/starpilot/ui/translation_strings.py
msgid "This page could not open."
msgstr "Diese Seite konnte nicht geöffnet werden."
#: openpilot/starpilot/ui/translation_strings.py
msgid "Reload page"
msgstr "Seite neu laden"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Refresh Galaxy"
msgstr "Galaxy aktualisieren"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Connected"
msgstr "Verbunden"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Disconnected"
msgstr "Getrennt"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Connecting"
msgstr "Verbindung wird hergestellt"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Connect"
msgstr "Verbinden"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Disconnect"
msgstr "Trennen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Pair"
msgstr "Koppeln"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Pairing"
msgstr "Wird gekoppelt"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sign in"
msgstr "Anmelden"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sign out"
msgstr "Abmelden"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Password"
msgstr "Passwort"
#: openpilot/starpilot/ui/translation_strings.py
msgid "System"
msgstr "System"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Settings"
msgstr "Einstellungen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Appearance"
msgstr "Darstellung"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Display"
msgstr "Anzeige"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Custom Display Settings"
msgstr "Benutzerdefinierte Anzeigeeinstellungen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sounds & Alerts"
msgstr "Töne und Warnungen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sounds"
msgstr "Töne"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Alerts"
msgstr "Warnungen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Driving Controls"
msgstr "Fahrsteuerung"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Vehicle Settings"
msgstr "Fahrzeugeinstellungen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Vehicle"
msgstr "Fahrzeug"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Wheel Controls"
msgstr "Lenkradbedienung"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Driving Model"
msgstr "Fahrmodell"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Models"
msgstr "Modelle"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Model Laboratory"
msgstr "Modelllabor"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Maps"
msgstr "Karten"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Navigation"
msgstr "Navigation"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Favorites"
msgstr "Favoriten"
#: openpilot/starpilot/ui/translation_strings.py
msgid "History"
msgstr "Verlauf"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Drive History"
msgstr "Fahrtenverlauf"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Recent drives"
msgstr "Letzte Fahrten"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Last drive"
msgstr "Letzte Fahrt"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Your driving"
msgstr "Deine Fahrten"
#: openpilot/starpilot/ui/translation_strings.py
msgid "This week"
msgstr "Diese Woche"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Personal records"
msgstr "Persönliche Rekorde"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Vitals"
msgstr "Systemzustand"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Storage"
msgstr "Speicher"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Tools"
msgstr "Werkzeuge"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Logs"
msgstr "Protokolle"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Recordings"
msgstr "Aufzeichnungen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Replay"
msgstr "Wiedergabe"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Cameras"
msgstr "Kameras"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Camera"
msgstr "Kamera"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Bluetooth"
msgstr "Bluetooth"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Offline maps"
msgstr "Offline-Karten"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Downloaded"
msgstr "Heruntergeladen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Installed"
msgstr "Installiert"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Install"
msgstr "Installieren"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Update"
msgstr "Aktualisieren"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Updates"
msgstr "Aktualisierungen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Check for updates"
msgstr "Nach Updates suchen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Parked Power"
msgstr "Stromversorgung beim Parken"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Force Drive State"
msgstr "Fahrzustand erzwingen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Onroad"
msgstr "Fahrbetrieb"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Offroad"
msgstr "Geparkt"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Always On Lateral"
msgstr "Dauerhafte Querführung"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Long Planner"
msgstr "Längsplaner"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Conditional Driving Modes"
msgstr "Bedingte Fahrmodi"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Curve Speed Controller"
msgstr "Kurvengeschwindigkeitsregelung"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Speed Limit Controller"
msgstr "Tempolimitregelung"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Lane Centering"
msgstr "Spurzentrierung"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Lane Change"
msgstr "Spurwechsel"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Lane Change Settings"
msgstr "Spurwechseleinstellungen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Following distance"
msgstr "Folgeabstand"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Following time"
msgstr "Folgezeit"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Traffic Mode"
msgstr "Staumodus"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Chill"
msgstr "Ruhig"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Experimental"
msgstr "Experimentell"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Personality"
msgstr "Fahrstil"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Personalities"
msgstr "Fahrstile"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saved settings"
msgstr "Gespeicherte Einstellungen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Backup"
msgstr "Sicherung"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Backups"
msgstr "Sicherungen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Export"
msgstr "Exportieren"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Import"
msgstr "Importieren"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Play"
msgstr "Abspielen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Pause"
msgstr "Pause"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Stop"
msgstr "Stopp"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Start"
msgstr "Starten"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Front"
msgstr "Vorne"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Rear"
msgstr "Hinten"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Left"
msgstr "Links"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Right"
msgstr "Rechts"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Small"
msgstr "Klein"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Big"
msgstr "Groß"
#: openpilot/starpilot/ui/translation_strings.py
msgid "None"
msgstr "Keine"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Enabled"
msgstr "Aktiviert"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Disabled"
msgstr "Deaktiviert"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Not reported"
msgstr "Nicht gemeldet"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Not detected"
msgstr "Nicht erkannt"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Warning"
msgstr "Warnung"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Accept"
msgstr "Annehmen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Reject"
msgstr "Ablehnen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Not now"
msgstr "Nicht jetzt"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Done"
msgstr "Fertig"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Details"
msgstr "Details"
#: openpilot/starpilot/ui/translation_strings.py
msgid "View"
msgstr "Ansehen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "More"
msgstr "Mehr"
#: openpilot/starpilot/ui/translation_strings.py
msgid "No drives"
msgstr "Keine Fahrten"
#: openpilot/starpilot/ui/translation_strings.py
msgid "History unavailable"
msgstr "Verlauf nicht verfügbar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Loading history"
msgstr "Verlauf wird geladen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Date unavailable"
msgstr "Datum nicht verfügbar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "No results"
msgstr "Keine Ergebnisse"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Search settings"
msgstr "Einstellungen suchen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Take control"
msgstr "Steuerung übernehmen"
#: openpilot/starpilot/ui/translation_strings.py
msgid "LEAD"
msgstr "VORAUSFAHRENDES FAHRZEUG"
#: openpilot/starpilot/ui/translation_strings.py
msgid "CURVE"
msgstr "KURVE"
#: openpilot/starpilot/ui/translation_strings.py
msgid "STOP LIGHT"
msgstr "AMPEL"
#: openpilot/starpilot/ui/translation_strings.py
msgid "SPEED"
msgstr "GESCHWINDIGKEIT"
#: openpilot/starpilot/ui/translation_strings.py
msgid "OFF"
msgstr "AUS"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PREVIOUS"
msgstr "ZURÜCK"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PERSONAL RECORDS"
msgstr "PERSÖNLICHE REKORDE"
#: openpilot/starpilot/ui/translation_strings.py
msgid "REPLAY"
msgstr "WIEDERGABE"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PAUSE"
msgstr "PAUSE"
#: openpilot/starpilot/ui/translation_strings.py
msgid "STOP"
msgstr "STOPP"
#: openpilot/starpilot/ui/translation_strings.py
msgid "BIG"
msgstr "GROSS"
#: openpilot/starpilot/ui/translation_strings.py
msgid "UNKNOWN"
msgstr "UNBEKANNT"
#: openpilot/starpilot/ui/translation_strings.py
msgid "DETAILS"
msgstr "DETAILS"
#: openpilot/starpilot/ui/translation_strings.py
msgid "ALL TIME"
msgstr "GESAMTZEIT"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PAST WEEK"
msgstr "LETZTE WOCHE"
#: openpilot/starpilot/ui/translation_strings.py
msgid "DISTANCE THIS WEEK"
msgstr "STRECKE DIESE WOCHE"
@@ -826,3 +826,675 @@ msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Max speed when engaging openpilot. If you are already driving faster, your current speed is used. Resume restores the previous max speed. Changes apply the next time you engage."
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Home"
msgstr "Inicio"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Driving"
msgstr "Conducción"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Controls"
msgstr "Controles"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Localization"
msgstr "Idioma y región"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Language"
msgstr "Idioma"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Use Kilometers (km/h)"
msgstr "Usar kilómetros (km/h)"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Right-Hand Drive"
msgstr "Volante a la derecha"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Device display language. Untranslated text uses English. Park before changing language."
msgstr "Idioma de la pantalla del dispositivo. El texto sin traducir aparece en inglés. Estacione antes de cambiar el idioma."
#: openpilot/starpilot/ui/translation_strings.py
msgid "Language, units and steering-wheel side for every vehicle."
msgstr "Idioma, unidades y posición del volante para todos los vehículos."
#: openpilot/starpilot/ui/translation_strings.py
msgid "On"
msgstr "Activado"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Off"
msgstr "Desactivado"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Auto"
msgstr "Automático"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Stock"
msgstr "De fábrica"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Custom"
msgstr "Personalizado"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Unavailable"
msgstr "No disponible"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Available"
msgstr "Disponible"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Invalid saved choice"
msgstr "Selección guardada no válida"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Invalid saved value"
msgstr "Valor guardado no válido"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saved choice cannot be read"
msgstr "No se puede leer la selección guardada"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Save"
msgstr "Guardar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saved"
msgstr "Guardado"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saving"
msgstr "Guardando"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Save changes"
msgstr "Guardar cambios"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Could not save"
msgstr "No se pudo guardar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Discard changes"
msgstr "Descartar cambios"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Unsaved changes"
msgstr "Cambios sin guardar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Next"
msgstr "Siguiente"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Previous"
msgstr "Anterior"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Continue"
msgstr "Continuar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Confirm"
msgstr "Confirmar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Apply"
msgstr "Aplicar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Reset to defaults"
msgstr "Restablecer valores predeterminados"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Restore"
msgstr "Restaurar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Default"
msgstr "Predeterminado"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Delete"
msgstr "Eliminar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Remove"
msgstr "Quitar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Add"
msgstr "Añadir"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Edit"
msgstr "Editar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Search"
msgstr "Buscar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Refresh"
msgstr "Actualizar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Retry"
msgstr "Reintentar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Loading"
msgstr "Cargando"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Loading…"
msgstr "Cargando…"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Opening page…"
msgstr "Abriendo página…"
#: openpilot/starpilot/ui/translation_strings.py
msgid "This page could not open."
msgstr "No se pudo abrir esta página."
#: openpilot/starpilot/ui/translation_strings.py
msgid "Reload page"
msgstr "Recargar página"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Refresh Galaxy"
msgstr "Actualizar Galaxy"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Connected"
msgstr "Conectado"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Disconnected"
msgstr "Desconectado"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Connecting"
msgstr "Conectando"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Connect"
msgstr "Conectar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Disconnect"
msgstr "Desconectar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Pair"
msgstr "Vincular"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Pairing"
msgstr "Vinculando"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sign in"
msgstr "Iniciar sesión"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sign out"
msgstr "Cerrar sesión"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Password"
msgstr "Contraseña"
#: openpilot/starpilot/ui/translation_strings.py
msgid "System"
msgstr "Sistema"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Settings"
msgstr "Ajustes"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Appearance"
msgstr "Apariencia"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Display"
msgstr "Pantalla"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Custom Display Settings"
msgstr "Ajustes de pantalla personalizados"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sounds & Alerts"
msgstr "Sonidos y alertas"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sounds"
msgstr "Sonidos"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Alerts"
msgstr "Alertas"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Driving Controls"
msgstr "Controles de conducción"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Vehicle Settings"
msgstr "Ajustes del vehículo"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Vehicle"
msgstr "Vehículo"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Wheel Controls"
msgstr "Controles del volante"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Driving Model"
msgstr "Modelo de conducción"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Models"
msgstr "Modelos"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Model Laboratory"
msgstr "Laboratorio de modelos"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Maps"
msgstr "Mapas"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Navigation"
msgstr "Navegación"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Favorites"
msgstr "Favoritos"
#: openpilot/starpilot/ui/translation_strings.py
msgid "History"
msgstr "Historial"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Drive History"
msgstr "Historial de conducción"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Recent drives"
msgstr "Trayectos recientes"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Last drive"
msgstr "Último trayecto"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Your driving"
msgstr "Tu conducción"
#: openpilot/starpilot/ui/translation_strings.py
msgid "This week"
msgstr "Esta semana"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Personal records"
msgstr "Récords personales"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Vitals"
msgstr "Estado del sistema"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Storage"
msgstr "Almacenamiento"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Tools"
msgstr "Herramientas"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Logs"
msgstr "Registros"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Recordings"
msgstr "Grabaciones"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Replay"
msgstr "Reproducción"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Cameras"
msgstr "Cámaras"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Camera"
msgstr "Cámara"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Bluetooth"
msgstr "Bluetooth"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Offline maps"
msgstr "Mapas sin conexión"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Downloaded"
msgstr "Descargado"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Installed"
msgstr "Instalado"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Install"
msgstr "Instalar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Update"
msgstr "Actualizar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Updates"
msgstr "Actualizaciones"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Check for updates"
msgstr "Buscar actualizaciones"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Parked Power"
msgstr "Energía al estacionar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Force Drive State"
msgstr "Forzar estado de conducción"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Onroad"
msgstr "En marcha"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Offroad"
msgstr "Estacionado"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Always On Lateral"
msgstr "Control lateral permanente"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Long Planner"
msgstr "Planificador longitudinal"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Conditional Driving Modes"
msgstr "Modos de conducción condicionales"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Curve Speed Controller"
msgstr "Control de velocidad en curvas"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Speed Limit Controller"
msgstr "Control de límites de velocidad"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Lane Centering"
msgstr "Centrado de carril"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Lane Change"
msgstr "Cambio de carril"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Lane Change Settings"
msgstr "Ajustes de cambio de carril"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Following distance"
msgstr "Distancia de seguimiento"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Following time"
msgstr "Tiempo de seguimiento"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Traffic Mode"
msgstr "Modo de tráfico"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Chill"
msgstr "Tranquilo"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Experimental"
msgstr "Experimental"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Personality"
msgstr "Estilo de conducción"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Personalities"
msgstr "Estilos de conducción"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saved settings"
msgstr "Ajustes guardados"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Backup"
msgstr "Copia de seguridad"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Backups"
msgstr "Copias de seguridad"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Export"
msgstr "Exportar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Import"
msgstr "Importar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Play"
msgstr "Reproducir"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Pause"
msgstr "Pausar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Stop"
msgstr "Detener"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Start"
msgstr "Iniciar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Front"
msgstr "Delantera"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Rear"
msgstr "Trasera"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Left"
msgstr "Izquierda"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Right"
msgstr "Derecha"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Small"
msgstr "Pequeño"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Big"
msgstr "Grande"
#: openpilot/starpilot/ui/translation_strings.py
msgid "None"
msgstr "Ninguno"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Enabled"
msgstr "Activado"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Disabled"
msgstr "Desactivado"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Not reported"
msgstr "No informado"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Not detected"
msgstr "No detectado"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Warning"
msgstr "Advertencia"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Accept"
msgstr "Aceptar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Reject"
msgstr "Rechazar"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Not now"
msgstr "Ahora no"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Done"
msgstr "Hecho"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Details"
msgstr "Detalles"
#: openpilot/starpilot/ui/translation_strings.py
msgid "View"
msgstr "Ver"
#: openpilot/starpilot/ui/translation_strings.py
msgid "More"
msgstr "Más"
#: openpilot/starpilot/ui/translation_strings.py
msgid "No drives"
msgstr "No hay trayectos"
#: openpilot/starpilot/ui/translation_strings.py
msgid "History unavailable"
msgstr "Historial no disponible"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Loading history"
msgstr "Cargando historial"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Date unavailable"
msgstr "Fecha no disponible"
#: openpilot/starpilot/ui/translation_strings.py
msgid "No results"
msgstr "Sin resultados"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Search settings"
msgstr "Buscar ajustes"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Take control"
msgstr "Tome el control"
#: openpilot/starpilot/ui/translation_strings.py
msgid "LEAD"
msgstr "VEHÍCULO DELANTERO"
#: openpilot/starpilot/ui/translation_strings.py
msgid "CURVE"
msgstr "CURVA"
#: openpilot/starpilot/ui/translation_strings.py
msgid "STOP LIGHT"
msgstr "SEMÁFORO"
#: openpilot/starpilot/ui/translation_strings.py
msgid "SPEED"
msgstr "VELOCIDAD"
#: openpilot/starpilot/ui/translation_strings.py
msgid "OFF"
msgstr "DESACTIVADO"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PREVIOUS"
msgstr "ANTERIOR"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PERSONAL RECORDS"
msgstr "RÉCORDS PERSONALES"
#: openpilot/starpilot/ui/translation_strings.py
msgid "REPLAY"
msgstr "REPRODUCCIÓN"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PAUSE"
msgstr "PAUSAR"
#: openpilot/starpilot/ui/translation_strings.py
msgid "STOP"
msgstr "DETENER"
#: openpilot/starpilot/ui/translation_strings.py
msgid "BIG"
msgstr "GRANDE"
#: openpilot/starpilot/ui/translation_strings.py
msgid "UNKNOWN"
msgstr "DESCONOCIDO"
#: openpilot/starpilot/ui/translation_strings.py
msgid "DETAILS"
msgstr "DETALLES"
#: openpilot/starpilot/ui/translation_strings.py
msgid "ALL TIME"
msgstr "TODO EL TIEMPO"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PAST WEEK"
msgstr "ÚLTIMA SEMANA"
#: openpilot/starpilot/ui/translation_strings.py
msgid "DISTANCE THIS WEEK"
msgstr "DISTANCIA ESTA SEMANA"
@@ -826,3 +826,675 @@ msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Max speed when engaging openpilot. If you are already driving faster, your current speed is used. Resume restores the previous max speed. Changes apply the next time you engage."
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Home"
msgstr "Accueil"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Driving"
msgstr "Conduite"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Controls"
msgstr "Commandes"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Localization"
msgstr "Langue et région"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Language"
msgstr "Langue"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Use Kilometers (km/h)"
msgstr "Utiliser les kilomètres (km/h)"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Right-Hand Drive"
msgstr "Conduite à droite"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Device display language. Untranslated text uses English. Park before changing language."
msgstr "Langue d’affichage de l’appareil. Le texte non traduit reste en anglais. Garez-vous avant de changer la langue."
#: openpilot/starpilot/ui/translation_strings.py
msgid "Language, units and steering-wheel side for every vehicle."
msgstr "Langue, unités et côté du volant pour tous les véhicules."
#: openpilot/starpilot/ui/translation_strings.py
msgid "On"
msgstr "Activé"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Off"
msgstr "Désactivé"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Auto"
msgstr "Automatique"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Stock"
msgstr "D’origine"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Custom"
msgstr "Personnalisé"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Unavailable"
msgstr "Indisponible"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Available"
msgstr "Disponible"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Invalid saved choice"
msgstr "Choix enregistré non valide"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Invalid saved value"
msgstr "Valeur enregistrée non valide"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saved choice cannot be read"
msgstr "Impossible de lire le choix enregistré"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Save"
msgstr "Enregistrer"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saved"
msgstr "Enregistré"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saving"
msgstr "Enregistrement"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Save changes"
msgstr "Enregistrer les modifications"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Could not save"
msgstr "Échec de l’enregistrement"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Discard changes"
msgstr "Abandonner les modifications"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Unsaved changes"
msgstr "Modifications non enregistrées"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Next"
msgstr "Suivant"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Previous"
msgstr "Précédent"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Continue"
msgstr "Continuer"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Confirm"
msgstr "Confirmer"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Apply"
msgstr "Appliquer"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Reset to defaults"
msgstr "Rétablir les valeurs par défaut"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Restore"
msgstr "Restaurer"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Default"
msgstr "Par défaut"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Delete"
msgstr "Supprimer"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Remove"
msgstr "Retirer"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Add"
msgstr "Ajouter"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Edit"
msgstr "Modifier"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Search"
msgstr "Rechercher"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Refresh"
msgstr "Actualiser"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Retry"
msgstr "Réessayer"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Loading"
msgstr "Chargement"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Loading…"
msgstr "Chargement…"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Opening page…"
msgstr "Ouverture de la page…"
#: openpilot/starpilot/ui/translation_strings.py
msgid "This page could not open."
msgstr "Impossible d’ouvrir cette page."
#: openpilot/starpilot/ui/translation_strings.py
msgid "Reload page"
msgstr "Recharger la page"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Refresh Galaxy"
msgstr "Actualiser Galaxy"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Connected"
msgstr "Connecté"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Disconnected"
msgstr "Déconnecté"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Connecting"
msgstr "Connexion"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Connect"
msgstr "Connecter"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Disconnect"
msgstr "Déconnecter"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Pair"
msgstr "Associer"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Pairing"
msgstr "Association"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sign in"
msgstr "Se connecter"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sign out"
msgstr "Se déconnecter"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Password"
msgstr "Mot de passe"
#: openpilot/starpilot/ui/translation_strings.py
msgid "System"
msgstr "Système"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Settings"
msgstr "Paramètres"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Appearance"
msgstr "Apparence"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Display"
msgstr "Affichage"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Custom Display Settings"
msgstr "Paramètres d’affichage personnalisés"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sounds & Alerts"
msgstr "Sons et alertes"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sounds"
msgstr "Sons"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Alerts"
msgstr "Alertes"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Driving Controls"
msgstr "Commandes de conduite"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Vehicle Settings"
msgstr "Paramètres du véhicule"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Vehicle"
msgstr "Véhicule"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Wheel Controls"
msgstr "Commandes au volant"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Driving Model"
msgstr "Modèle de conduite"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Models"
msgstr "Modèles"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Model Laboratory"
msgstr "Laboratoire de modèles"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Maps"
msgstr "Cartes"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Navigation"
msgstr "Navigation"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Favorites"
msgstr "Favoris"
#: openpilot/starpilot/ui/translation_strings.py
msgid "History"
msgstr "Historique"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Drive History"
msgstr "Historique des trajets"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Recent drives"
msgstr "Trajets récents"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Last drive"
msgstr "Dernier trajet"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Your driving"
msgstr "Votre conduite"
#: openpilot/starpilot/ui/translation_strings.py
msgid "This week"
msgstr "Cette semaine"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Personal records"
msgstr "Records personnels"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Vitals"
msgstr "État du système"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Storage"
msgstr "Stockage"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Tools"
msgstr "Outils"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Logs"
msgstr "Journaux"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Recordings"
msgstr "Enregistrements"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Replay"
msgstr "Relecture"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Cameras"
msgstr "Caméras"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Camera"
msgstr "Caméra"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Bluetooth"
msgstr "Bluetooth"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Offline maps"
msgstr "Cartes hors ligne"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Downloaded"
msgstr "Téléchargé"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Installed"
msgstr "Installé"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Install"
msgstr "Installer"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Update"
msgstr "Mettre à jour"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Updates"
msgstr "Mises à jour"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Check for updates"
msgstr "Rechercher des mises à jour"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Parked Power"
msgstr "Alimentation à l’arrêt"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Force Drive State"
msgstr "Forcer l’état de conduite"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Onroad"
msgstr "En conduite"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Offroad"
msgstr "À l’arrêt"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Always On Lateral"
msgstr "Contrôle latéral permanent"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Long Planner"
msgstr "Planificateur longitudinal"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Conditional Driving Modes"
msgstr "Modes de conduite conditionnels"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Curve Speed Controller"
msgstr "Contrôle de vitesse en virage"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Speed Limit Controller"
msgstr "Contrôle des limitations de vitesse"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Lane Centering"
msgstr "Centrage dans la voie"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Lane Change"
msgstr "Changement de voie"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Lane Change Settings"
msgstr "Paramètres de changement de voie"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Following distance"
msgstr "Distance de suivi"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Following time"
msgstr "Temps de suivi"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Traffic Mode"
msgstr "Mode embouteillage"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Chill"
msgstr "Calme"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Experimental"
msgstr "Expérimental"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Personality"
msgstr "Style de conduite"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Personalities"
msgstr "Styles de conduite"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saved settings"
msgstr "Paramètres enregistrés"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Backup"
msgstr "Sauvegarde"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Backups"
msgstr "Sauvegardes"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Export"
msgstr "Exporter"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Import"
msgstr "Importer"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Play"
msgstr "Lire"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Pause"
msgstr "Pause"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Stop"
msgstr "Arrêter"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Start"
msgstr "Démarrer"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Front"
msgstr "Avant"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Rear"
msgstr "Arrière"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Left"
msgstr "Gauche"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Right"
msgstr "Droite"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Small"
msgstr "Petit"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Big"
msgstr "Grand"
#: openpilot/starpilot/ui/translation_strings.py
msgid "None"
msgstr "Aucun"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Enabled"
msgstr "Activé"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Disabled"
msgstr "Désactivé"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Not reported"
msgstr "Non signalé"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Not detected"
msgstr "Non détecté"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Warning"
msgstr "Avertissement"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Accept"
msgstr "Accepter"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Reject"
msgstr "Refuser"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Not now"
msgstr "Pas maintenant"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Done"
msgstr "Terminé"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Details"
msgstr "Détails"
#: openpilot/starpilot/ui/translation_strings.py
msgid "View"
msgstr "Afficher"
#: openpilot/starpilot/ui/translation_strings.py
msgid "More"
msgstr "Plus"
#: openpilot/starpilot/ui/translation_strings.py
msgid "No drives"
msgstr "Aucun trajet"
#: openpilot/starpilot/ui/translation_strings.py
msgid "History unavailable"
msgstr "Historique indisponible"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Loading history"
msgstr "Chargement de l’historique"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Date unavailable"
msgstr "Date indisponible"
#: openpilot/starpilot/ui/translation_strings.py
msgid "No results"
msgstr "Aucun résultat"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Search settings"
msgstr "Rechercher des paramètres"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Take control"
msgstr "Reprenez le contrôle"
#: openpilot/starpilot/ui/translation_strings.py
msgid "LEAD"
msgstr "VÉHICULE DEVANT"
#: openpilot/starpilot/ui/translation_strings.py
msgid "CURVE"
msgstr "VIRAGE"
#: openpilot/starpilot/ui/translation_strings.py
msgid "STOP LIGHT"
msgstr "FEU DE SIGNALISATION"
#: openpilot/starpilot/ui/translation_strings.py
msgid "SPEED"
msgstr "VITESSE"
#: openpilot/starpilot/ui/translation_strings.py
msgid "OFF"
msgstr "DÉSACTIVÉ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PREVIOUS"
msgstr "PRÉCÉDENT"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PERSONAL RECORDS"
msgstr "RECORDS PERSONNELS"
#: openpilot/starpilot/ui/translation_strings.py
msgid "REPLAY"
msgstr "RELECTURE"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PAUSE"
msgstr "PAUSE"
#: openpilot/starpilot/ui/translation_strings.py
msgid "STOP"
msgstr "ARRÊTER"
#: openpilot/starpilot/ui/translation_strings.py
msgid "BIG"
msgstr "GRAND"
#: openpilot/starpilot/ui/translation_strings.py
msgid "UNKNOWN"
msgstr "INCONNU"
#: openpilot/starpilot/ui/translation_strings.py
msgid "DETAILS"
msgstr "DÉTAILS"
#: openpilot/starpilot/ui/translation_strings.py
msgid "ALL TIME"
msgstr "DEPUIS LE DÉBUT"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PAST WEEK"
msgstr "SEMAINE PASSÉE"
#: openpilot/starpilot/ui/translation_strings.py
msgid "DISTANCE THIS WEEK"
msgstr "DISTANCE CETTE SEMAINE"
@@ -822,3 +822,675 @@ msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Max speed when engaging openpilot. If you are already driving faster, your current speed is used. Resume restores the previous max speed. Changes apply the next time you engage."
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Home"
msgstr "ホーム"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Driving"
msgstr "運転"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Controls"
msgstr "操作"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Localization"
msgstr "地域と言語"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Language"
msgstr "言語"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Use Kilometers (km/h)"
msgstr "キロメートルを使用 (km/h)"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Right-Hand Drive"
msgstr "右ハンドル"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Device display language. Untranslated text uses English. Park before changing language."
msgstr "デバイスの表示言語です。未翻訳の文章は英語で表示されます。言語の変更は駐車中に行ってください。"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Language, units and steering-wheel side for every vehicle."
msgstr "すべての車両の言語、単位、ハンドル位置。"
#: openpilot/starpilot/ui/translation_strings.py
msgid "On"
msgstr "オン"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Off"
msgstr "オフ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Auto"
msgstr "自動"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Stock"
msgstr "標準"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Custom"
msgstr "カスタム"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Unavailable"
msgstr "利用不可"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Available"
msgstr "利用可能"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Invalid saved choice"
msgstr "保存された選択が無効です"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Invalid saved value"
msgstr "保存された値が無効です"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saved choice cannot be read"
msgstr "保存された選択を読み取れません"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Save"
msgstr "保存"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saved"
msgstr "保存済み"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saving"
msgstr "保存中"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Save changes"
msgstr "変更を保存"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Could not save"
msgstr "保存できませんでした"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Discard changes"
msgstr "変更を破棄"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Unsaved changes"
msgstr "未保存の変更"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Next"
msgstr "次へ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Previous"
msgstr "前へ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Continue"
msgstr "続行"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Confirm"
msgstr "確認"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Apply"
msgstr "適用"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Reset to defaults"
msgstr "初期設定に戻す"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Restore"
msgstr "復元"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Default"
msgstr "初期設定"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Delete"
msgstr "削除"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Remove"
msgstr "削除"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Add"
msgstr "追加"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Edit"
msgstr "編集"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Search"
msgstr "検索"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Refresh"
msgstr "更新"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Retry"
msgstr "再試行"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Loading"
msgstr "読み込み中"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Loading…"
msgstr "読み込み中…"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Opening page…"
msgstr "ページを開いています…"
#: openpilot/starpilot/ui/translation_strings.py
msgid "This page could not open."
msgstr "このページを開けませんでした。"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Reload page"
msgstr "ページを再読み込み"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Refresh Galaxy"
msgstr "Galaxyを更新"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Connected"
msgstr "接続済み"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Disconnected"
msgstr "未接続"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Connecting"
msgstr "接続中"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Connect"
msgstr "接続"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Disconnect"
msgstr "切断"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Pair"
msgstr "ペアリング"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Pairing"
msgstr "ペアリング中"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sign in"
msgstr "ログイン"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sign out"
msgstr "ログアウト"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Password"
msgstr "パスワード"
#: openpilot/starpilot/ui/translation_strings.py
msgid "System"
msgstr "システム"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Settings"
msgstr "設定"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Appearance"
msgstr "外観"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Display"
msgstr "表示"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Custom Display Settings"
msgstr "表示のカスタム設定"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sounds & Alerts"
msgstr "サウンドと警告"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sounds"
msgstr "サウンド"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Alerts"
msgstr "警告"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Driving Controls"
msgstr "運転制御"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Vehicle Settings"
msgstr "車両設定"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Vehicle"
msgstr "車両"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Wheel Controls"
msgstr "ハンドル操作"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Driving Model"
msgstr "運転モデル"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Models"
msgstr "モデル"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Model Laboratory"
msgstr "モデルラボ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Maps"
msgstr "地図"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Navigation"
msgstr "ナビゲーション"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Favorites"
msgstr "お気に入り"
#: openpilot/starpilot/ui/translation_strings.py
msgid "History"
msgstr "履歴"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Drive History"
msgstr "運転履歴"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Recent drives"
msgstr "最近の走行"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Last drive"
msgstr "前回の走行"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Your driving"
msgstr "あなたの運転"
#: openpilot/starpilot/ui/translation_strings.py
msgid "This week"
msgstr "今週"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Personal records"
msgstr "自己記録"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Vitals"
msgstr "稼働状況"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Storage"
msgstr "ストレージ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Tools"
msgstr "ツール"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Logs"
msgstr "ログ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Recordings"
msgstr "録画"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Replay"
msgstr "リプレイ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Cameras"
msgstr "カメラ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Camera"
msgstr "カメラ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Bluetooth"
msgstr "Bluetooth"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Offline maps"
msgstr "オフライン地図"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Downloaded"
msgstr "ダウンロード済み"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Installed"
msgstr "インストール済み"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Install"
msgstr "インストール"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Update"
msgstr "更新"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Updates"
msgstr "更新"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Check for updates"
msgstr "更新を確認"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Parked Power"
msgstr "駐車中の電源"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Force Drive State"
msgstr "走行状態を強制設定"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Onroad"
msgstr "走行中"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Offroad"
msgstr "停車中"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Always On Lateral"
msgstr "常時横方向制御"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Long Planner"
msgstr "縦方向プランナー"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Conditional Driving Modes"
msgstr "条件付き運転モード"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Curve Speed Controller"
msgstr "カーブ速度制御"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Speed Limit Controller"
msgstr "制限速度制御"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Lane Centering"
msgstr "車線中央維持"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Lane Change"
msgstr "車線変更"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Lane Change Settings"
msgstr "車線変更設定"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Following distance"
msgstr "車間距離"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Following time"
msgstr "車間時間"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Traffic Mode"
msgstr "渋滞モード"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Chill"
msgstr "穏やか"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Experimental"
msgstr "実験的"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Personality"
msgstr "運転スタイル"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Personalities"
msgstr "運転スタイル"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saved settings"
msgstr "保存済みの設定"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Backup"
msgstr "バックアップ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Backups"
msgstr "バックアップ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Export"
msgstr "エクスポート"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Import"
msgstr "インポート"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Play"
msgstr "再生"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Pause"
msgstr "一時停止"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Stop"
msgstr "停止"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Start"
msgstr "開始"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Front"
msgstr "前方"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Rear"
msgstr "後方"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Left"
msgstr "左"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Right"
msgstr "右"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Small"
msgstr "小"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Big"
msgstr "大"
#: openpilot/starpilot/ui/translation_strings.py
msgid "None"
msgstr "なし"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Enabled"
msgstr "有効"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Disabled"
msgstr "無効"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Not reported"
msgstr "報告なし"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Not detected"
msgstr "未検出"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Warning"
msgstr "警告"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Accept"
msgstr "承認"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Reject"
msgstr "拒否"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Not now"
msgstr "後で"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Done"
msgstr "完了"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Details"
msgstr "詳細"
#: openpilot/starpilot/ui/translation_strings.py
msgid "View"
msgstr "表示"
#: openpilot/starpilot/ui/translation_strings.py
msgid "More"
msgstr "その他"
#: openpilot/starpilot/ui/translation_strings.py
msgid "No drives"
msgstr "走行履歴なし"
#: openpilot/starpilot/ui/translation_strings.py
msgid "History unavailable"
msgstr "履歴を利用できません"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Loading history"
msgstr "履歴を読み込み中"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Date unavailable"
msgstr "日付不明"
#: openpilot/starpilot/ui/translation_strings.py
msgid "No results"
msgstr "結果なし"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Search settings"
msgstr "設定を検索"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Take control"
msgstr "運転を引き継いでください"
#: openpilot/starpilot/ui/translation_strings.py
msgid "LEAD"
msgstr "先行車"
#: openpilot/starpilot/ui/translation_strings.py
msgid "CURVE"
msgstr "カーブ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "STOP LIGHT"
msgstr "信号機"
#: openpilot/starpilot/ui/translation_strings.py
msgid "SPEED"
msgstr "速度"
#: openpilot/starpilot/ui/translation_strings.py
msgid "OFF"
msgstr "オフ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PREVIOUS"
msgstr "前へ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PERSONAL RECORDS"
msgstr "自己記録"
#: openpilot/starpilot/ui/translation_strings.py
msgid "REPLAY"
msgstr "リプレイ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PAUSE"
msgstr "一時停止"
#: openpilot/starpilot/ui/translation_strings.py
msgid "STOP"
msgstr "停止"
#: openpilot/starpilot/ui/translation_strings.py
msgid "BIG"
msgstr "大"
#: openpilot/starpilot/ui/translation_strings.py
msgid "UNKNOWN"
msgstr "不明"
#: openpilot/starpilot/ui/translation_strings.py
msgid "DETAILS"
msgstr "詳細"
#: openpilot/starpilot/ui/translation_strings.py
msgid "ALL TIME"
msgstr "全期間"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PAST WEEK"
msgstr "過去1週間"
#: openpilot/starpilot/ui/translation_strings.py
msgid "DISTANCE THIS WEEK"
msgstr "今週の走行距離"
@@ -822,3 +822,675 @@ msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Max speed when engaging openpilot. If you are already driving faster, your current speed is used. Resume restores the previous max speed. Changes apply the next time you engage."
msgstr ""
#: openpilot/starpilot/ui/translation_strings.py
msgid "Home"
msgstr "홈"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Driving"
msgstr "주행"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Controls"
msgstr "제어"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Localization"
msgstr "언어 및 지역"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Language"
msgstr "언어"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Use Kilometers (km/h)"
msgstr "킬로미터 사용 (km/h)"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Right-Hand Drive"
msgstr "우측 운전석"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Device display language. Untranslated text uses English. Park before changing language."
msgstr "기기 표시 언어입니다. 번역되지 않은 텍스트는 영어로 표시됩니다. 주차 후 언어를 변경하세요."
#: openpilot/starpilot/ui/translation_strings.py
msgid "Language, units and steering-wheel side for every vehicle."
msgstr "모든 차량의 언어, 단위 및 운전석 위치."
#: openpilot/starpilot/ui/translation_strings.py
msgid "On"
msgstr "켜짐"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Off"
msgstr "꺼짐"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Auto"
msgstr "자동"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Stock"
msgstr "기본"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Custom"
msgstr "사용자 지정"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Unavailable"
msgstr "사용 불가"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Available"
msgstr "사용 가능"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Invalid saved choice"
msgstr "저장된 선택이 잘못되었습니다"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Invalid saved value"
msgstr "저장된 값이 잘못되었습니다"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saved choice cannot be read"
msgstr "저장된 선택을 읽을 수 없습니다"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Save"
msgstr "저장"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saved"
msgstr "저장됨"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saving"
msgstr "저장 중"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Save changes"
msgstr "변경 사항 저장"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Could not save"
msgstr "저장하지 못했습니다"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Discard changes"
msgstr "변경 사항 취소"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Unsaved changes"
msgstr "저장되지 않은 변경 사항"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Next"
msgstr "다음"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Previous"
msgstr "이전"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Continue"
msgstr "계속"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Confirm"
msgstr "확인"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Apply"
msgstr "적용"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Reset to defaults"
msgstr "기본값으로 초기화"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Restore"
msgstr "복원"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Default"
msgstr "기본값"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Delete"
msgstr "삭제"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Remove"
msgstr "제거"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Add"
msgstr "추가"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Edit"
msgstr "편집"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Search"
msgstr "검색"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Refresh"
msgstr "새로 고침"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Retry"
msgstr "다시 시도"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Loading"
msgstr "불러오는 중"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Loading…"
msgstr "불러오는 중…"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Opening page…"
msgstr "페이지 여는 중…"
#: openpilot/starpilot/ui/translation_strings.py
msgid "This page could not open."
msgstr "이 페이지를 열 수 없습니다."
#: openpilot/starpilot/ui/translation_strings.py
msgid "Reload page"
msgstr "페이지 새로 고침"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Refresh Galaxy"
msgstr "Galaxy 새로 고침"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Connected"
msgstr "연결됨"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Disconnected"
msgstr "연결 끊김"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Connecting"
msgstr "연결 중"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Connect"
msgstr "연결"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Disconnect"
msgstr "연결 해제"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Pair"
msgstr "페어링"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Pairing"
msgstr "페어링 중"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sign in"
msgstr "로그인"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sign out"
msgstr "로그아웃"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Password"
msgstr "비밀번호"
#: openpilot/starpilot/ui/translation_strings.py
msgid "System"
msgstr "시스템"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Settings"
msgstr "설정"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Appearance"
msgstr "모양"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Display"
msgstr "화면"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Custom Display Settings"
msgstr "사용자 지정 화면 설정"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sounds & Alerts"
msgstr "소리 및 경고"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sounds"
msgstr "소리"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Alerts"
msgstr "경고"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Driving Controls"
msgstr "주행 제어"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Vehicle Settings"
msgstr "차량 설정"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Vehicle"
msgstr "차량"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Wheel Controls"
msgstr "핸들 제어"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Driving Model"
msgstr "주행 모델"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Models"
msgstr "모델"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Model Laboratory"
msgstr "모델 실험실"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Maps"
msgstr "지도"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Navigation"
msgstr "내비게이션"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Favorites"
msgstr "즐겨찾기"
#: openpilot/starpilot/ui/translation_strings.py
msgid "History"
msgstr "기록"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Drive History"
msgstr "주행 기록"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Recent drives"
msgstr "최근 주행"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Last drive"
msgstr "지난 주행"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Your driving"
msgstr "내 주행"
#: openpilot/starpilot/ui/translation_strings.py
msgid "This week"
msgstr "이번 주"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Personal records"
msgstr "개인 기록"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Vitals"
msgstr "시스템 상태"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Storage"
msgstr "저장 공간"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Tools"
msgstr "도구"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Logs"
msgstr "로그"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Recordings"
msgstr "녹화"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Replay"
msgstr "다시 보기"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Cameras"
msgstr "카메라"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Camera"
msgstr "카메라"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Bluetooth"
msgstr "Bluetooth"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Offline maps"
msgstr "오프라인 지도"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Downloaded"
msgstr "다운로드됨"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Installed"
msgstr "설치됨"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Install"
msgstr "설치"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Update"
msgstr "업데이트"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Updates"
msgstr "업데이트"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Check for updates"
msgstr "업데이트 확인"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Parked Power"
msgstr "주차 중 전원"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Force Drive State"
msgstr "주행 상태 강제 설정"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Onroad"
msgstr "주행 중"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Offroad"
msgstr "주차 중"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Always On Lateral"
msgstr "항상 횡방향 제어"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Long Planner"
msgstr "종방향 플래너"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Conditional Driving Modes"
msgstr "조건부 주행 모드"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Curve Speed Controller"
msgstr "커브 속도 제어"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Speed Limit Controller"
msgstr "제한 속도 제어"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Lane Centering"
msgstr "차로 중앙 유지"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Lane Change"
msgstr "차로 변경"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Lane Change Settings"
msgstr "차로 변경 설정"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Following distance"
msgstr "차간 거리"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Following time"
msgstr "차간 시간"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Traffic Mode"
msgstr "정체 모드"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Chill"
msgstr "편안함"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Experimental"
msgstr "실험적"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Personality"
msgstr "주행 성향"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Personalities"
msgstr "주행 성향"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saved settings"
msgstr "저장된 설정"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Backup"
msgstr "백업"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Backups"
msgstr "백업"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Export"
msgstr "내보내기"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Import"
msgstr "가져오기"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Play"
msgstr "재생"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Pause"
msgstr "일시 정지"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Stop"
msgstr "정지"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Start"
msgstr "시작"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Front"
msgstr "전방"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Rear"
msgstr "후방"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Left"
msgstr "왼쪽"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Right"
msgstr "오른쪽"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Small"
msgstr "작게"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Big"
msgstr "크게"
#: openpilot/starpilot/ui/translation_strings.py
msgid "None"
msgstr "없음"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Enabled"
msgstr "활성화됨"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Disabled"
msgstr "비활성화됨"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Not reported"
msgstr "보고되지 않음"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Not detected"
msgstr "감지되지 않음"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Warning"
msgstr "경고"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Accept"
msgstr "수락"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Reject"
msgstr "거부"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Not now"
msgstr "나중에"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Done"
msgstr "완료"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Details"
msgstr "세부 정보"
#: openpilot/starpilot/ui/translation_strings.py
msgid "View"
msgstr "보기"
#: openpilot/starpilot/ui/translation_strings.py
msgid "More"
msgstr "더 보기"
#: openpilot/starpilot/ui/translation_strings.py
msgid "No drives"
msgstr "주행 기록 없음"
#: openpilot/starpilot/ui/translation_strings.py
msgid "History unavailable"
msgstr "기록을 사용할 수 없습니다"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Loading history"
msgstr "기록 불러오는 중"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Date unavailable"
msgstr "날짜를 사용할 수 없음"
#: openpilot/starpilot/ui/translation_strings.py
msgid "No results"
msgstr "결과 없음"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Search settings"
msgstr "설정 검색"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Take control"
msgstr "직접 제어하세요"
#: openpilot/starpilot/ui/translation_strings.py
msgid "LEAD"
msgstr "선행 차량"
#: openpilot/starpilot/ui/translation_strings.py
msgid "CURVE"
msgstr "커브"
#: openpilot/starpilot/ui/translation_strings.py
msgid "STOP LIGHT"
msgstr "신호등"
#: openpilot/starpilot/ui/translation_strings.py
msgid "SPEED"
msgstr "속도"
#: openpilot/starpilot/ui/translation_strings.py
msgid "OFF"
msgstr "꺼짐"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PREVIOUS"
msgstr "이전"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PERSONAL RECORDS"
msgstr "개인 기록"
#: openpilot/starpilot/ui/translation_strings.py
msgid "REPLAY"
msgstr "다시 보기"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PAUSE"
msgstr "일시 정지"
#: openpilot/starpilot/ui/translation_strings.py
msgid "STOP"
msgstr "정지"
#: openpilot/starpilot/ui/translation_strings.py
msgid "BIG"
msgstr "크게"
#: openpilot/starpilot/ui/translation_strings.py
msgid "UNKNOWN"
msgstr "알 수 없음"
#: openpilot/starpilot/ui/translation_strings.py
msgid "DETAILS"
msgstr "세부 정보"
#: openpilot/starpilot/ui/translation_strings.py
msgid "ALL TIME"
msgstr "전체 기간"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PAST WEEK"
msgstr "지난주"
#: openpilot/starpilot/ui/translation_strings.py
msgid "DISTANCE THIS WEEK"
msgstr "이번 주 주행 거리"
@@ -822,3 +822,675 @@ msgstr "Tốc độ tối đa ban đầu"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Max speed when engaging openpilot. If you are already driving faster, your current speed is used. Resume restores the previous max speed. Changes apply the next time you engage."
msgstr "Tốc độ tối đa khi kích hoạt openpilot. Nếu bạn đang chạy nhanh hơn, tốc độ hiện tại sẽ được dùng. Nút tiếp tục khôi phục tốc độ tối đa trước đó. Thay đổi có hiệu lực ở lần kích hoạt tiếp theo."
#: openpilot/starpilot/ui/translation_strings.py
msgid "Home"
msgstr "Trang chủ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Driving"
msgstr "Lái xe"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Controls"
msgstr "Điều khiển"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Localization"
msgstr "Ngôn ngữ và khu vực"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Language"
msgstr "Ngôn ngữ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Use Kilometers (km/h)"
msgstr "Dùng kilômét (km/h)"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Right-Hand Drive"
msgstr "Tay lái bên phải"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Device display language. Untranslated text uses English. Park before changing language."
msgstr "Ngôn ngữ hiển thị của thiết bị. Văn bản chưa dịch dùng tiếng Anh. Đỗ xe trước khi đổi ngôn ngữ."
#: openpilot/starpilot/ui/translation_strings.py
msgid "Language, units and steering-wheel side for every vehicle."
msgstr "Ngôn ngữ, đơn vị và vị trí tay lái cho mọi xe."
#: openpilot/starpilot/ui/translation_strings.py
msgid "On"
msgstr "Bật"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Off"
msgstr "Tắt"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Auto"
msgstr "Tự động"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Stock"
msgstr "Nguyên bản"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Custom"
msgstr "Tùy chỉnh"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Unavailable"
msgstr "Không khả dụng"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Available"
msgstr "Khả dụng"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Invalid saved choice"
msgstr "Lựa chọn đã lưu không hợp lệ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Invalid saved value"
msgstr "Giá trị đã lưu không hợp lệ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saved choice cannot be read"
msgstr "Không đọc được lựa chọn đã lưu"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Save"
msgstr "Lưu"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saved"
msgstr "Đã lưu"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saving"
msgstr "Đang lưu"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Save changes"
msgstr "Lưu thay đổi"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Could not save"
msgstr "Không lưu được"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Discard changes"
msgstr "Bỏ thay đổi"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Unsaved changes"
msgstr "Thay đổi chưa lưu"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Next"
msgstr "Tiếp theo"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Previous"
msgstr "Trước"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Continue"
msgstr "Tiếp tục"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Confirm"
msgstr "Xác nhận"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Apply"
msgstr "Áp dụng"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Reset to defaults"
msgstr "Đặt lại mặc định"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Restore"
msgstr "Khôi phục"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Default"
msgstr "Mặc định"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Delete"
msgstr "Xóa"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Remove"
msgstr "Gỡ bỏ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Add"
msgstr "Thêm"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Edit"
msgstr "Chỉnh sửa"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Search"
msgstr "Tìm kiếm"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Refresh"
msgstr "Làm mới"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Retry"
msgstr "Thử lại"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Loading"
msgstr "Đang tải"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Loading…"
msgstr "Đang tải…"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Opening page…"
msgstr "Đang mở trang…"
#: openpilot/starpilot/ui/translation_strings.py
msgid "This page could not open."
msgstr "Không mở được trang này."
#: openpilot/starpilot/ui/translation_strings.py
msgid "Reload page"
msgstr "Tải lại trang"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Refresh Galaxy"
msgstr "Làm mới Galaxy"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Connected"
msgstr "Đã kết nối"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Disconnected"
msgstr "Đã ngắt kết nối"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Connecting"
msgstr "Đang kết nối"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Connect"
msgstr "Kết nối"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Disconnect"
msgstr "Ngắt kết nối"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Pair"
msgstr "Ghép nối"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Pairing"
msgstr "Đang ghép nối"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sign in"
msgstr "Đăng nhập"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sign out"
msgstr "Đăng xuất"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Password"
msgstr "Mật khẩu"
#: openpilot/starpilot/ui/translation_strings.py
msgid "System"
msgstr "Hệ thống"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Settings"
msgstr "Cài đặt"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Appearance"
msgstr "Giao diện"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Display"
msgstr "Hiển thị"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Custom Display Settings"
msgstr "Cài đặt hiển thị tùy chỉnh"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sounds & Alerts"
msgstr "Âm thanh và cảnh báo"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Sounds"
msgstr "Âm thanh"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Alerts"
msgstr "Cảnh báo"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Driving Controls"
msgstr "Điều khiển lái xe"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Vehicle Settings"
msgstr "Cài đặt xe"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Vehicle"
msgstr "Xe"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Wheel Controls"
msgstr "Điều khiển vô lăng"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Driving Model"
msgstr "Mô hình lái"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Models"
msgstr "Mô hình"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Model Laboratory"
msgstr "Phòng thử nghiệm mô hình"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Maps"
msgstr "Bản đồ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Navigation"
msgstr "Điều hướng"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Favorites"
msgstr "Yêu thích"
#: openpilot/starpilot/ui/translation_strings.py
msgid "History"
msgstr "Lịch sử"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Drive History"
msgstr "Lịch sử lái xe"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Recent drives"
msgstr "Chuyến đi gần đây"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Last drive"
msgstr "Chuyến đi trước"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Your driving"
msgstr "Việc lái xe của bạn"
#: openpilot/starpilot/ui/translation_strings.py
msgid "This week"
msgstr "Tuần này"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Personal records"
msgstr "Kỷ lục cá nhân"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Vitals"
msgstr "Trạng thái hệ thống"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Storage"
msgstr "Bộ nhớ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Tools"
msgstr "Công cụ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Logs"
msgstr "Nhật ký"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Recordings"
msgstr "Bản ghi"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Replay"
msgstr "Phát lại"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Cameras"
msgstr "Camera"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Camera"
msgstr "Camera"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Bluetooth"
msgstr "Bluetooth"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Offline maps"
msgstr "Bản đồ ngoại tuyến"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Downloaded"
msgstr "Đã tải xuống"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Installed"
msgstr "Đã cài đặt"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Install"
msgstr "Cài đặt"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Update"
msgstr "Cập nhật"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Updates"
msgstr "Bản cập nhật"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Check for updates"
msgstr "Kiểm tra cập nhật"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Parked Power"
msgstr "Nguồn điện khi đỗ xe"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Force Drive State"
msgstr "Buộc trạng thái lái"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Onroad"
msgstr "Đang chạy"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Offroad"
msgstr "Đã đỗ xe"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Always On Lateral"
msgstr "Luôn điều khiển ngang"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Long Planner"
msgstr "Bộ lập kế hoạch dọc"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Conditional Driving Modes"
msgstr "Chế độ lái có điều kiện"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Curve Speed Controller"
msgstr "Điều khiển tốc độ khi vào cua"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Speed Limit Controller"
msgstr "Điều khiển giới hạn tốc độ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Lane Centering"
msgstr "Giữ giữa làn"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Lane Change"
msgstr "Chuyển làn"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Lane Change Settings"
msgstr "Cài đặt chuyển làn"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Following distance"
msgstr "Khoảng cách theo xe"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Following time"
msgstr "Thời gian theo xe"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Traffic Mode"
msgstr "Chế độ giao thông"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Chill"
msgstr "Thư thả"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Experimental"
msgstr "Thử nghiệm"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Personality"
msgstr "Phong cách lái"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Personalities"
msgstr "Phong cách lái"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Saved settings"
msgstr "Cài đặt đã lưu"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Backup"
msgstr "Sao lưu"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Backups"
msgstr "Bản sao lưu"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Export"
msgstr "Xuất"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Import"
msgstr "Nhập"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Play"
msgstr "Phát"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Pause"
msgstr "Tạm dừng"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Stop"
msgstr "Dừng"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Start"
msgstr "Bắt đầu"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Front"
msgstr "Phía trước"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Rear"
msgstr "Phía sau"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Left"
msgstr "Trái"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Right"
msgstr "Phải"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Small"
msgstr "Nhỏ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Big"
msgstr "Lớn"
#: openpilot/starpilot/ui/translation_strings.py
msgid "None"
msgstr "Không có"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Enabled"
msgstr "Đã bật"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Disabled"
msgstr "Đã tắt"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Not reported"
msgstr "Chưa báo cáo"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Not detected"
msgstr "Không phát hiện"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Warning"
msgstr "Cảnh báo"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Accept"
msgstr "Chấp nhận"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Reject"
msgstr "Từ chối"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Not now"
msgstr "Để sau"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Done"
msgstr "Xong"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Details"
msgstr "Chi tiết"
#: openpilot/starpilot/ui/translation_strings.py
msgid "View"
msgstr "Xem"
#: openpilot/starpilot/ui/translation_strings.py
msgid "More"
msgstr "Thêm"
#: openpilot/starpilot/ui/translation_strings.py
msgid "No drives"
msgstr "Không có chuyến đi"
#: openpilot/starpilot/ui/translation_strings.py
msgid "History unavailable"
msgstr "Lịch sử không khả dụng"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Loading history"
msgstr "Đang tải lịch sử"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Date unavailable"
msgstr "Không có ngày"
#: openpilot/starpilot/ui/translation_strings.py
msgid "No results"
msgstr "Không có kết quả"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Search settings"
msgstr "Tìm cài đặt"
#: openpilot/starpilot/ui/translation_strings.py
msgid "Take control"
msgstr "Tiếp quản điều khiển"
#: openpilot/starpilot/ui/translation_strings.py
msgid "LEAD"
msgstr "XE PHÍA TRƯỚC"
#: openpilot/starpilot/ui/translation_strings.py
msgid "CURVE"
msgstr "KHÚC CUA"
#: openpilot/starpilot/ui/translation_strings.py
msgid "STOP LIGHT"
msgstr "ĐÈN GIAO THÔNG"
#: openpilot/starpilot/ui/translation_strings.py
msgid "SPEED"
msgstr "TỐC ĐỘ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "OFF"
msgstr "TẮT"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PREVIOUS"
msgstr "TRƯỚC"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PERSONAL RECORDS"
msgstr "KỶ LỤC CÁ NHÂN"
#: openpilot/starpilot/ui/translation_strings.py
msgid "REPLAY"
msgstr "PHÁT LẠI"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PAUSE"
msgstr "TẠM DỪNG"
#: openpilot/starpilot/ui/translation_strings.py
msgid "STOP"
msgstr "DỪNG"
#: openpilot/starpilot/ui/translation_strings.py
msgid "BIG"
msgstr "LỚN"
#: openpilot/starpilot/ui/translation_strings.py
msgid "UNKNOWN"
msgstr "KHÔNG RÕ"
#: openpilot/starpilot/ui/translation_strings.py
msgid "DETAILS"
msgstr "CHI TIẾT"
#: openpilot/starpilot/ui/translation_strings.py
msgid "ALL TIME"
msgstr "TOÀN BỘ THỜI GIAN"
#: openpilot/starpilot/ui/translation_strings.py
msgid "PAST WEEK"
msgstr "TUẦN QUA"
#: openpilot/starpilot/ui/translation_strings.py
msgid "DISTANCE THIS WEEK"
msgstr "QUÃNG ĐƯỜNG TUẦN NÀY"
@@ -19,6 +19,8 @@ def update_translations():
if filename.endswith(".py"):
files.append(os.path.relpath(os.path.join(root, filename), BASEDIR))
files.append("openpilot/starpilot/ui/translation_strings.py")
# Extract translatable strings and generate .pot template
entries = extract_strings(files, BASEDIR)
generate_pot(entries, POT_FILE)
+19
View File
@@ -145,3 +145,22 @@ The UI adapts StarPilot's earlier Vue Galaxy design; the adapted StarPilot
source remains under the repository [LICENSE](../../../LICENSE). The bundled
Vue and Bootstrap Icons assets retain their respective MIT notices in
`web/vendor/notices/`. Other asset notices remain beside their files.
## Shared display language
Galaxy → Toggles → Localization selects the persistent openpilot `LanguageSetting`.
Galaxy reads the authenticated `/api/localization` endpoint and applies the same
`selfdrive/ui/translations/app_*.po` catalogs used by the device. Language changes
apply to an open Galaxy page within two seconds. Translation changes presentation
text and accessibility labels; request values, parameter keys, input values and
technical logs remain unchanged. The native large/compact renderer translates
measurements and drawing together and loads bundled Unicode fonts as needed.
`starpilot/ui/translation_strings.py` marks shared labels for the existing catalog
update tool. The initial shared set covers navigation, common actions, settings
groups, home statistics and several onroad labels in Japanese, Korean, Spanish, French, German and
Vietnamese. The catalogs also retain stock openpilot translations. This is not
complete sentence coverage: long feature explanations, dynamically assembled
messages and unlisted labels remain English. Boot/login screens initially use
English until an authenticated language response is available. User-entered
text, logs, identifiers and brand names are not translation targets.
@@ -0,0 +1,22 @@
"""Read the device's shared language and expose its existing openpilot catalog."""
from functools import lru_cache
from openpilot.starpilot.galaxy.localization_settings import LANGUAGES
from openpilot.starpilot.saved_source import read_saved
from openpilot.system.ui.lib.multilang import TRANSLATIONS_DIR, load_translations
@lru_cache(maxsize=16)
def catalog(code):
if code == "en":
return {}
messages, _ = load_translations(TRANSLATIONS_DIR.joinpath(f"app_{code}.po"))
return {source: translated for source, translated in messages.items() if translated and source != translated}
def language_snapshot(params, previous=""):
raw, readable = read_saved(params, "LanguageSetting", 32)
code = (raw or b"en").decode("utf-8", errors="replace").removeprefix("main_")
code = code if readable and code in LANGUAGES.values() else "en"
return {"language": code, **({} if previous == code else {"messages": catalog(code)})}
+7
View File
@@ -740,6 +740,13 @@ def make_server(*, port=8082, host='127.0.0.1', monitor=None, owner=None, crashe
**({'gatewayAccess': True} if getattr(self.server, 'remote_transport', False) else {}),
'state': 'configured' if status == AccessStatus.CONFIGURED_LOCAL else
'unavailable' if status == AccessStatus.UNAVAILABLE else 'setup_required'})
elif path == '/api/localization':
if not self.require_session():
return
from openpilot.common.params import Params
from openpilot.starpilot.galaxy.localization import language_snapshot
previous = parse_qs(urlsplit(self.path).query).get('language', [''])[0]
self.json(200, language_snapshot(Params(), previous))
elif path == '/api/galaxy/device-name':
if not self.require_session():
return
@@ -0,0 +1,44 @@
import assert from "node:assert/strict"
import { translateText, localizeDocument } from "../web/js/localization.js"
assert.equal(translateText(" Home\n", { Home: "ホーム" }), " ホーム\n")
assert.equal(translateText("SpeedLimitController", {}), "SpeedLimitController")
assert.equal(translateText("Save", { Save: "$&<text>" }), "$&<text>", "translations remain literal text")
const doc = { documentElement: {} }
class Element {
constructor(tag, attrs = {}, children = []) {
this.nodeType = 1; this.tag = tag; this.attrs = { ...attrs }; this.childNodes = children; this.ownerDocument = doc
for (const child of children) child.parentElement = this
}
matches(selector) {
return selector.split(",").some(value => value.startsWith("[") ?
value === "[translate=no]" ? this.attrs.translate === "no" : Object.hasOwn(this.attrs, value.slice(1, -1)) : this.tag === value)
}
closest(selector) { return this.matches(selector) || this.parentElement?.closest(selector) }
hasAttribute(key) { return Object.hasOwn(this.attrs, key) }
getAttribute(key) { return this.attrs[key] }
setAttribute(key, value) { this.attrs[key] = value }
}
const text = value => ({ nodeType: 3, nodeValue: value })
const label = text("Home"), dynamic = text("Save"), technical = text("Save")
const input = new Element("input", { placeholder: "Search", value: "Home" })
const root = new Element("main", {}, [new Element("button", { title: "Home" }, [label]),
new Element("span", {}, [dynamic]), new Element("code", {}, [technical]), input,
new Element("span", { translate: "no" }, [text("Save")])])
const records = new WeakMap()
localizeDocument(root, { language: "ja", messages: { Home: "ホーム", Save: "保存", Search: "検索" } }, records)
assert.equal(label.nodeValue, "ホーム")
assert.equal(input.attrs.placeholder, "検索")
assert.equal(input.attrs.value, "Home")
assert.equal(technical.nodeValue, "Save")
assert.equal(doc.documentElement.lang, "ja")
dynamic.nodeValue = "Home" // Vue changed the source while another language was active.
localizeDocument(root, { language: "fr", messages: { Home: "Accueil", Save: "Enregistrer", Search: "Rechercher" } }, records)
assert.equal(label.nodeValue, "Accueil")
assert.equal(dynamic.nodeValue, "Accueil")
localizeDocument(root, { language: "en", messages: {} }, records)
assert.equal(label.nodeValue, "Home")
assert.equal(dynamic.nodeValue, "Home")
assert.equal(input.attrs.placeholder, "Search")
assert.equal(root.childNodes[0].attrs.title, "Home")
@@ -0,0 +1,83 @@
from pathlib import Path
import pytest
from openpilot.common.params import Params
from openpilot.starpilot.galaxy.localization import language_snapshot
from openpilot.starpilot.ui.translation_strings import MESSAGES
@pytest.mark.parametrize('code', ['ja', 'ko', 'es', 'fr', 'de', 'vi'])
def test_shared_catalog_and_persistent_language(tmp_path, code):
params = Params(str(tmp_path))
params.put('LanguageSetting', code, block=True)
before = Path(params.get_param_path('LanguageSetting')).read_bytes()
snapshot = language_snapshot(params)
assert snapshot['language'] == code
assert snapshot['messages']['Home'] != 'Home'
assert snapshot['messages']['Language'] != 'Language'
assert language_snapshot(params, code) == {'language': code}
assert Path(params.get_param_path('LanguageSetting')).read_bytes() == before
def test_unknown_language_and_english_fallback(tmp_path):
params = Params(str(tmp_path))
for code in ['en', 'unknown', '../../etc/passwd']:
params.put('LanguageSetting', code, block=True)
assert language_snapshot(params) == {'language': 'en', 'messages': {}}
params.put('LanguageSetting', 'main_ja', block=True)
assert language_snapshot(params)['language'] == 'ja'
def test_shared_messages_survive_standard_catalog_extraction():
from openpilot.selfdrive.ui.translations.potools import extract_strings
from openpilot.common.basedir import BASEDIR
entries = extract_strings(['openpilot/starpilot/ui/translation_strings.py'], BASEDIR)
assert {entry.msgid for entry in entries} == set(MESSAGES)
def test_http_catalog_requires_existing_session(tmp_path, monkeypatch):
import http.client
import json
import threading
from openpilot.starpilot.galaxy.access import GalaxyAccessOwner
from openpilot.starpilot.galaxy.server import make_server
params = Params(str(tmp_path / 'params'))
params.put('LanguageSetting', 'vi', block=True)
monkeypatch.setattr('openpilot.common.params.Params', lambda: params)
access = GalaxyAccessOwner(tmp_path / 'access')
access.configure('localization-test-password', lambda: True)
server = make_server(port=0, owner=access, parked=lambda: True)
worker = threading.Thread(target=server.serve_forever, kwargs={'poll_interval': .01}, daemon=True)
worker.start()
def request(path, cookie=''):
connection = http.client.HTTPConnection('127.0.0.1', server.server_port, timeout=3)
try:
connection.request('GET', path, headers={'Cookie': cookie})
response = connection.getresponse()
return response.status, json.loads(response.read()), response.getheader('Set-Cookie', '').split(';')[0]
finally:
connection.close()
try:
assert request('/api/localization')[0] == 401
status, _, cookie = request('/api/auth/session')
assert status == 200 and cookie
status, result, _ = request('/api/localization', cookie)
assert status == 200 and result['language'] == 'vi' and result['messages']['Home'] == 'Trang chủ'
assert request('/api/localization?language=vi', cookie)[1] == {'language': 'vi'}
finally:
server.shutdown()
worker.join(2)
server.server_close()
@pytest.mark.parametrize('code', ['ja', 'ko', 'es', 'fr', 'de', 'vi'])
def test_shared_messages_have_translations(tmp_path, code):
from openpilot.selfdrive.ui.translations.potools import parse_po
from openpilot.system.ui.lib.multilang import TRANSLATIONS_DIR
_, entries = parse_po(TRANSLATIONS_DIR.joinpath(f'app_{code}.po'))
translations = {entry.msgid: entry.msgstr for entry in entries}
assert all(translations.get(message) for message in MESSAGES)
+3
View File
@@ -1,3 +1,4 @@
import { startLocalization } from "./localization.js"
import { rememberInstallPrompt } from "./install-app.js"
import { toggleHaptic } from "./haptics.js"
import { GxState } from "./state.js"
@@ -157,6 +158,7 @@ createApp({
sessionExpired() { if (initializing) return; auth.expired(); initialize() },
},
mounted() {
this.stopLocalization = startLocalization()
document.documentElement.dataset.theme = state.theme
this.visibility = () => {
if (!document.hidden) deviceRestart.wake()
@@ -177,6 +179,7 @@ createApp({
})
},
beforeUnmount() {
this.stopLocalization?.()
reconnectEnabled = false
clearTimeout(reconnectTimer)
startupGeneration++
@@ -0,0 +1,72 @@
// Translate presentation only: Vue's values, requests and technical identifiers stay in English.
const ATTRIBUTES = ["title", "aria-label", "placeholder", "alt"]
const PROTECTED = "script,style,code,pre,textarea,input,option,[contenteditable],[translate=no]"
export function translateText(source, messages) {
const text = source.trim()
return Object.hasOwn(messages, text) ? source.replace(text, () => messages[text]) : source
}
export function localizeDocument(root, { language, messages }, records = new WeakMap()) {
function translate(node, key, source, write) {
const saved = records.get(node) || {}
const prior = saved[key]
const original = prior && prior.output === source ? prior.source : source
const output = translateText(original, messages)
saved[key] = { source: original, output }
records.set(node, saved)
if (output !== source) write(output)
}
function visit(node) {
if (node.nodeType === 3) {
if (!node.parentElement?.closest(PROTECTED)) translate(node, "text", node.nodeValue, value => { node.nodeValue = value })
return
}
if (node.nodeType !== 1 || node.matches("script,style,code,pre,[translate=no],[contenteditable]")) return
for (const key of ATTRIBUTES) {
if (node.hasAttribute(key)) translate(node, key, node.getAttribute(key), value => node.setAttribute(key, value))
}
if (!node.matches(PROTECTED)) for (const child of node.childNodes) visit(child)
}
visit(root)
root.ownerDocument.documentElement.lang = language
return records
}
export function startLocalization(root = document.body, fetcher = fetch) {
let state = { language: "en", messages: {} }, stopped = false, timer, scheduled = false
const records = new WeakMap()
const dirty = new Set()
const observer = new MutationObserver(mutations => {
for (const mutation of mutations) dirty.add(mutation.target)
if (scheduled) return
scheduled = true
queueMicrotask(() => {
scheduled = false
const changed = [...dirty].filter(node => node.isConnected)
dirty.clear()
if (!stopped) apply(changed)
})
})
function apply(nodes = [root]) {
observer.disconnect()
for (const node of nodes) localizeDocument(node, state, records)
observer.observe(root, { subtree: true, childList: true, characterData: true, attributes: true, attributeFilter: ATTRIBUTES })
}
async function refresh() {
try {
const response = await fetcher(`./api/localization?language=${encodeURIComponent(state.language)}`, { cache: "no-store" })
if (response.ok) {
const next = await response.json()
if (!stopped && typeof next.language === "string" && next.messages && typeof next.messages === "object") {
state = next
apply()
}
}
} catch { /* Keep the last confirmed language during connection loss. */ }
if (!stopped) timer = setTimeout(refresh, 2000)
}
apply()
refresh()
return () => { stopped = true; clearTimeout(timer); observer.disconnect() }
}
+6 -3
View File
@@ -34,12 +34,15 @@ class DriveStatsDashboard:
self._font_semi_bold = fonts.font(FontRole.SEMI_BOLD)
self._font_medium = fonts.font(FontRole.MEDIUM)
def _role(self, font):
return FontRole.BOLD if font is self._font_bold else FontRole.SEMI_BOLD if font is self._font_semi_bold else FontRole.MEDIUM
def _measure(self, font, text, size):
return rl.measure_text_ex(font, text, size * self._fonts.profile.font_scale, 0) # noqa: TID251
measured = self._fonts.measure(text, self._role(font), size)
return rl.Vector2(measured.width, measured.height)
def _draw_text(self, font, text, position, size, spacing, color):
draw = getattr(rl, "_orig_draw_text_ex", rl.draw_text_ex)
draw(font, text, position, size * self._fonts.profile.font_scale, spacing, color)
self._fonts.draw(text, self._role(font), size, position.x, position.y, color, spacing=spacing)
@staticmethod
def _draw_card(rect: rl.Rectangle, accent: rl.Color | None = None) -> None:
+44 -8
View File
@@ -10,6 +10,8 @@ import numpy as np
from PIL import Image
import pyray as rl
from openpilot.system.ui.lib.multilang import TRANSLATIONS_DIR, multilang, tr
class Profile(StrEnum):
LARGE = "large"
@@ -108,6 +110,7 @@ class BitmapFonts:
self.profile = Profile(profile)
self._directory = directory
self._fonts: dict[str, rl.Font] = {}
self._language_fonts: dict[str, rl.Font] = {}
self._measurements: dict[tuple, TextSize] = {}
self._vertical_ink: dict[tuple, tuple[float, float]] = {}
self._horizontal_ink: dict[tuple, tuple[float, float]] = {}
@@ -139,6 +142,33 @@ class BitmapFonts:
role = FontRole.FALLBACK
return self._fonts[font_filename(self.profile, role)]
def _text_font(self, text: str, role: FontRole, fallback: bool = False) -> rl.Font:
if text.isascii() or role == FontRole.BRAND:
return self.font(role, fallback=fallback)
language = multilang.language
fonts = self._language_fonts
if language not in fonts:
filename = {"ja": "NotoSansCJKjp-Regular.otf", "ko": "NotoSansCJKkr-Regular.otf",
"zh-CHS": "NotoSansCJKsc-Regular.otf", "zh-CHT": "NotoSansCJKtc-Regular.otf",
"th": "NotoSansThai-Regular.ttf"}.get(language, "Inter-Regular.ttf")
directory = Path(__file__).parents[2] / "selfdrive/assets/fonts"
chars = set(map(chr, range(32, 127))) | set(text)
chars.update(TRANSLATIONS_DIR.joinpath(f"app_{language}.po").read_text(encoding="utf-8"))
points = sorted(map(ord, chars))
font = rl.load_font_ex(str(directory / filename), 64, rl.ffi.new("int[]", points), len(points))
if font.texture.id in (0, rl.get_font_default().texture.id) or font.glyphCount == 0:
raise RuntimeError(f"Unable to load language font {filename}")
for previous in fonts.values():
rl.unload_font(previous)
fonts.clear()
self._measurements.clear()
self._vertical_ink.clear()
self._horizontal_ink.clear()
fonts[language] = font
rl.gen_texture_mipmaps(font.texture)
rl.set_texture_filter(font.texture, rl.TextureFilter.TEXTURE_FILTER_TRILINEAR)
return fonts[language]
def _optical_style(self, role: FontRole, fallback: bool = False) -> tuple[float, float]:
if fallback:
return 1., 0.
@@ -149,7 +179,8 @@ class BitmapFonts:
return 1., 0.
def measure(self, text: str, role: FontRole, size: float, *, spacing: float = 0, fallback: bool = False) -> TextSize:
font = self.font(role, fallback=fallback)
text = tr(text) if role != FontRole.BRAND else text
font = self._text_font(text, role, fallback)
spacing = round(spacing, 4)
width_scale, weight = self._optical_style(role, fallback)
key = font.texture.id, text, size, spacing, width_scale, weight
@@ -162,9 +193,10 @@ class BitmapFonts:
def vertical_ink(self, text: str, role: FontRole, size: float) -> tuple[float, float]:
"""Visible glyph top/bottom, independent of the font's padded line box."""
text = tr(text) if role != FontRole.BRAND else text
key = (text, role, size)
if key not in self._vertical_ink:
font = self.font(role)
font = self._text_font(text, role)
glyphs = [rl.get_glyph_index(font, ord(char)) for char in text if not char.isspace()]
scale = size * self.profile.font_scale / font.baseSize
top = min((font.glyphs[index].offsetY for index in glyphs), default=0)
@@ -176,14 +208,15 @@ class BitmapFonts:
def horizontal_ink(self, text: str, role: FontRole, size: float) -> tuple[float, float]:
"""Visible glyph left/right from the draw x, without the font's side bearings."""
text = tr(text) if role != FontRole.BRAND else text
key = (text, role, size)
if key not in self._horizontal_ink:
font = self.font(role)
font = self._text_font(text, role)
width_scale, weight = self._optical_style(role)
scale = size * self.profile.font_scale / font.baseSize
left = right = None
x = 0.
columns = self._glyph_columns(role)
columns = self._glyph_columns(role) if text.isascii() or role == FontRole.BRAND else {}
for char in text:
index = rl.get_glyph_index(font, ord(char))
glyph, rec = font.glyphs[index], font.recs[index]
@@ -224,27 +257,30 @@ class BitmapFonts:
def draw(self, text: str, role: FontRole, size: float, x: float, y: float, color: rl.Color = rl.WHITE,
*, spacing: float = 0, fallback: bool = False) -> None:
text = tr(text) if role != FontRole.BRAND else text
font = self._text_font(text, role, fallback)
draw = getattr(rl, "_orig_draw_text_ex", rl.draw_text_ex)
width_scale, weight = self._optical_style(role, fallback)
if width_scale == 1. and weight == 0.:
draw(self.font(role, fallback=fallback), text, rl.Vector2(x, y), size * self.profile.font_scale, spacing, color)
draw(font, text, rl.Vector2(x, y), size * self.profile.font_scale, spacing, color)
return
rl.rl_push_matrix()
try:
rl.rl_translatef(x, y, 0)
rl.rl_scalef(width_scale, 1., 1.)
draw(self.font(role, fallback=fallback), text, rl.Vector2(0, 0), size * self.profile.font_scale, spacing, color)
draw(font, text, rl.Vector2(0, 0), size * self.profile.font_scale, spacing, color)
if weight:
draw(self.font(role, fallback=fallback), text, rl.Vector2(weight / width_scale, 0),
draw(font, text, rl.Vector2(weight / width_scale, 0),
size * self.profile.font_scale, spacing, color)
finally:
rl.rl_pop_matrix()
def close(self) -> None:
if rl.is_window_ready() or self._headless_context:
for font in self._fonts.values():
for font in (*self._fonts.values(), *self._language_fonts.values()):
rl.unload_font(font)
self._fonts.clear()
self._language_fonts.clear()
self._vertical_ink.clear()
self._horizontal_ink.clear()
self._glyph_ink.clear()
@@ -2,6 +2,8 @@
from __future__ import annotations
from openpilot.system.ui.lib.multilang import tr
import math
import random
from functools import lru_cache
@@ -107,6 +109,7 @@ def draw_hud_background(rect: rl.Rectangle, accent: rl.Color, glow: float = 1.0,
def elide_text(fonts, text: str, role: FontRole, size: float, width: float) -> str:
text = tr(text)
if fonts.measure(text, role, size).width <= width:
return text
suffix = "..."
@@ -86,3 +86,55 @@ class TestBitmapFonts(unittest.TestCase):
if __name__ == "__main__":
unittest.main()
class TestLocalizedPresentation(unittest.TestCase):
def test_measure_and_draw_use_the_same_translated_text_and_font(self):
fonts = object.__new__(BitmapFonts)
fonts.profile = Profile.COMPACT
fonts._measurements = {}
font = SimpleNamespace(texture=SimpleNamespace(id=44))
with patch('openpilot.starpilot.ui.presentation.tr', side_effect=lambda text: {'Home': 'ホーム'}.get(text, text)), \
patch.object(fonts, '_text_font', return_value=font) as select, \
patch('openpilot.starpilot.ui.presentation.rl.measure_text_ex', return_value=SimpleNamespace(x=80, y=24)) as measure, \
patch('openpilot.starpilot.ui.presentation.rl._orig_draw_text_ex', create=True) as draw:
assert fonts.measure('Home', FontRole.NORMAL, 20).width == 80
fonts.draw('Home', FontRole.NORMAL, 20, 10, 20)
assert measure.call_args.args[1] == draw.call_args.args[1] == 'ホーム'
assert select.call_args.args[:2] == ('ホーム', FontRole.NORMAL)
fonts.draw('StarPilot', FontRole.BRAND, 20, 10, 20)
assert draw.call_args.args[1] == 'StarPilot'
def test_native_language_font_uses_bundled_noto_and_releases_previous(self):
fonts = object.__new__(BitmapFonts)
old = SimpleNamespace(texture=SimpleNamespace(id=22), glyphCount=1)
new = SimpleNamespace(texture=SimpleNamespace(id=23), glyphCount=100)
fonts._language_fonts = {'vi': old}
fonts._measurements = {}
fonts._vertical_ink = {}
fonts._horizontal_ink = {}
with patch('openpilot.starpilot.ui.presentation.multilang') as language, \
patch('openpilot.starpilot.ui.presentation.rl.load_font_ex', return_value=new) as load, \
patch('openpilot.starpilot.ui.presentation.rl.get_font_default', return_value=SimpleNamespace(texture=SimpleNamespace(id=99))), \
patch('openpilot.starpilot.ui.presentation.rl.unload_font') as unload, \
patch('openpilot.starpilot.ui.presentation.rl.gen_texture_mipmaps'), \
patch('openpilot.starpilot.ui.presentation.rl.set_texture_filter'):
language.language = 'ja'
assert fonts._text_font('ホーム', FontRole.NORMAL) is new
assert load.call_args.args[0].endswith('NotoSansCJKjp-Regular.otf')
unload.assert_called_once_with(old)
assert fonts._language_fonts == {'ja': new}
assert fonts._text_font('保存', FontRole.NORMAL) is new
load.assert_called_once()
def test_home_statistics_use_shared_localized_measurement_and_drawing(self):
from unittest.mock import Mock
from openpilot.starpilot.ui.home_stats import DriveStatsDashboard
fonts = SimpleNamespace(font=Mock(side_effect=[object(), object(), object()]),
measure=Mock(return_value=SimpleNamespace(width=80, height=24)), draw=Mock())
dashboard = DriveStatsDashboard(fonts, None)
measured = dashboard._measure(dashboard._font_bold, 'PERSONAL RECORDS', 20)
assert (measured.x, measured.y) == (80, 24)
dashboard._draw_text(dashboard._font_bold, 'PERSONAL RECORDS', SimpleNamespace(x=10, y=20), 20, 0, 'color')
fonts.measure.assert_called_once_with('PERSONAL RECORDS', FontRole.BOLD, 20)
fonts.draw.assert_called_once_with('PERSONAL RECORDS', FontRole.BOLD, 20, 10, 20, 'color', spacing=0)
@@ -0,0 +1,200 @@
"""Shared display labels drawn by native widgets or received by Galaxy at runtime."""
from openpilot.system.ui.lib.multilang import tr_noop
MESSAGES = (
tr_noop("Home"),
tr_noop("Driving"),
tr_noop("Controls"),
tr_noop("Toggles"),
tr_noop("Localization"),
tr_noop("Language"),
tr_noop("Use Kilometers (km/h)"),
tr_noop("Right-Hand Drive"),
tr_noop("Device display language. Untranslated text uses English. Park before changing language."),
tr_noop("Language, units and steering-wheel side for every vehicle."),
tr_noop("On"),
tr_noop("Off"),
tr_noop("Auto"),
tr_noop("Stock"),
tr_noop("Custom"),
tr_noop("Unavailable"),
tr_noop("Available"),
tr_noop("Invalid saved choice"),
tr_noop("Invalid saved value"),
tr_noop("Saved choice cannot be read"),
tr_noop("Save"),
tr_noop("Saved"),
tr_noop("Saving"),
tr_noop("Save changes"),
tr_noop("Could not save"),
tr_noop("Discard changes"),
tr_noop("Unsaved changes"),
tr_noop("Cancel"),
tr_noop("Close"),
tr_noop("Back"),
tr_noop("Next"),
tr_noop("Previous"),
tr_noop("Continue"),
tr_noop("Confirm"),
tr_noop("Apply"),
tr_noop("Reset"),
tr_noop("Reset to defaults"),
tr_noop("Restore"),
tr_noop("Default"),
tr_noop("Delete"),
tr_noop("Remove"),
tr_noop("Add"),
tr_noop("Edit"),
tr_noop("Search"),
tr_noop("Refresh"),
tr_noop("Retry"),
tr_noop("Loading"),
tr_noop("Loading…"),
tr_noop("Opening page…"),
tr_noop("This page could not open."),
tr_noop("Reload page"),
tr_noop("Refresh Galaxy"),
tr_noop("Connected"),
tr_noop("Disconnected"),
tr_noop("Connecting"),
tr_noop("Connect"),
tr_noop("Disconnect"),
tr_noop("Forget"),
tr_noop("Pair"),
tr_noop("Pairing"),
tr_noop("Sign in"),
tr_noop("Sign out"),
tr_noop("Password"),
tr_noop("Device"),
tr_noop("Network"),
tr_noop("Software"),
tr_noop("System"),
tr_noop("Settings"),
tr_noop("Developer"),
tr_noop("Appearance"),
tr_noop("Display"),
tr_noop("Custom Display Settings"),
tr_noop("Sounds & Alerts"),
tr_noop("Sounds"),
tr_noop("Alerts"),
tr_noop("Driving Controls"),
tr_noop("Vehicle Settings"),
tr_noop("Vehicle"),
tr_noop("Wheel Controls"),
tr_noop("Driving Model"),
tr_noop("Models"),
tr_noop("Model Laboratory"),
tr_noop("Maps"),
tr_noop("Navigation"),
tr_noop("Favorites"),
tr_noop("History"),
tr_noop("Drive History"),
tr_noop("Recent drives"),
tr_noop("Last drive"),
tr_noop("Your driving"),
tr_noop("This week"),
tr_noop("Personal records"),
tr_noop("Vitals"),
tr_noop("Storage"),
tr_noop("Tools"),
tr_noop("Logs"),
tr_noop("Recordings"),
tr_noop("Replay"),
tr_noop("Cameras"),
tr_noop("Camera"),
tr_noop("Bluetooth"),
tr_noop("Offline maps"),
tr_noop("Download"),
tr_noop("Downloaded"),
tr_noop("Installed"),
tr_noop("Install"),
tr_noop("Update"),
tr_noop("Updates"),
tr_noop("Check for updates"),
tr_noop("Reboot"),
tr_noop("Power Off"),
tr_noop("Parked Power"),
tr_noop("Force Drive State"),
tr_noop("Onroad"),
tr_noop("Offroad"),
tr_noop("Always On Lateral"),
tr_noop("Long Planner"),
tr_noop("Conditional Driving Modes"),
tr_noop("Curve Speed Controller"),
tr_noop("Speed Limit Controller"),
tr_noop("Lane Centering"),
tr_noop("Lane Change"),
tr_noop("Lane Change Settings"),
tr_noop("Following distance"),
tr_noop("Following time"),
tr_noop("Traffic Mode"),
tr_noop("Standard"),
tr_noop("Aggressive"),
tr_noop("Relaxed"),
tr_noop("Chill"),
tr_noop("Experimental"),
tr_noop("Personality"),
tr_noop("Personalities"),
tr_noop("Saved settings"),
tr_noop("Backup"),
tr_noop("Backups"),
tr_noop("Export"),
tr_noop("Import"),
tr_noop("Play"),
tr_noop("Pause"),
tr_noop("Stop"),
tr_noop("Start"),
tr_noop("Front"),
tr_noop("Rear"),
tr_noop("Left"),
tr_noop("Right"),
tr_noop("Small"),
tr_noop("Big"),
tr_noop("None"),
tr_noop("Enabled"),
tr_noop("Disabled"),
tr_noop("Not reported"),
tr_noop("Not detected"),
tr_noop("Unknown"),
tr_noop("Error"),
tr_noop("Warning"),
tr_noop("Accept"),
tr_noop("Reject"),
tr_noop("Not now"),
tr_noop("Done"),
tr_noop("Details"),
tr_noop("View"),
tr_noop("More"),
tr_noop("No drives"),
tr_noop("History unavailable"),
tr_noop("Loading history"),
tr_noop("Date unavailable"),
tr_noop("No results"),
tr_noop("Search settings"),
tr_noop("Take control"),
tr_noop("TAKE CONTROL IMMEDIATELY"),
tr_noop("LEAD"),
tr_noop("CURVE"),
tr_noop("STOP LIGHT"),
tr_noop("SPEED"),
tr_noop("OFF"),
tr_noop("PREVIOUS"),
tr_noop("RESET"),
tr_noop("CONNECT"),
tr_noop("PAIR"),
tr_noop("VEHICLE"),
tr_noop("PERSONAL RECORDS"),
tr_noop("REPLAY"),
tr_noop("DOWNLOAD"),
tr_noop("PAUSE"),
tr_noop("STOP"),
tr_noop("BIG"),
tr_noop("UNKNOWN"),
tr_noop("DETAILS"),
tr_noop("VIEW"),
tr_noop("ALL TIME"),
tr_noop("PAST WEEK"),
tr_noop("DISTANCE THIS WEEK"),
)
+1
View File
@@ -847,6 +847,7 @@ class GuiApplication:
rl._orig_draw_text_ex = rl.draw_text_ex
def _draw_text_ex_scaled(font, text, position, font_size, spacing, tint):
text = multilang.tr(text)
font = font_fallback(font)
return rl._orig_draw_text_ex(font, text, position, font_size * FONT_SCALE, spacing, tint)
+2
View File
@@ -1,5 +1,6 @@
import pyray as rl
from openpilot.system.ui.lib.application import FONT_SCALE, font_fallback
from openpilot.system.ui.lib.multilang import tr
from openpilot.system.ui.lib.lru_cache import LRUCache
_CACHE_MAXSIZE = 1024
@@ -8,6 +9,7 @@ _cache: LRUCache[int, rl.Vector2] = LRUCache(_CACHE_MAXSIZE)
def measure_text_cached(font: rl.Font, text: str, font_size: int, spacing: float = 0) -> rl.Vector2:
"""Caches text measurements to avoid redundant calculations."""
text = tr(text)
font = font_fallback(font)
spacing = round(spacing, 4)
key = hash((font.texture.id, text, font_size, spacing))