i18n: language picker in the bottom-right corner

Replaces the EN/ES/RU buttons in the Visual Presets dock with a picker
that scales to many languages: a globe button with the current code
next to the POWER UP chip, opening a list of languages named in their
own language with their codes, the current one first and checked. A
search field appears past 8 languages. Keyboard: arrows, Home/End,
Enter/Space, Esc, type-ahead; keys stay in the list while it is open.
Choosing a language still asks before dropping unsaved work, then
reloads. Phones get the globe alone and a full-width sheet; the layout
uses logical properties for right-to-left languages.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
German KhokhlovandClaude Opus 5.5 committed 2026-10-16 02:03:17 +04:00
1 parent 7fd1dd867f
commit 6031c95a81
21 files changed
+1381 -139

No files matched your search

+2 -2
View File
@@ -3139,8 +3139,8 @@ Shipped locales: **en** (source and fallback), **es** and **ru**. The code lives
- **Locale choice.** `?lang=` → stored choice (`gev:locale:v1`) →
`navigator.languages` → English. `?lang=` is not stored: it applies while it
stays in the address, and the copied share link drops it, so a recipient keeps
their own language. The language switch in the Visual Presets dock stores the
choice, removes `?lang=` (keeps it only where storage is blocked) and reloads,
their own language. The language picker in the bottom-right corner (a globe
button beside POWER UP, `src/ui/localePicker.js`) stores the choice, removes `?lang=` (keeps it only where storage is blocked) and reloads,
so nothing re-renders live; it asks first when the reload would lose work
(unsaved CCTV calibration, the open cockpit, Draw marks on the board,
imported map files, an active voice session — each registered through