UI: Internationalization support (#21212)

* rough multiple language demo

* more wrappings

* stash

* add some bad translations

* updates

* map from french to spanish still has same problem of needing to call setText on everything

* add files

* restart UI

* use return code

* relative path

* more translations

* don't loop restart

* Toggle and prime translations

* try on device

* try QComboBox with readable style

* stash

* not yet scrollable

* stash

* dynamic translations (doesn't work for dynamic widget strings yet)

* clean up multiple option selector

* store languages in json

* try transparent

* Try transparent popup

* see how this looks

* tweaks

* clean up

* update names

* Add Chinese (Simplified) translations

* Do missing French translations

* unit tests caught that :)

* fix test

* fix other test (on PC)

* add entries to dialog to test

* add cancel button, clean up a bit

* just chinese

* some clean up

* use quotes

* clean up

* Just quit, set timeout to 0

* half a second

* use exitcode

* don't print if it's expected

* this comment is outdated

* update translations

* Update translations

* re-order input classes

* Update line numbers

* use enabled property for button style

* Get rid of ListWidget

* Update line numbers

* Log failed to load language

* Log failed to load language

* Move to utils and fix english logging

extra line

* Update translations

* spacing

* looks a bit better

* try this instead of exitcode

fixes

fix

* only one function

* comment

* Update line numbers

* fixup some japanese translations

* clean up multi option dialog

* Update line numbers
old-commit-hash: 949de4d2b6
This commit is contained in:
Shane Smiskol 2022-07-08 20:25:54 -07:00 committed by GitHub
parent c9dc7a9458
commit 23de7b166e
19 changed files with 410 additions and 259 deletions

View File

@ -129,6 +129,7 @@ std::unordered_map<std::string, uint32_t> keys = {
{"IsUpdateAvailable", CLEAR_ON_MANAGER_START},
{"JoystickDebugMode", CLEAR_ON_MANAGER_START | CLEAR_ON_IGNITION_OFF},
{"LaikadEphemeris", PERSISTENT | DONT_LOG},
{"LanguageSetting", PERSISTENT},
{"LastAthenaPingTime", CLEAR_ON_MANAGER_START},
{"LastGPSPosition", PERSISTENT},
{"LastManagerExitReason", CLEAR_ON_MANAGER_START},

View File

@ -1,12 +1,9 @@
#include "common/watchdog.h"
#include "common/timing.h"
#include "common/util.h"
const std::string watchdog_fn_prefix = "/dev/shm/wd_"; // + <pid>
bool watchdog_kick() {
bool watchdog_kick(uint64_t ts) {
static std::string fn = watchdog_fn_prefix + std::to_string(getpid());
uint64_t ts = nanos_since_boot();
return util::write_file(fn.c_str(), &ts, sizeof(ts), O_WRONLY | O_CREAT) > 0;
}

View File

@ -1,3 +1,5 @@
#pragma once
bool watchdog_kick();
#include <cstdint>
bool watchdog_kick(uint64_t ts);

View File

@ -1,6 +1,7 @@
#include <sys/resource.h>
#include <QApplication>
#include <QTranslator>
#include "system/hardware/hw.h"
#include "selfdrive/ui/qt/qt_window.h"
@ -13,7 +14,15 @@ int main(int argc, char *argv[]) {
qInstallMessageHandler(swagLogMessageHandler);
initApp(argc, argv);
QTranslator translator;
QString translation_file = QString::fromStdString(Params().get("LanguageSetting"));
if (!translator.load(translation_file, "translations") && translation_file.length()) {
qCritical() << "Failed to load translation file:" << translation_file;
}
QApplication a(argc, argv);
a.installTranslator(&translator);
MainWindow w;
setMainWindow(&w);
a.installEventFilter(&w);

View File

@ -13,6 +13,7 @@
#endif
#include "common/params.h"
#include "common/watchdog.h"
#include "common/util.h"
#include "system/hardware/hw.h"
#include "selfdrive/ui/qt/widgets/controls.h"
@ -133,6 +134,19 @@ DevicePanel::DevicePanel(SettingsWindow *parent) : ListWidget(parent) {
addItem(regulatoryBtn);
}
auto translateBtn = new ButtonControl(tr("Change Language"), tr("CHANGE"), "");
connect(translateBtn, &ButtonControl::clicked, [=]() {
QMap<QString, QString> langs = getSupportedLanguages();
QString selection = MultiOptionDialog::getSelection(tr("Select a language"), langs.keys(), this);
if (!selection.isEmpty()) {
// put language setting, exit Qt UI, and trigger fast restart
Params().put("LanguageSetting", langs[selection].toStdString());
qApp->exit(18);
watchdog_kick(0);
}
});
addItem(translateBtn);
QObject::connect(uiState(), &UIState::offroadTransition, [=](bool offroad) {
for (auto btn : findChildren<ButtonControl *>()) {
btn->setEnabled(offroad);

View File

@ -1,6 +1,9 @@
#include "selfdrive/ui/qt/util.h"
#include <QApplication>
#include <QFile>
#include <QJsonDocument>
#include <QJsonObject>
#include <QLayoutItem>
#include <QStyleOption>
#include <QPainterPath>
@ -36,6 +39,19 @@ std::optional<QString> getDongleId() {
}
}
QMap<QString, QString> getSupportedLanguages() {
QFile f("translations/languages.json");
f.open(QIODevice::ReadOnly | QIODevice::Text);
QString val = f.readAll();
QJsonObject obj = QJsonDocument::fromJson(val.toUtf8()).object();
QMap<QString, QString> map;
for (auto key : obj.keys()) {
map[key] = obj[key].toString();
}
return map;
}
void configFont(QPainter &p, const QString &family, int size, const QString &style) {
QFont f(family);
f.setPixelSize(size);

View File

@ -14,6 +14,7 @@ QString getBrand();
QString getBrandVersion();
QString getUserAgent();
std::optional<QString> getDongleId();
QMap<QString, QString> getSupportedLanguages();
void configFont(QPainter &p, const QString &family, int size, const QString &style);
void clearLayout(QLayout* layout);
void setQtSurfaceFormat();

View File

@ -1,6 +1,7 @@
#include "selfdrive/ui/qt/widgets/input.h"
#include <QPushButton>
#include <QButtonGroup>
#include "system/hardware/hw.h"
#include "selfdrive/ui/qt/util.h"
@ -257,3 +258,88 @@ bool RichTextDialog::alert(const QString &prompt_text, QWidget *parent) {
auto d = RichTextDialog(prompt_text, tr("Ok"), parent);
return d.exec();
}
// MultiOptionDialog
MultiOptionDialog::MultiOptionDialog(const QString &prompt_text, QStringList l, QWidget *parent) : QDialogBase(parent) {
QFrame *container = new QFrame(this);
container->setStyleSheet(R"(
QFrame { background-color: #1B1B1B; }
#confirm_btn[enabled="false"] { background-color: #2B2B2B; }
#confirm_btn:enabled { background-color: #465BEA; }
#confirm_btn:enabled:pressed { background-color: #3049F4; }
)");
QVBoxLayout *main_layout = new QVBoxLayout(container);
main_layout->setContentsMargins(55, 50, 55, 50);
QLabel *title = new QLabel(prompt_text, this);
title->setStyleSheet("font-size: 70px; font-weight: 500;");
main_layout->addWidget(title, 0, Qt::AlignLeft | Qt::AlignTop);
main_layout->addSpacing(25);
QWidget *listWidget = new QWidget(this);
QVBoxLayout *listLayout = new QVBoxLayout(listWidget);
listLayout->setSpacing(20);
listWidget->setStyleSheet(R"(
QPushButton {
height: 135;
padding: 0px 50px;
text-align: left;
font-size: 55px;
font-weight: 300;
border-radius: 10px;
background-color: #4F4F4F;
}
QPushButton:checked { background-color: #465BEA; }
)");
QButtonGroup *group = new QButtonGroup(listWidget);
group->setExclusive(true);
QPushButton *confirm_btn = new QPushButton(tr("Select"));
confirm_btn->setObjectName("confirm_btn");
confirm_btn->setEnabled(false);
for (QString &s : l) {
QPushButton *selectionLabel = new QPushButton(s);
selectionLabel->setCheckable(true);
QObject::connect(selectionLabel, &QPushButton::toggled, [=](bool checked) {
if (checked) selection = s;
confirm_btn->setEnabled(true);
});
group->addButton(selectionLabel);
listLayout->addWidget(selectionLabel);
}
ScrollView *scroll_view = new ScrollView(listWidget, this);
scroll_view->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
main_layout->addWidget(scroll_view);
main_layout->addStretch(1);
main_layout->addSpacing(35);
// cancel + confirm buttons
QHBoxLayout *blayout = new QHBoxLayout;
main_layout->addLayout(blayout);
blayout->setSpacing(50);
QPushButton *cancel_btn = new QPushButton(tr("Cancel"));
QObject::connect(cancel_btn, &QPushButton::clicked, this, &ConfirmationDialog::reject);
QObject::connect(confirm_btn, &QPushButton::clicked, this, &ConfirmationDialog::accept);
blayout->addWidget(cancel_btn);
blayout->addWidget(confirm_btn);
QVBoxLayout *outer_layout = new QVBoxLayout(this);
outer_layout->setContentsMargins(50, 50, 50, 50);
outer_layout->addWidget(container);
}
QString MultiOptionDialog::getSelection(const QString &prompt_text, const QStringList l, QWidget *parent) {
MultiOptionDialog d = MultiOptionDialog(prompt_text, l, parent);
if (d.exec()) {
return d.selection;
}
return "";
}

View File

@ -68,3 +68,12 @@ public:
explicit RichTextDialog(const QString &prompt_text, const QString &btn_text, QWidget* parent);
static bool alert(const QString &prompt_text, QWidget *parent);
};
class MultiOptionDialog : public QDialogBase {
Q_OBJECT
public:
explicit MultiOptionDialog(const QString &prompt_text, const QStringList l, QWidget *parent);
static QString getSelection(const QString &prompt_text, const QStringList l, QWidget *parent);
QString selection;
};

View File

@ -41,6 +41,7 @@ void checkWidgetTrWrap(MainWindow &w) {
// Tests all strings in the UI are wrapped with tr()
TEST_CASE("UI: test all strings wrapped") {
Params().remove("LanguageSetting");
Params().remove("HardwareSerial");
Params().remove("DongleId");
qputenv("TICI", "1");

View File

@ -528,12 +528,12 @@ location set</source>
<message>
<location filename="../qt/widgets/prime.cc" line="123"/>
<source> SUBSCRIBED</source>
<translation> </translation>
<translation> </translation>
</message>
<message>
<location filename="../qt/widgets/prime.cc" line="129"/>
<source>comma prime</source>
<translation></translation>
<translation>comma prime</translation>
</message>
<message>
<location filename="../qt/widgets/prime.cc" line="135"/>
@ -543,7 +543,7 @@ location set</source>
<message>
<location filename="../qt/widgets/prime.cc" line="148"/>
<source>COMMA POINTS</source>
<translation></translation>
<translation>COMMA POINTS</translation>
</message>
</context>
<context>

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:17e593ed333ec26105a924caa274616318933560dbf30c40ec8e734b4ecf2e6c
size 19159
oid sha256:194b46eb36b6b4c98d9d0a6db7bf926099dbb8d72dcb1d50566c4b26cf540c8d
size 19449

View File

@ -76,13 +76,13 @@
<context>
<name>ConfirmationDialog</name>
<message>
<location filename="../qt/widgets/input.cc" line="220"/>
<location filename="../qt/widgets/input.cc" line="225"/>
<location filename="../qt/widgets/input.cc" line="221"/>
<location filename="../qt/widgets/input.cc" line="226"/>
<source>Ok</source>
<translation></translation>
</message>
<message>
<location filename="../qt/widgets/input.cc" line="225"/>
<location filename="../qt/widgets/input.cc" line="226"/>
<source>Cancel</source>
<translation></translation>
</message>
@ -108,149 +108,152 @@
<context>
<name>DevicePanel</name>
<message>
<location filename="../qt/offroad/settings.cc" line="98"/>
<location filename="../qt/offroad/settings.cc" line="99"/>
<source>Dongle ID</source>
<translation>Dongle ID</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="98"/>
<location filename="../qt/offroad/settings.cc" line="99"/>
<source>N/A</source>
<translation>N/A</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="99"/>
<location filename="../qt/offroad/settings.cc" line="100"/>
<source>Serial</source>
<translation>Serial</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="103"/>
<location filename="../qt/offroad/settings.cc" line="104"/>
<source>Driver Camera</source>
<translation> </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="103"/>
<location filename="../qt/offroad/settings.cc" line="104"/>
<source>PREVIEW</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="104"/>
<location filename="../qt/offroad/settings.cc" line="105"/>
<source>Preview the driver facing camera to help optimize device mounting position for best driver monitoring experience. (vehicle must be off)</source>
<translation> . ( )</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="108"/>
<location filename="../qt/offroad/settings.cc" line="109"/>
<source>Reset Calibration</source>
<translation> </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="108"/>
<location filename="../qt/offroad/settings.cc" line="109"/>
<source>RESET</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="111"/>
<location filename="../qt/offroad/settings.cc" line="112"/>
<source>Are you sure you want to reset calibration?</source>
<translation> </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="118"/>
<location filename="../qt/offroad/settings.cc" line="119"/>
<source>Review Training Guide</source>
<translation> </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="118"/>
<location filename="../qt/offroad/settings.cc" line="119"/>
<source>REVIEW</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="118"/>
<location filename="../qt/offroad/settings.cc" line="119"/>
<source>Review the rules, features, and limitations of openpilot</source>
<translation>openpilot의 , , </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="120"/>
<location filename="../qt/offroad/settings.cc" line="121"/>
<source>Are you sure you want to review the training guide?</source>
<translation> </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="128"/>
<location filename="../qt/offroad/settings.cc" line="129"/>
<source>Regulatory</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="128"/>
<location filename="../qt/offroad/settings.cc" line="129"/>
<source>VIEW</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="137"/>
<source>Change Language</source>
<translation type="vanished"></translation>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="137"/>
<source>CHANGE</source>
<translation type="vanished"></translation>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="140"/>
<source>Select a language</source>
<translation type="vanished"></translation>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="146"/>
<location filename="../qt/offroad/settings.cc" line="160"/>
<source>Reboot</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="151"/>
<location filename="../qt/offroad/settings.cc" line="165"/>
<source>Power Off</source>
<translation> </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="171"/>
<location filename="../qt/offroad/settings.cc" line="185"/>
<source>openpilot requires the device to be mounted within 4° left or right and within 5° up or 8° down. openpilot is continuously calibrating, resetting is rarely required.</source>
<translation>openpilot은 4° , 5° 8° . openpilot은 .</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="182"/>
<location filename="../qt/offroad/settings.cc" line="196"/>
<source> Your device is pointed %1° %2 and %3° %4.</source>
<translation> %1° %2 %3° %4 .</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="183"/>
<location filename="../qt/offroad/settings.cc" line="197"/>
<source>down</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="183"/>
<location filename="../qt/offroad/settings.cc" line="197"/>
<source>up</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="184"/>
<location filename="../qt/offroad/settings.cc" line="198"/>
<source>left</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="184"/>
<location filename="../qt/offroad/settings.cc" line="198"/>
<source>right</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="195"/>
<location filename="../qt/offroad/settings.cc" line="209"/>
<source>Are you sure you want to reboot?</source>
<translation> </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="202"/>
<location filename="../qt/offroad/settings.cc" line="216"/>
<source>Disengage to Reboot</source>
<translation> </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="208"/>
<location filename="../qt/offroad/settings.cc" line="222"/>
<source>Are you sure you want to power off?</source>
<translation> </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="215"/>
<location filename="../qt/offroad/settings.cc" line="229"/>
<source>Disengage to Power Off</source>
<translation> </translation>
</message>
@ -299,17 +302,17 @@
<context>
<name>InputDialog</name>
<message>
<location filename="../qt/widgets/input.cc" line="70"/>
<location filename="../qt/widgets/input.cc" line="71"/>
<source>Cancel</source>
<translation></translation>
</message>
<message>
<location filename="../qt/widgets/input.cc" line="167"/>
<location filename="../qt/widgets/input.cc" line="168"/>
<source>Need at least </source>
<translation> </translation>
</message>
<message>
<location filename="../qt/widgets/input.cc" line="167"/>
<location filename="../qt/widgets/input.cc" line="168"/>
<source> characters!</source>
<translation> </translation>
</message>
@ -389,12 +392,14 @@ location set</source>
<context>
<name>MultiOptionDialog</name>
<message>
<location filename="../qt/widgets/input.cc" line="300"/>
<source>Select</source>
<translation type="vanished"></translation>
<translation></translation>
</message>
<message>
<location filename="../qt/widgets/input.cc" line="328"/>
<source>Cancel</source>
<translation type="vanished"></translation>
<translation></translation>
</message>
</context>
<context>
@ -564,27 +569,27 @@ location set</source>
<translation></translation>
</message>
<message>
<location filename="../qt/util.cc" line="18"/>
<location filename="../qt/util.cc" line="21"/>
<source>dashcam</source>
<translation>dashcam</translation>
</message>
<message>
<location filename="../qt/util.cc" line="18"/>
<location filename="../qt/util.cc" line="21"/>
<source>openpilot</source>
<translation>openpilot</translation>
</message>
<message>
<location filename="../qt/util.cc" line="66"/>
<location filename="../qt/util.cc" line="82"/>
<source>%1 minute%2 ago</source>
<translation>%1 %2 </translation>
</message>
<message>
<location filename="../qt/util.cc" line="69"/>
<location filename="../qt/util.cc" line="85"/>
<source>%1 hour%2 ago</source>
<translation>%1 %2 </translation>
</message>
<message>
<location filename="../qt/util.cc" line="72"/>
<location filename="../qt/util.cc" line="88"/>
<source>%1 day%2 ago</source>
<translation>%1 %2 </translation>
</message>
@ -640,7 +645,7 @@ location set</source>
<context>
<name>RichTextDialog</name>
<message>
<location filename="../qt/widgets/input.cc" line="257"/>
<location filename="../qt/widgets/input.cc" line="258"/>
<source>Ok</source>
<translation></translation>
</message>
@ -648,33 +653,33 @@ location set</source>
<context>
<name>SettingsWindow</name>
<message>
<location filename="../qt/offroad/settings.cc" line="300"/>
<location filename="../qt/offroad/settings.cc" line="314"/>
<source>×</source>
<translation>×</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="326"/>
<location filename="../qt/offroad/settings.cc" line="340"/>
<source>Device</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="327"/>
<location filename="../qt/offroad/settings.cc" line="366"/>
<location filename="../qt/offroad/settings.cc" line="341"/>
<location filename="../qt/offroad/settings.cc" line="380"/>
<source>Network</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="328"/>
<location filename="../qt/offroad/settings.cc" line="342"/>
<source>Toggles</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="329"/>
<location filename="../qt/offroad/settings.cc" line="343"/>
<source>Software</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="334"/>
<location filename="../qt/offroad/settings.cc" line="348"/>
<source>Navigation</source>
<translation></translation>
</message>
@ -913,68 +918,68 @@ location set</source>
<context>
<name>SoftwarePanel</name>
<message>
<location filename="../qt/offroad/settings.cc" line="220"/>
<location filename="../qt/offroad/settings.cc" line="234"/>
<source>Git Branch</source>
<translation>Git </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="221"/>
<location filename="../qt/offroad/settings.cc" line="235"/>
<source>Git Commit</source>
<translation>Git </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="222"/>
<location filename="../qt/offroad/settings.cc" line="236"/>
<source>OS Version</source>
<translation>OS </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="223"/>
<location filename="../qt/offroad/settings.cc" line="237"/>
<source>Version</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="224"/>
<location filename="../qt/offroad/settings.cc" line="238"/>
<source>Last Update Check</source>
<translation> </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="224"/>
<location filename="../qt/offroad/settings.cc" line="238"/>
<source>The last time openpilot successfully checked for an update. The updater only runs while the car is off.</source>
<translation> openpilot에서 . .</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="225"/>
<location filename="../qt/offroad/settings.cc" line="239"/>
<source>Check for Update</source>
<translation> </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="230"/>
<location filename="../qt/offroad/settings.cc" line="244"/>
<source>CHECKING</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="237"/>
<location filename="../qt/offroad/settings.cc" line="251"/>
<source>Uninstall </source>
<translation> </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="237"/>
<location filename="../qt/offroad/settings.cc" line="251"/>
<source>UNINSTALL</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="239"/>
<location filename="../qt/offroad/settings.cc" line="253"/>
<source>Are you sure you want to uninstall?</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="253"/>
<location filename="../qt/offroad/settings.cc" line="267"/>
<source>failed to fetch update</source>
<translation> </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="254"/>
<location filename="../qt/offroad/settings.cc" line="275"/>
<location filename="../qt/offroad/settings.cc" line="268"/>
<location filename="../qt/offroad/settings.cc" line="289"/>
<source>CHECK</source>
<translation></translation>
</message>
@ -1062,82 +1067,82 @@ location set</source>
<context>
<name>TogglesPanel</name>
<message>
<location filename="../qt/offroad/settings.cc" line="32"/>
<location filename="../qt/offroad/settings.cc" line="33"/>
<source>Enable openpilot</source>
<translation>openpilot </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="33"/>
<location filename="../qt/offroad/settings.cc" line="34"/>
<source>Use the openpilot system for adaptive cruise control and lane keep driver assistance. Your attention is required at all times to use this feature. Changing this setting takes effect when the car is powered off.</source>
<translation> openpilot . . .</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="38"/>
<location filename="../qt/offroad/settings.cc" line="39"/>
<source>Enable Lane Departure Warnings</source>
<translation> </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="39"/>
<location filename="../qt/offroad/settings.cc" line="40"/>
<source>Receive alerts to steer back into the lane when your vehicle drifts over a detected lane line without a turn signal activated while driving over 31 mph (50 km/h).</source>
<translation> 50km/h(31mph) .</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="44"/>
<location filename="../qt/offroad/settings.cc" line="45"/>
<source>Enable Right-Hand Drive</source>
<translation> </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="45"/>
<location filename="../qt/offroad/settings.cc" line="46"/>
<source>Allow openpilot to obey left-hand traffic conventions and perform driver monitoring on right driver seat.</source>
<translation>openpilot이 .</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="50"/>
<location filename="../qt/offroad/settings.cc" line="51"/>
<source>Use Metric System</source>
<translation> </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="51"/>
<location filename="../qt/offroad/settings.cc" line="52"/>
<source>Display speed in km/h instead of mph.</source>
<translation>mph가 km/h로 .</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="56"/>
<location filename="../qt/offroad/settings.cc" line="57"/>
<source>Record and Upload Driver Camera</source>
<translation> </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="57"/>
<location filename="../qt/offroad/settings.cc" line="58"/>
<source>Upload data from the driver facing camera and help improve the driver monitoring algorithm.</source>
<translation> .</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="62"/>
<location filename="../qt/offroad/settings.cc" line="63"/>
<source>Disengage On Accelerator Pedal</source>
<translation> </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="63"/>
<location filename="../qt/offroad/settings.cc" line="64"/>
<source>When enabled, pressing the accelerator pedal will disengage openpilot.</source>
<translation> openpilot이 .</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="69"/>
<location filename="../qt/offroad/settings.cc" line="70"/>
<source>Show ETA in 24h format</source>
<translation>24 ETA </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="70"/>
<location filename="../qt/offroad/settings.cc" line="71"/>
<source>Use 24h format instead of am/pm</source>
<translation>/ 24 </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="82"/>
<location filename="../qt/offroad/settings.cc" line="83"/>
<source>openpilot Longitudinal Control</source>
<translation>openpilot Longitudinal Control</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="83"/>
<location filename="../qt/offroad/settings.cc" line="84"/>
<source>openpilot will disable the car&apos;s radar and will take over control of gas and brakes. Warning: this disables AEB!</source>
<translation>openpilot은 &apos; . 경고: AEB를 !</translation>
</message>

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:df73115bb4badb41c4b5e4ec40701df8e09f6efd4f7028fc940f0eb07a00e20c
size 17629
oid sha256:ef08cf58d66497a054c8bf978aebeffa3bb74772b80cfa07cfcbc49e2b111e17
size 17919

View File

@ -76,13 +76,13 @@
<context>
<name>ConfirmationDialog</name>
<message>
<location filename="../qt/widgets/input.cc" line="220"/>
<location filename="../qt/widgets/input.cc" line="225"/>
<location filename="../qt/widgets/input.cc" line="221"/>
<location filename="../qt/widgets/input.cc" line="226"/>
<source>Ok</source>
<translation></translation>
</message>
<message>
<location filename="../qt/widgets/input.cc" line="225"/>
<location filename="../qt/widgets/input.cc" line="226"/>
<source>Cancel</source>
<translation></translation>
</message>
@ -108,149 +108,152 @@
<context>
<name>DevicePanel</name>
<message>
<location filename="../qt/offroad/settings.cc" line="98"/>
<location filename="../qt/offroad/settings.cc" line="99"/>
<source>Dongle ID</source>
<translation> ID</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="98"/>
<location filename="../qt/offroad/settings.cc" line="99"/>
<source>N/A</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="99"/>
<location filename="../qt/offroad/settings.cc" line="100"/>
<source>Serial</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="103"/>
<location filename="../qt/offroad/settings.cc" line="104"/>
<source>Driver Camera</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="103"/>
<location filename="../qt/offroad/settings.cc" line="104"/>
<source>PREVIEW</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="104"/>
<location filename="../qt/offroad/settings.cc" line="105"/>
<source>Preview the driver facing camera to help optimize device mounting position for best driver monitoring experience. (vehicle must be off)</source>
<translation> </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="108"/>
<location filename="../qt/offroad/settings.cc" line="109"/>
<source>Reset Calibration</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="108"/>
<location filename="../qt/offroad/settings.cc" line="109"/>
<source>RESET</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="111"/>
<location filename="../qt/offroad/settings.cc" line="112"/>
<source>Are you sure you want to reset calibration?</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="118"/>
<location filename="../qt/offroad/settings.cc" line="119"/>
<source>Review Training Guide</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="118"/>
<location filename="../qt/offroad/settings.cc" line="119"/>
<source>REVIEW</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="118"/>
<location filename="../qt/offroad/settings.cc" line="119"/>
<source>Review the rules, features, and limitations of openpilot</source>
<translation> openpilot </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="120"/>
<location filename="../qt/offroad/settings.cc" line="121"/>
<source>Are you sure you want to review the training guide?</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="128"/>
<location filename="../qt/offroad/settings.cc" line="129"/>
<source>Regulatory</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="128"/>
<location filename="../qt/offroad/settings.cc" line="129"/>
<source>VIEW</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="137"/>
<source>Change Language</source>
<translation type="vanished"></translation>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="137"/>
<source>CHANGE</source>
<translation type="vanished"></translation>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="140"/>
<source>Select a language</source>
<translation type="vanished"></translation>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="146"/>
<location filename="../qt/offroad/settings.cc" line="160"/>
<source>Reboot</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="151"/>
<location filename="../qt/offroad/settings.cc" line="165"/>
<source>Power Off</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="171"/>
<location filename="../qt/offroad/settings.cc" line="185"/>
<source>openpilot requires the device to be mounted within 4° left or right and within 5° up or 8° down. openpilot is continuously calibrating, resetting is rarely required.</source>
<translation>openpilot 4° 5° 8° openpilot </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="182"/>
<location filename="../qt/offroad/settings.cc" line="196"/>
<source> Your device is pointed %1° %2 and %3° %4.</source>
<translation> %1° %2 %3° %4</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="183"/>
<location filename="../qt/offroad/settings.cc" line="197"/>
<source>down</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="183"/>
<location filename="../qt/offroad/settings.cc" line="197"/>
<source>up</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="184"/>
<location filename="../qt/offroad/settings.cc" line="198"/>
<source>left</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="184"/>
<location filename="../qt/offroad/settings.cc" line="198"/>
<source>right</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="195"/>
<location filename="../qt/offroad/settings.cc" line="209"/>
<source>Are you sure you want to reboot?</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="202"/>
<location filename="../qt/offroad/settings.cc" line="216"/>
<source>Disengage to Reboot</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="208"/>
<location filename="../qt/offroad/settings.cc" line="222"/>
<source>Are you sure you want to power off?</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="215"/>
<location filename="../qt/offroad/settings.cc" line="229"/>
<source>Disengage to Power Off</source>
<translation></translation>
</message>
@ -299,17 +302,17 @@
<context>
<name>InputDialog</name>
<message>
<location filename="../qt/widgets/input.cc" line="70"/>
<location filename="../qt/widgets/input.cc" line="71"/>
<source>Cancel</source>
<translation></translation>
</message>
<message>
<location filename="../qt/widgets/input.cc" line="167"/>
<location filename="../qt/widgets/input.cc" line="168"/>
<source>Need at least </source>
<translation> </translation>
</message>
<message>
<location filename="../qt/widgets/input.cc" line="167"/>
<location filename="../qt/widgets/input.cc" line="168"/>
<source> characters!</source>
<translation> </translation>
</message>
@ -389,12 +392,14 @@ location set</source>
<context>
<name>MultiOptionDialog</name>
<message>
<location filename="../qt/widgets/input.cc" line="300"/>
<source>Select</source>
<translation type="vanished"></translation>
<translation></translation>
</message>
<message>
<location filename="../qt/widgets/input.cc" line="328"/>
<source>Cancel</source>
<translation type="vanished"></translation>
<translation></translation>
</message>
</context>
<context>
@ -564,27 +569,27 @@ location set</source>
<translation>退</translation>
</message>
<message>
<location filename="../qt/util.cc" line="18"/>
<location filename="../qt/util.cc" line="21"/>
<source>dashcam</source>
<translation></translation>
</message>
<message>
<location filename="../qt/util.cc" line="18"/>
<location filename="../qt/util.cc" line="21"/>
<source>openpilot</source>
<translation>openpilot</translation>
</message>
<message>
<location filename="../qt/util.cc" line="66"/>
<location filename="../qt/util.cc" line="82"/>
<source>%1 minute%2 ago</source>
<translation>%1 %2 </translation>
</message>
<message>
<location filename="../qt/util.cc" line="69"/>
<location filename="../qt/util.cc" line="85"/>
<source>%1 hour%2 ago</source>
<translation>%1 %2 </translation>
</message>
<message>
<location filename="../qt/util.cc" line="72"/>
<location filename="../qt/util.cc" line="88"/>
<source>%1 day%2 ago</source>
<translation>%1 %2 </translation>
</message>
@ -640,7 +645,7 @@ location set</source>
<context>
<name>RichTextDialog</name>
<message>
<location filename="../qt/widgets/input.cc" line="257"/>
<location filename="../qt/widgets/input.cc" line="258"/>
<source>Ok</source>
<translation></translation>
</message>
@ -648,33 +653,33 @@ location set</source>
<context>
<name>SettingsWindow</name>
<message>
<location filename="../qt/offroad/settings.cc" line="300"/>
<location filename="../qt/offroad/settings.cc" line="314"/>
<source>×</source>
<translation>×</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="326"/>
<location filename="../qt/offroad/settings.cc" line="340"/>
<source>Device</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="327"/>
<location filename="../qt/offroad/settings.cc" line="366"/>
<location filename="../qt/offroad/settings.cc" line="341"/>
<location filename="../qt/offroad/settings.cc" line="380"/>
<source>Network</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="328"/>
<location filename="../qt/offroad/settings.cc" line="342"/>
<source>Toggles</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="329"/>
<location filename="../qt/offroad/settings.cc" line="343"/>
<source>Software</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="334"/>
<location filename="../qt/offroad/settings.cc" line="348"/>
<source>Navigation</source>
<translation></translation>
</message>
@ -913,68 +918,68 @@ location set</source>
<context>
<name>SoftwarePanel</name>
<message>
<location filename="../qt/offroad/settings.cc" line="220"/>
<location filename="../qt/offroad/settings.cc" line="234"/>
<source>Git Branch</source>
<translation>Git </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="221"/>
<location filename="../qt/offroad/settings.cc" line="235"/>
<source>Git Commit</source>
<translation>Git </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="222"/>
<location filename="../qt/offroad/settings.cc" line="236"/>
<source>OS Version</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="223"/>
<location filename="../qt/offroad/settings.cc" line="237"/>
<source>Version</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="224"/>
<location filename="../qt/offroad/settings.cc" line="238"/>
<source>Last Update Check</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="224"/>
<location filename="../qt/offroad/settings.cc" line="238"/>
<source>The last time openpilot successfully checked for an update. The updater only runs while the car is off.</source>
<translation> openpilot </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="225"/>
<location filename="../qt/offroad/settings.cc" line="239"/>
<source>Check for Update</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="230"/>
<location filename="../qt/offroad/settings.cc" line="244"/>
<source>CHECKING</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="237"/>
<location filename="../qt/offroad/settings.cc" line="251"/>
<source>Uninstall </source>
<translation> </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="237"/>
<location filename="../qt/offroad/settings.cc" line="251"/>
<source>UNINSTALL</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="239"/>
<location filename="../qt/offroad/settings.cc" line="253"/>
<source>Are you sure you want to uninstall?</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="253"/>
<location filename="../qt/offroad/settings.cc" line="267"/>
<source>failed to fetch update</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="254"/>
<location filename="../qt/offroad/settings.cc" line="275"/>
<location filename="../qt/offroad/settings.cc" line="268"/>
<location filename="../qt/offroad/settings.cc" line="289"/>
<source>CHECK</source>
<translation></translation>
</message>
@ -1062,82 +1067,82 @@ location set</source>
<context>
<name>TogglesPanel</name>
<message>
<location filename="../qt/offroad/settings.cc" line="32"/>
<location filename="../qt/offroad/settings.cc" line="33"/>
<source>Enable openpilot</source>
<translation> openpilot</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="33"/>
<location filename="../qt/offroad/settings.cc" line="34"/>
<source>Use the openpilot system for adaptive cruise control and lane keep driver assistance. Your attention is required at all times to use this feature. Changing this setting takes effect when the car is powered off.</source>
<translation>使 openpilot 使 </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="38"/>
<location filename="../qt/offroad/settings.cc" line="39"/>
<source>Enable Lane Departure Warnings</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="39"/>
<location filename="../qt/offroad/settings.cc" line="40"/>
<source>Receive alerts to steer back into the lane when your vehicle drifts over a detected lane line without a turn signal activated while driving over 31 mph (50 km/h).</source>
<translation> 31 /50 /线</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="44"/>
<location filename="../qt/offroad/settings.cc" line="45"/>
<source>Enable Right-Hand Drive</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="45"/>
<location filename="../qt/offroad/settings.cc" line="46"/>
<source>Allow openpilot to obey left-hand traffic conventions and perform driver monitoring on right driver seat.</source>
<translation> openpilot </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="50"/>
<location filename="../qt/offroad/settings.cc" line="51"/>
<source>Use Metric System</source>
<translation>使</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="51"/>
<location filename="../qt/offroad/settings.cc" line="52"/>
<source>Display speed in km/h instead of mph.</source>
<translation>//</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="56"/>
<location filename="../qt/offroad/settings.cc" line="57"/>
<source>Record and Upload Driver Camera</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="57"/>
<location filename="../qt/offroad/settings.cc" line="58"/>
<source>Upload data from the driver facing camera and help improve the driver monitoring algorithm.</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="62"/>
<location filename="../qt/offroad/settings.cc" line="63"/>
<source>Disengage On Accelerator Pedal</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="63"/>
<location filename="../qt/offroad/settings.cc" line="64"/>
<source>When enabled, pressing the accelerator pedal will disengage openpilot.</source>
<translation> openpilot</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="69"/>
<location filename="../qt/offroad/settings.cc" line="70"/>
<source>Show ETA in 24h format</source>
<translation> 24 ETA</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="70"/>
<location filename="../qt/offroad/settings.cc" line="71"/>
<source>Use 24h format instead of am/pm</source>
<translation>使 24 /</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="82"/>
<location filename="../qt/offroad/settings.cc" line="83"/>
<source>openpilot Longitudinal Control</source>
<translation>openpilot </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="83"/>
<location filename="../qt/offroad/settings.cc" line="84"/>
<source>openpilot will disable the car&apos;s radar and will take over control of gas and brakes. Warning: this disables AEB!</source>
<translation>openpilot AEB</translation>
</message>

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f08c65839c552bab3f835d3384a1374158cb53e988bdc516b5e9d9a2da0e2715
size 17741
oid sha256:a8a04d85bc163299f9f79b45e5e9b1d44ade7926c9a254d57b1edd4372f51948
size 18031

View File

@ -76,13 +76,13 @@
<context>
<name>ConfirmationDialog</name>
<message>
<location filename="../qt/widgets/input.cc" line="220"/>
<location filename="../qt/widgets/input.cc" line="225"/>
<location filename="../qt/widgets/input.cc" line="221"/>
<location filename="../qt/widgets/input.cc" line="226"/>
<source>Ok</source>
<translation></translation>
</message>
<message>
<location filename="../qt/widgets/input.cc" line="225"/>
<location filename="../qt/widgets/input.cc" line="226"/>
<source>Cancel</source>
<translation></translation>
</message>
@ -108,149 +108,152 @@
<context>
<name>DevicePanel</name>
<message>
<location filename="../qt/offroad/settings.cc" line="98"/>
<location filename="../qt/offroad/settings.cc" line="99"/>
<source>Dongle ID</source>
<translation>Dongle ID</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="98"/>
<location filename="../qt/offroad/settings.cc" line="99"/>
<source>N/A</source>
<translation>使</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="99"/>
<location filename="../qt/offroad/settings.cc" line="100"/>
<source>Serial</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="103"/>
<location filename="../qt/offroad/settings.cc" line="104"/>
<source>Driver Camera</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="103"/>
<location filename="../qt/offroad/settings.cc" line="104"/>
<source>PREVIEW</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="104"/>
<location filename="../qt/offroad/settings.cc" line="105"/>
<source>Preview the driver facing camera to help optimize device mounting position for best driver monitoring experience. (vehicle must be off)</source>
<translation>便調()</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="108"/>
<location filename="../qt/offroad/settings.cc" line="109"/>
<source>Reset Calibration</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="108"/>
<location filename="../qt/offroad/settings.cc" line="109"/>
<source>RESET</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="111"/>
<location filename="../qt/offroad/settings.cc" line="112"/>
<source>Are you sure you want to reset calibration?</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="118"/>
<location filename="../qt/offroad/settings.cc" line="119"/>
<source>Review Training Guide</source>
<translation>使</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="118"/>
<location filename="../qt/offroad/settings.cc" line="119"/>
<source>REVIEW</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="118"/>
<location filename="../qt/offroad/settings.cc" line="119"/>
<source>Review the rules, features, and limitations of openpilot</source>
<translation> openpilot 使</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="120"/>
<location filename="../qt/offroad/settings.cc" line="121"/>
<source>Are you sure you want to review the training guide?</source>
<translation>使</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="128"/>
<location filename="../qt/offroad/settings.cc" line="129"/>
<source>Regulatory</source>
<translation>/</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="128"/>
<location filename="../qt/offroad/settings.cc" line="129"/>
<source>VIEW</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="137"/>
<source>Change Language</source>
<translation type="vanished"></translation>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="137"/>
<source>CHANGE</source>
<translation type="vanished"></translation>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="140"/>
<source>Select a language</source>
<translation type="vanished"></translation>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="146"/>
<location filename="../qt/offroad/settings.cc" line="160"/>
<source>Reboot</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="151"/>
<location filename="../qt/offroad/settings.cc" line="165"/>
<source>Power Off</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="171"/>
<location filename="../qt/offroad/settings.cc" line="185"/>
<source>openpilot requires the device to be mounted within 4° left or right and within 5° up or 8° down. openpilot is continuously calibrating, resetting is rarely required.</source>
<translation>openpilot 4° 5° 8° </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="182"/>
<location filename="../qt/offroad/settings.cc" line="196"/>
<source> Your device is pointed %1° %2 and %3° %4.</source>
<translation> %2 %1° %4 %3° </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="183"/>
<location filename="../qt/offroad/settings.cc" line="197"/>
<source>down</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="183"/>
<location filename="../qt/offroad/settings.cc" line="197"/>
<source>up</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="184"/>
<location filename="../qt/offroad/settings.cc" line="198"/>
<source>left</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="184"/>
<location filename="../qt/offroad/settings.cc" line="198"/>
<source>right</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="195"/>
<location filename="../qt/offroad/settings.cc" line="209"/>
<source>Are you sure you want to reboot?</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="202"/>
<location filename="../qt/offroad/settings.cc" line="216"/>
<source>Disengage to Reboot</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="208"/>
<location filename="../qt/offroad/settings.cc" line="222"/>
<source>Are you sure you want to power off?</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="215"/>
<location filename="../qt/offroad/settings.cc" line="229"/>
<source>Disengage to Power Off</source>
<translation></translation>
</message>
@ -299,17 +302,17 @@
<context>
<name>InputDialog</name>
<message>
<location filename="../qt/widgets/input.cc" line="70"/>
<location filename="../qt/widgets/input.cc" line="71"/>
<source>Cancel</source>
<translation></translation>
</message>
<message>
<location filename="../qt/widgets/input.cc" line="167"/>
<location filename="../qt/widgets/input.cc" line="168"/>
<source>Need at least </source>
<translation> </translation>
</message>
<message>
<location filename="../qt/widgets/input.cc" line="167"/>
<location filename="../qt/widgets/input.cc" line="168"/>
<source> characters!</source>
<translation> </translation>
</message>
@ -394,12 +397,14 @@ location set</source>
<context>
<name>MultiOptionDialog</name>
<message>
<location filename="../qt/widgets/input.cc" line="300"/>
<source>Select</source>
<translation type="vanished"></translation>
<translation></translation>
</message>
<message>
<location filename="../qt/widgets/input.cc" line="328"/>
<source>Cancel</source>
<translation type="vanished"></translation>
<translation></translation>
</message>
</context>
<context>
@ -569,29 +574,29 @@ location set</source>
<translation></translation>
</message>
<message>
<location filename="../qt/util.cc" line="18"/>
<location filename="../qt/util.cc" line="21"/>
<source>dashcam</source>
<translation></translation>
</message>
<message>
<location filename="../qt/util.cc" line="18"/>
<location filename="../qt/util.cc" line="21"/>
<source>openpilot</source>
<translation>openpilot</translation>
</message>
<message>
<location filename="../qt/util.cc" line="66"/>
<location filename="../qt/util.cc" line="82"/>
<source>%1 minute%2 ago</source>
<translatorcomment>we don&apos;t need %2</translatorcomment>
<translation>%1 </translation>
</message>
<message>
<location filename="../qt/util.cc" line="69"/>
<location filename="../qt/util.cc" line="85"/>
<source>%1 hour%2 ago</source>
<translatorcomment>we don&apos;t need %2</translatorcomment>
<translation>%1 </translation>
</message>
<message>
<location filename="../qt/util.cc" line="72"/>
<location filename="../qt/util.cc" line="88"/>
<source>%1 day%2 ago</source>
<translatorcomment>we don&apos;t need %2</translatorcomment>
<translation>%1 </translation>
@ -648,7 +653,7 @@ location set</source>
<context>
<name>RichTextDialog</name>
<message>
<location filename="../qt/widgets/input.cc" line="257"/>
<location filename="../qt/widgets/input.cc" line="258"/>
<source>Ok</source>
<translation></translation>
</message>
@ -656,33 +661,33 @@ location set</source>
<context>
<name>SettingsWindow</name>
<message>
<location filename="../qt/offroad/settings.cc" line="300"/>
<location filename="../qt/offroad/settings.cc" line="314"/>
<source>×</source>
<translation>×</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="326"/>
<location filename="../qt/offroad/settings.cc" line="340"/>
<source>Device</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="327"/>
<location filename="../qt/offroad/settings.cc" line="366"/>
<location filename="../qt/offroad/settings.cc" line="341"/>
<location filename="../qt/offroad/settings.cc" line="380"/>
<source>Network</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="328"/>
<location filename="../qt/offroad/settings.cc" line="342"/>
<source>Toggles</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="329"/>
<location filename="../qt/offroad/settings.cc" line="343"/>
<source>Software</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="334"/>
<location filename="../qt/offroad/settings.cc" line="348"/>
<source>Navigation</source>
<translation></translation>
</message>
@ -921,68 +926,68 @@ location set</source>
<context>
<name>SoftwarePanel</name>
<message>
<location filename="../qt/offroad/settings.cc" line="220"/>
<location filename="../qt/offroad/settings.cc" line="234"/>
<source>Git Branch</source>
<translation>Git </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="221"/>
<location filename="../qt/offroad/settings.cc" line="235"/>
<source>Git Commit</source>
<translation>Git </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="222"/>
<location filename="../qt/offroad/settings.cc" line="236"/>
<source>OS Version</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="223"/>
<location filename="../qt/offroad/settings.cc" line="237"/>
<source>Version</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="224"/>
<location filename="../qt/offroad/settings.cc" line="238"/>
<source>Last Update Check</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="224"/>
<location filename="../qt/offroad/settings.cc" line="238"/>
<source>The last time openpilot successfully checked for an update. The updater only runs while the car is off.</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="225"/>
<location filename="../qt/offroad/settings.cc" line="239"/>
<source>Check for Update</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="230"/>
<location filename="../qt/offroad/settings.cc" line="244"/>
<source>CHECKING</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="237"/>
<location filename="../qt/offroad/settings.cc" line="251"/>
<source>Uninstall </source>
<translation> </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="237"/>
<location filename="../qt/offroad/settings.cc" line="251"/>
<source>UNINSTALL</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="239"/>
<location filename="../qt/offroad/settings.cc" line="253"/>
<source>Are you sure you want to uninstall?</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="253"/>
<location filename="../qt/offroad/settings.cc" line="267"/>
<source>failed to fetch update</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="254"/>
<location filename="../qt/offroad/settings.cc" line="275"/>
<location filename="../qt/offroad/settings.cc" line="268"/>
<location filename="../qt/offroad/settings.cc" line="289"/>
<source>CHECK</source>
<translation></translation>
</message>
@ -1070,82 +1075,82 @@ location set</source>
<context>
<name>TogglesPanel</name>
<message>
<location filename="../qt/offroad/settings.cc" line="32"/>
<location filename="../qt/offroad/settings.cc" line="33"/>
<source>Enable openpilot</source>
<translation> openpilot</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="33"/>
<location filename="../qt/offroad/settings.cc" line="34"/>
<source>Use the openpilot system for adaptive cruise control and lane keep driver assistance. Your attention is required at all times to use this feature. Changing this setting takes effect when the car is powered off.</source>
<translation>使 openpilot </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="38"/>
<location filename="../qt/offroad/settings.cc" line="39"/>
<source>Enable Lane Departure Warnings</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="39"/>
<location filename="../qt/offroad/settings.cc" line="40"/>
<source>Receive alerts to steer back into the lane when your vehicle drifts over a detected lane line without a turn signal activated while driving over 31 mph (50 km/h).</source>
<translation> 50 (31 ) </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="44"/>
<location filename="../qt/offroad/settings.cc" line="45"/>
<source>Enable Right-Hand Drive</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="45"/>
<location filename="../qt/offroad/settings.cc" line="46"/>
<source>Allow openpilot to obey left-hand traffic conventions and perform driver monitoring on right driver seat.</source>
<translation>openpilot ()</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="50"/>
<location filename="../qt/offroad/settings.cc" line="51"/>
<source>Use Metric System</source>
<translation>使</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="51"/>
<location filename="../qt/offroad/settings.cc" line="52"/>
<source>Display speed in km/h instead of mph.</source>
<translation> mp/h km/h</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="56"/>
<location filename="../qt/offroad/settings.cc" line="57"/>
<source>Record and Upload Driver Camera</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="57"/>
<location filename="../qt/offroad/settings.cc" line="58"/>
<source>Upload data from the driver facing camera and help improve the driver monitoring algorithm.</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="62"/>
<location filename="../qt/offroad/settings.cc" line="63"/>
<source>Disengage On Accelerator Pedal</source>
<translation></translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="63"/>
<location filename="../qt/offroad/settings.cc" line="64"/>
<source>When enabled, pressing the accelerator pedal will disengage openpilot.</source>
<translation> openpilot </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="69"/>
<location filename="../qt/offroad/settings.cc" line="70"/>
<source>Show ETA in 24h format</source>
<translation> 24 </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="70"/>
<location filename="../qt/offroad/settings.cc" line="71"/>
<source>Use 24h format instead of am/pm</source>
<translation>使 24 ( 12 )</translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="82"/>
<location filename="../qt/offroad/settings.cc" line="83"/>
<source>openpilot Longitudinal Control</source>
<translation>openpilot </translation>
</message>
<message>
<location filename="../qt/offroad/settings.cc" line="83"/>
<location filename="../qt/offroad/settings.cc" line="84"/>
<source>openpilot will disable the car&apos;s radar and will take over control of gas and brakes. Warning: this disables AEB!</source>
<translation>openpilot (AEB) </translation>
</message>

View File

@ -246,7 +246,7 @@ void UIState::update() {
updateStatus();
if (sm->frame % UI_FREQ == 0) {
watchdog_kick();
watchdog_kick(nanos_since_boot());
}
emit uiUpdate(*this);
}

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python3
import argparse
import os
import json
import os
from common.basedir import BASEDIR