Files
clearpilot/selfdrive/ui/translations
brianhansonxyz b5a0b3221c port C++ UI from broken: ready/splash, ClearPilot menu, onroad widgets, nightrider
Wholesale port of the 10 UI files (main.cc, ui.{cc,h}, onroad.{cc,h},
home.{cc,h}, window.{cc,h}, ready.{cc,h}, SConscript). sidebar.{cc,h}
unchanged.

Brings in:
- splash/ready screen rendered via Qt directly (replaces stock home)
- ready page shown when started but gear=park
- ClearPilot offroad menu (Home/Dashcam/Debug panels) replacing stock
- onroad UI: speed widget reading ClearpilotSpeedDisplay (gpsLocation
  via speed_logicd), speed-limit widget, cruise-vs-limit warning sign
- nightrider mode: camera suppressed, lane lines/path drawn as 2px
  outlines only (ScreenDisplayMode 1 or 4)
- screen power: ScreenDisplayMode 3 forces setAwake(false)
- ignition off blanks screen immediately (tap still wakes)
- Qt-based RPC widget-tree dump server at ipc:///tmp/clearpilot_ui_rpc
- crash handler in main.cc with stack trace

Deviation from broken (3 sites): no_lat_lane_change is read from
paramsMemory (controlsd writes it there in baseline) instead of broken's
custom cereal field frogpilotCarControl.noLatLaneChange. Keeps the
existing self-driving wiring intact.

SConscript drops screenrecorder.cc from qt_src (broken did the same;
omx_encoder.cc still built for dashcamd's future link).

Build clean. UI hasn't been launched yet — that comes after the
controlsd button-handler commit lands.

Translation .ts files are auto-regenerated by Qt's lupdate; included.
2026-05-03 23:03:42 -05:00
..

Multilanguage

languages

Contributing

Before getting started, make sure you have set up the openpilot Ubuntu development environment by reading the tools README.md.

Policy

Most of the languages supported by openpilot come from and are maintained by the community via pull requests. A pull request likely to be merged is one that fixes a translation or adds missing translations.

We also generally merge pull requests adding support for a new language if there are community members willing to maintain it. Maintaining a language is ensuring quality and completion of translations before each openpilot release.

comma may remove or hide language support from releases depending on translation quality and completeness.

Adding a New Language

openpilot provides a few tools to help contributors manage their translations and to ensure quality. To get started:

  1. Add your new language to languages.json with the appropriate language code and the localized language name (Traditional Chinese is 中文(繁體)).
  2. Generate the XML translation file (*.ts):
    selfdrive/ui/update_translations.py
    
  3. Edit the translation file, marking each translation as completed:
    linguist selfdrive/ui/translations/your_language_file.ts
    
  4. View your finished translations by compiling and starting the UI, then find it in the language selector:
    scons -j$(nproc) selfdrive/ui && selfdrive/ui/ui
    
  5. Read Checking the UI to double-check your translations fit in the UI.

Improving an Existing Language

Follow step 3. above, you can review existing translations and add missing ones. Once you're done, just open a pull request to openpilot.

Checking the UI

Different languages use varying space to convey the same message, so it's a good idea to double-check that your translations do not overlap and fit into each widget. Start the UI (step 4. above) and view each page, making adjustments to translations as needed.

To view offroad alerts:

With the UI started, you can view the offroad alerts with:

selfdrive/ui/tests/cycle_offroad_alerts.py

Updating the UI

Any time you edit source code in the UI, you need to update the translations to ensure the line numbers and contexts are up to date (first step above).

Testing

openpilot has a few unit tests to make sure all translations are up-to-date and that all strings are wrapped in a translation marker. They are run in CI, but you can also run them locally.

Tests translation files up to date:

selfdrive/ui/tests/test_translations.py

Tests all static source strings are wrapped:

selfdrive/ui/tests/create_test_translations.sh && selfdrive/ui/tests/test_translations

multilanguage_onroad