feat(openlogi-gui): expand UI to 19 fully-translated locales (+ asset & layout fixes)#24
feat(openlogi-gui): expand UI to 19 fully-translated locales (+ asset & layout fixes)#24davidbudnick wants to merge 1 commit into
Conversation
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes — initial review of a tightly-scoped PR that bundles a 4→19 locale expansion, a layout/asset polish pass, and two new top-level docs.
- Expand
i18n::SUPPORTEDto 19 locales with full catalog coverage — every one of the ~115 catalog entries inlocales/app.ymlgains a column for the 15 new locales, all double-quoted;match_supportedfoldspt→pt-PT/pt-BRby region and collapsesnb/nn/noontonb, with tests for every new fold case. - Settings language picker switches from chip row to
gpui_component::select::Select—SelectStateis built lazily on first render (it needs theWindow) and rebuilt when the active locale changes so "Follow system" re-localizes; window grew 360→560px and gainedoverflow_y_scrollso the Language section is never clipped. - Mouse-model labels relayout as a centered flex column — heights flow from wrapped text with a constant
gap_4,MIN_LABEL_PITCH = 100.floors the slot pitch ingeometry.rs, and each card records its measured centre into a sharedRc<RefCell<HashMap<ButtonId, Pixels>>>during prepaint that the leader-canvas reads during paint of the same frame. - Localize mouse-model button labels —
LabelTriggerand the binding text now go throughtr!(label.id.label())/tr!(a.label()), matching what the picker dropdown already did. - Display-name fallback in
asset::resolve_in_index— last-resorteq_ignore_ascii_casematch against the registry'sdisplayName, threaded throughresolve(model, name)/sync(server, &[(model, Option<String>)])/collect_modelsso an MX Master 3S on Bolt (PIDb034, registry keys 3S onb043) no longer renders a blank silhouette. - Docs: adds
CLAUDE.mdplusAGENTS.md → CLAUDE.md, and updatesAppSettings::languagedoc to point ati18n::SUPPORTEDinstead of listing codes inline.
Claude Opus | 𝕏
dcede19 to
01ef2c5
Compare
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes — re-review after 01ef2c5 style(openlogi-gui): fmt + clippy landed on top of the previously approved tree. The new commit is purely mechanical and carries no behavioral change.
asset/mod.rs— reflow the display-name-fallbackdebug!macro across multiple lines; identical output.mouse_model/view.rs— drop the duplicate#[allow(clippy::too_many_arguments)]attribute onlabel_card, rewrite its doc comment, and switch the leader-canvas paint closure pattern from|_, _, _, _|to|_, (), _, _|to destructure the unit prepaint result explicitly.windows/settings.rs— reformatSelectState::new(...),try_global::<AppState>().map_or(...), andoptions.extend(...)to multi-line shape; add#[allow(clippy::unused_self)]toon_language_changesincesubscribe_inrequires the&mut selfhandler signature even though the body never readsself.
The substantive 4→19 locale expansion, mouse-model relayout, display-name asset fallback, and settings dropdown were covered in the prior review at 91ef26b and remain unchanged. Mergeable.
Claude Opus | 𝕏
sanube
left a comment
There was a problem hiding this comment.
Native German speaker review of the de locale (115 strings)
Overall quality is high — the translation follows macOS German conventions throughout. Specifically:
✅ Correctly uses macOS German UI conventions
"Widerrufen"for Undo (matches macOS Edit menu)"Einsetzen"for Paste (matches macOS Edit menu)"Sichern"for Save (matches macOS File menu)"Im Dock ablegen"for Minimize (matches macOS Window menu)"Bedienungshilfen"for Accessibility (matches System Settings)"Bildschirmfoto"for Screenshot (matches macOS naming)- Correct German quotation marks
„…"in the accessibility blurb
✅ Consistent du-form throughout (appropriate for a developer/prosumer tool)
✅ Technical terms handled well — HID++, DPI, SmartShift, Mission Control, App Exposé, Launchpad correctly left untranslated
Minor style notes (no blockers):
"koppele"(imperative of "koppeln") — both"koppele"and"kopple"are grammatically valid;"kopple"is slightly more natural in spoken German but"koppele"is acceptable in written UI text"Eindrücken"for gesture"Click"— works, though"Klick"(noun) or"Drücken"would be more concise; all three are correct"%{name} zuweisen"for"Bind %{name}"— good choice;"belegen"(keyboard shortcut term) is an equally valid alternative but"zuweisen"is more universally understood
None of these warrant changes — the translation is production-ready.
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes — re-review after 52c7a2c Merge upstream/master into feat/expand-locales landed on top of the previously approved 01ef2c5. The merge integrates master's v0.3.0 line (which itself shipped ru and a Select-based language picker via #38) into the PR branch.
- Adopted master's
windows/settings.rsimplementation wholesale — the PR'sLangOption/ensure_language_select/built_langindirection is gone;SettingsView::new(window, cx)builds aSelectState<Vec<LanguageOption>>eagerly, and the "Follow system" entry setslocalize_label = trueso itstitle()callsrust_i18n::t!at render time, which re-localizes the placeholder oncx.refresh_windows()without rebuilding the state entity. - Integrated PR's display-name asset fallback with master's stable device ordering (#37) in
state/devices.rs—cache.resolve(model, paired.codename.as_deref())lives inside the per-paired-device loop, and the resulting list is then sorted bydevice_order_key. No conflict in behaviour. - Filled in
rucolumns left partial by master's #38 across all 115 entries inlocales/app.yml; final file has no duplicate keys. - Picked up upstream BLE-direct HID++ enumeration (#28), settings scroll (#22),
FUNDING.yml, and the v0.3.0 changelog /Cargo.tomlbumps via merge — no semantic interaction with the PR's i18n work. - Preserved the PR's
AppSettings::languagedoc rewrite (referencesi18n::SUPPORTEDrather than inlining codes) over master's shorter codes-inline version.
The substantive 4→19 locale expansion, mouse-model relayout (anchors RefCell, MIN_LABEL_PITCH = 100., min_h cards), display-name asset fallback, and dropdown picker were covered in the prior reviews at 91ef26b / 01ef2c5 and remain unchanged. Settings window height is now master's 520×360 (not the PR's 560), but with overflow_y_scrollbar() the Language section is reachable; if the dropdown's expanded list ever overflows visibly, a small follow-up grow may be warranted — not blocking. Mergeable.
Claude Opus | 𝕏
52c7a2c to
a15166f
Compare
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes — re-review after the branch was rebased onto 0ca1442 (v0.3.0) and squashed into a single commit a15166f. Tree delta against the prior reviewed merge 52c7a2c is confined to windows/settings.rs — a small layout polish that closes the earlier "dropdown may overflow at 360" open question.
- Settings window height grew 360→460 in
windows::open— a middle ground between master's 360 and the PR's earlier 560, giving theSelect's expanded list room without making the window feel tall. - Scroll container now properly bounded — the inner
v_flexgainedflex_1().min_h(px(0.))sooverflow_y_scrollbar()has a real height to scroll within instead of expanding to content size; this is the canonical flex-scroll fix and pairs cleanly with the existing outersize_fullv_flex. - Language row's
Selectwrapped in a fixed-size shrink-0 box —div().flex_shrink_0().w(px(220.)).h_6()(matching the.small()input height) preventsSelect'ssize_fullroot from claiming the whole row and starving the muted description into one char per line. A short comment inlanguage_rowdocuments the rationale.
The substantive 4→19 locale expansion, mouse-model relayout, display-name asset fallback, dropdown picker, and docs were covered in the prior reviews at 91ef26b / 01ef2c5 / 52c7a2c and remain unchanged by the rebase. Mergeable.
Claude Opus | 𝕏
ac144b6 to
db3bb29
Compare
|
Pullfrog stalled The agent stopped emitting events for 301s and was killed by the activity-timeout watchdog. 3627 events were processed before the failure. Recent agent stderr
|
db3bb29 to
8bea020
Compare
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes — incremental re-review after the branch was rebased and squashed into a single commit 8bea020. Tree is identical to the change set reviewed at a15166f; no material differences since the last Pullfrog review.
- Locale expansion, settings dropdown, mouse-model relayout, asset fallback, and docs — all unchanged from the previously reviewed tree. The 9 files and 2076 added / 92 deleted lines match the prior review exactly.
Big Pickle (free) (credentials for Anthropic not configured) | 𝕏
8bea020 to
9896bac
Compare
|
Pullfrog stalled The agent stopped emitting events for 301s and was killed by the activity-timeout watchdog. 3940 events were processed before the failure. Recent agent stderr
|
9896bac to
589cd67
Compare

Expands i18n and fixes mouse-model label layout found while testing locales on a real MX Master 3S. Rebased on current
master;cargo test -p openlogi-guigreen (11/11),clippy+rustfmtclean.i18n
masterships (en,ja,ru,zh-CN,zh-HK,zh-TW) to 20 — addsda,de,es,fr,it,nl,nb,pl,pt-PT,pt-BR,fi,sv,el,ko, with full coverage across every UI string (everytr!/t!literal has a catalog key in every locale).en/ja/ru/zh-CN/zh-HK/zh-TW): this PR only adds the new locales and never overrides master's existing values. Picks up master's recentzh-TWlocale and the extended empty-state hint (now translated into all 14 added locales too)..label(), so the canvas labels stayed English after a language switch (the picker dropdown already localized them).Agent files
CLAUDE.mdat the root of the project.AGENTS.mdwhich symlinks toCLAUDE.md.Layout
Screenshots