calm-artist-7206
10/05/2026, 10:22 PMfresh-machine-37269
10/05/2026, 10:22 PMfresh-machine-37269
10/05/2026, 10:24 PMbefore-semantics-capture-17909.png)
A terminal-style capture of the control-openhands probe run on main (revision aeea97e). It confirms the bugs:
• count role=main returns 2 on each Settings page (nested landmarks).
• aria-current for the Customize sidebar row (sidebar-skills-link) is null on /mcp, /skills, /plugins, /apps.
• After picking Français/Arabic, <html> still reads lang=en dir= (no dir at all).
• The command-menu trigger's aria-label is "Search commands" in every language.
2. Before — French UI (before-french-ui-search-commands-untranslated.png)
A full app screenshot in French: "Paramètres → Application", sidebar in French ("Nouvelle discussion", "Personnaliser", "Automate", "Conversations"…). The top-left command-menu control still reads the English "Search commands" — the untranslated label the PR fixes.
3. After — probe capture (after-semantics-capture-17909.png)
Same probe, now on the fix branch. All flipped: role=main count is 1 on every Settings page; Customize now reports aria-current="page" on /mcp, /skills, /plugins, /apps and stays null on `/conversations`/`/automations`; lang=fr dir=ltr, lang=ar dir=rtl, `lang=en dir=ltr`; and the trigger label is now "Rechercher des commandes". It also shows four extra variants: live languageChanged (fr without reload), Arabic after save + reload, a keyboard path on /mcp (focus lands on the Customize link with aria-current=page), and a 390×844 phone viewport with the mobile drawer open (drawer link still aria-current="page", role=main count 1 on phone /settings and /settings/app).
4. After — French UI (after-french-ui-search-commands-translated.png)
Same French Settings screen, but now the command menu reads "Rechercher des commandes", and a green "Settings saved" toast is visible.
5. After — Arabic UI (after-arabic-html-dir-rtl.png)
The Arabic Settings > Application screen with the whole layout mirrored right-to-left, confirming <html dir="rtl">. As the PR notes, the RTL flip exposes some physical left/right styling issues (e.g. switch thumbs sitting outside their tracks), which the description explicitly parks as out-of-scope follow-up work.
This description was generated by an AI agent (OpenHands) on behalf of the user.calm-artist-7206
10/05/2026, 10:27 PMfresh-machine-37269
10/05/2026, 10:41 PMsettings.tsx wrapper is now a <div> (testid kept), so `SettingsLayout`'s <main> is the single landmark.
• SidebarNavLink sets aria-current="page" from the same active value that drives its style; NavigationLink now honors a caller-supplied aria-current and otherwise behaves exactly as before.
• New useSyncDocumentLanguage hook (mounted only in the standalone root-layout) mirrors i18next language → <html lang> and i18n.dir() → <html dir> on mount and on languageChanged, with proper unsubscribe.
• COMMAND_MENU$OPEN_LABEL translated across all 15 locales.
What I verified independently
• npm ci on the branch head, generated i18n, then ran the PR's exact vitest command: 31 files / 218 tests pass.
• Ran the new/changed tests against current main (6801911): 19 failures — 4 sidebar aria-current, 12 locale-label, 1 root-layout hook, 1 settings single-main, 1 navigation-link caller override. That matches the PR's claim and confirms these are real regression tests, not tautologies.
• check-translation-completeness.cjs → full coverage; Prettier clean. (ESLint wouldn't finish in my sandbox — OOM, not a code issue.)
• Traced the `active`/`forceActive` logic: aria-current and the active style stay in lockstep, and non-forceActive links fall through to the old behavior, so no other NavigationLink caller changes.
Non-blocking nits
• aria-current="page" on the Customize row (really a section container) is a defensible convention and matches the existing NavigationLink behavior; `"true"`/`"location"` could also be argued.
• The hook subscribes to the active i18n instance via the proxy; if an embedding host ever swapped instances with setI18n, the subscription wouldn't move — but it's standalone-only, so not a concern here.
• Brief en → selected-language flash on first paint is expected and harmless.
The out-of-scope follow-ups the PR already discloses (/shared/conversations/:id outside root-layout, RTL physical-utility issues, remaining COMMAND_MENU$* keys) are correctly scoped out. Want me to post this as a formal GitHub review (or an approval) on the PR?
This message was generated by an AI agent (OpenHands) on behalf of the user.calm-artist-7206
10/05/2026, 10:46 PMfresh-machine-37269
10/05/2026, 10:47 PMmain broken out per suite for follow-up.
Summary of the verification behind the approval: the branch's targeted suite passes 218/218, the translation-completeness check reports full coverage, and the new tests fail 19 ways on current main, so they're real regression tests rather than tautologies. The remaining items (shared-conversation route, RTL physical utilities, other COMMAND_MENU$* keys) are correctly deferred follow-ups.
This message was generated by an AI agent (OpenHands) on behalf of the user.