Skip to content

fix(ui): localize mobile pairing in Hindi and Russian#100040

Merged
steipete merged 6 commits into
mainfrom
codex/fix-pairing-locales
Jul 4, 2026
Merged

fix(ui): localize mobile pairing in Hindi and Russian#100040
steipete merged 6 commits into
mainfrom
codex/fix-pairing-locales

Conversation

@steipete

@steipete steipete commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

Related: #94672

What Problem This Solves

Fixes an issue where users running the Control UI in Hindi or Russian still see English copy throughout the mobile-pairing flow.

Why This Change Was Made

The 15 mobile-pairing strings in each affected locale are now localized. Focused regression tests prevent recorded locale fallbacks or untranslated mobile-pairing copy from shipping again. This is an AI-assisted maintainer follow-up to #94672.

User Impact

Hindi and Russian users now see localized setup-code, QR, pending-review, help, and device-management messages. All 20 shipped Control UI locales remain clean with zero recorded fallbacks.

Evidence

  • node --import tsx scripts/control-ui-i18n.ts check — passed after rebase; 20/20 locales clean, zero fallbacks
  • node scripts/run-vitest.mjs test/scripts/control-ui-i18n.test.ts ui/src/i18n/test/translate.test.ts — passed after rebase; 2 shards, 19 tests
  • node scripts/run-tsgo.mjs -p test/tsconfig/tsconfig.test.ui.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/test-ui.tsbuildinfo — passed after current-lockfile install
  • .agents/skills/autoreview/scripts/autoreview --mode local ... — clean; no accepted/actionable findings
  • git diff --check — passed

@openclaw-barnacle openclaw-barnacle Bot added app: web-ui App: web-ui size: S maintainer Maintainer-authored PR labels Jul 4, 2026
@steipete steipete self-assigned this Jul 4, 2026
@clawsweeper

clawsweeper Bot commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed July 4, 2026, 3:14 PM ET / 19:14 UTC.

Summary
The PR localizes the Control UI mobile-pairing strings in Hindi and Russian and adds i18n regression checks for recorded fallbacks and untranslated mobile-pairing copy.

Reproducibility: yes. Source inspection of current main shows Hindi and Russian nodes.pairing strings still contain English mobile-pairing copy, while the PR head replaces those strings.

Review metrics: 1 noteworthy metric.

  • Current merge-result surface: 4 files changed; 0 package or lock files. This distinguishes the actual merge result from the stale broad PR file list and dependency-guard noise.

Stored data model
Persistent data-model change detected: migration/backfill/repair: docs/cli/onboard.md, serialized state: extensions/acpx/src/runtime-internals/mcp-proxy.test.ts, unknown-data-model-change: ui/src/ui/chat/session-controls.ts, unknown-data-model-change: ui/src/ui/controllers/sessions.test.ts, unknown-data-model-change: ui/src/ui/controllers/sessions.ts, unknown-data-model-change: ui/src/ui/e2e/session-management.e2e.test.ts, and 5 more. Confirm migration or upgrade compatibility proof before merge.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🌊 off-meta tidepool
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • none.

Next step before merge

  • [P1] No automated repair is needed; the protected maintainer-labeled PR should proceed through normal maintainer merge and current-head CI handling.

Security
Cleared: No concrete security or supply-chain concern was found in the current merge result; package and lockfile changes are not part of the potential merge diff against current main.

Review details

Best possible solution:

Land the narrow locale-bundle and i18n-test follow-up after current-head CI/maintainer gates complete, keeping the generated locale metadata consistent with the UI i18n pipeline.

Do we have a high-confidence way to reproduce the issue?

Yes. Source inspection of current main shows Hindi and Russian nodes.pairing strings still contain English mobile-pairing copy, while the PR head replaces those strings.

Is this the best way to solve the issue?

Yes. Updating the generated locale bundles plus adding focused i18n guards is the narrowest maintainable fix for untranslated Control UI mobile-pairing copy.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against d102715bb232.

Label changes

Label changes:

  • add rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🌊 off-meta tidepool and patch quality is 🐚 platinum hermit.
  • add status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Not applicable: The PR is maintainer-labeled and changes localized copy plus tests; the contributor-provided command and CI evidence is review context, but the external-contributor real-behavior gate is not applied here.

Label justifications:

  • P3: The PR fixes localized UI copy and regression coverage for a limited Control UI surface without changing runtime behavior or configuration.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🌊 off-meta tidepool and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Not applicable: The PR is maintainer-labeled and changes localized copy plus tests; the contributor-provided command and CI evidence is review context, but the external-contributor real-behavior gate is not applied here.
Evidence reviewed

What I checked:

  • Current main still has English Hindi mobile-pairing copy: origin/main still has English nodes.pairing strings in the Hindi locale bundle, including button, setup-code, QR, waiting, help, and device-management text. (ui/src/i18n/locales/hi.ts:138, d102715bb232)
  • Current main still has English Russian mobile-pairing copy: origin/main still has English nodes.pairing strings in the Russian locale bundle, matching the PR's reported user-visible gap. (ui/src/i18n/locales/ru.ts:138, d102715bb232)
  • PR head localizes the Hindi mobile-pairing strings: The PR head replaces the English Hindi nodes.pairing strings with Hindi text while preserving placeholders and product terms. (ui/src/i18n/locales/hi.ts:138, ad8d7d3ca13d)
  • PR head localizes the Russian mobile-pairing strings: The PR head replaces the English Russian nodes.pairing strings with Russian text while preserving placeholders and product terms. (ui/src/i18n/locales/ru.ts:138, ad8d7d3ca13d)
  • Regression guard added: The PR adds a shipped-locale test that checks nodes.pairing strings do not match English, in addition to the fallback metadata guard in the script tests. (ui/src/i18n/test/translate.test.ts:207, ad8d7d3ca13d)
  • Current merge-result surface is narrow: Although GitHub's PR file list is stale and very broad, comparing current main to the potential merge commit shows four files changed: the two locale bundles and two tests, with no package or lockfile files in that merge result. (0e269c65556a)

Likely related people:

  • bkudiess: Authored the merged Control UI mobile-pairing PR that introduced the nodes.pairing locale strings now being localized. (role: feature author; confidence: high; commits: 129e0a8cf07c; files: ui/src/i18n/locales/hi.ts, ui/src/i18n/locales/ru.ts)
  • steipete: Merged the mobile-pairing PR and recently touched the same generated locale bundles in session-management work. (role: recent locale area contributor and merger; confidence: high; commits: 129e0a8cf07c, 6df0fb818d67; files: ui/src/i18n/locales/hi.ts, ui/src/i18n/locales/ru.ts, ui/src/i18n/test/translate.test.ts)
  • Vincent Koc: Recent generated-locale history around these files includes broad alignment work adjacent to the current i18n surface. (role: adjacent locale bundle contributor; confidence: medium; commits: 787f3a2ce557; files: ui/src/i18n/locales/hi.ts, ui/src/i18n/locales/ru.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.
Review history (7 earlier review cycles)
  • reviewed 2026-07-04T17:57:31.569Z sha 54a231f :: needs real behavior proof before merge. :: [P2] Cast en.nodes before reading pairing
  • reviewed 2026-07-04T18:04:19.778Z sha 54a231f :: needs real behavior proof before merge. :: [P2] Cast en.nodes before reading pairing
  • reviewed 2026-07-04T18:17:44.435Z sha 1ae46aa :: needs real behavior proof before merge. :: none
  • reviewed 2026-07-04T18:23:36.472Z sha 1ae46aa :: needs real behavior proof before merge. :: [P2] Regenerate locale metadata after rebasing
  • reviewed 2026-07-04T18:50:18.573Z sha 4988f7e :: needs real behavior proof before merge. :: none
  • reviewed 2026-07-04T18:55:36.150Z sha 4988f7e :: needs real behavior proof before merge. :: none
  • reviewed 2026-07-04T19:02:03.734Z sha 75b594c :: needs real behavior proof before merge. :: [P1] Rebase away the stale dependency graph

@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. P3 Low-priority cleanup, docs, polish, ergonomics, or speculative work. labels Jul 4, 2026
@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jul 4, 2026
@steipete steipete requested a review from a team as a code owner July 4, 2026 18:45
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation channel: voice-call Channel integration: voice-call app: ios App: ios app: macos App: macos gateway Gateway runtime cli CLI command changes scripts Repository scripts commands Command implementations agents Agent runtime and tooling extensions: acpx labels Jul 4, 2026
@openclaw-barnacle openclaw-barnacle Bot added channel: line Channel integration: line channel: matrix Channel integration: matrix channel: msteams Channel integration: msteams channel: nostr Channel integration: nostr channel: tlon Channel integration: tlon channel: whatsapp-web Channel integration: whatsapp-web channel: zalouser Channel integration: zalouser extensions: diagnostics-otel Extension: diagnostics-otel extensions: llm-task Extension: llm-task extensions: lobster Extension: lobster extensions: memory-core Extension: memory-core extensions: memory-lancedb Extension: memory-lancedb channel: feishu Channel integration: feishu channel: twitch Channel integration: twitch extensions: tavily channel: qa-channel Channel integration: qa-channel extensions: qa-lab extensions: memory-wiki plugin: google-meet extensions: oc-path extensions: amazon-bedrock extensions: anthropic-vertex extensions: diffs extensions: firecrawl extensions: github-copilot labels Jul 4, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ad8d7d3ca1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread ui/src/i18n/locales/ar.ts
@@ -417,6 +426,22 @@ export const ar: TranslationMap = {
collapse: "طي الشريط الجانبي",
resize: "تغيير حجم الشريط الجانبي",
},
terminal: {
title: "Terminal",
toggle: "Toggle terminal",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Translate terminal labels before clearing fallback metadata

When a non-English locale is selected and the new terminal panel is opened, these newly added terminal.* strings render in English because the locale bundles contain the English source text instead of real translations. The corresponding .i18n/*.meta.json files also report fallbackKeys: [], so the new metadata-only fallback test will pass while users in Arabic/German/etc. still see English terminal controls; regenerate or mark the actual fallbacks before shipping.

Useful? React with 👍 / 👎.

@openclaw-mantis

Copy link
Copy Markdown
Contributor

Mantis Telegram Desktop Proof

Summary: Mantis captured native Telegram Desktop before/after GIFs for oversized document handling.

Main screenshot This PR screenshot
Baseline native Telegram Desktop screenshot Candidate native Telegram Desktop screenshot
Main This PR
Baseline native Telegram Desktop proof GIF Candidate native Telegram Desktop proof GIF

Motion-trimmed clips:

Raw QA files: https://artifacts.openclaw.ai/mantis/telegram-desktop/pr-100040/run-28716540169-1/index.json

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 07d8062f03

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +43 to +44
if (context.existingEntry.sessionId !== params.initialEntry.sessionId) {
return null;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Do not adopt rows skipped by the session-id guard

When the persisted row's sessionId no longer matches initialEntry.sessionId, this returns null, but the underlying session accessor treats a null patch as “skip saving” and returns the current existing row. That means a turn whose snapshot was rejected after a session reset/rotation is reported to callers as successfully persisted with the replacement row, so later cleanup/delivery code can adopt and mutate metadata for the new session instead of treating the write as stale. Track this mismatch like a rejected guard and return undefined/a stale-session error rather than the replacement entry.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling app: ios App: ios app: macos App: macos app: web-ui App: web-ui channel: discord Channel integration: discord channel: feishu Channel integration: feishu channel: googlechat Channel integration: googlechat channel: imessage Channel integration: imessage channel: line Channel integration: line channel: matrix Channel integration: matrix channel: msteams Channel integration: msteams channel: nostr Channel integration: nostr channel: qa-channel Channel integration: qa-channel channel: qqbot channel: slack Channel integration: slack channel: telegram Channel integration: telegram channel: tlon Channel integration: tlon channel: twitch Channel integration: twitch channel: voice-call Channel integration: voice-call channel: whatsapp-web Channel integration: whatsapp-web channel: zalouser Channel integration: zalouser cli CLI command changes commands Command implementations dependencies-changed PR changes dependency-related files docs Improvements or additions to documentation extensions: acpx extensions: amazon-bedrock extensions: anthropic-vertex extensions: byteplus extensions: codex extensions: codex-supervisor Extension: codex-supervisor extensions: copilot extensions: diagnostics-otel Extension: diagnostics-otel extensions: diffs extensions: firecrawl extensions: github-copilot extensions: google extensions: llama-cpp extensions: llm-task Extension: llm-task extensions: lobster Extension: lobster extensions: memory-core Extension: memory-core extensions: memory-lancedb Extension: memory-lancedb extensions: memory-wiki extensions: oc-path extensions: ollama extensions: qa-lab extensions: tavily extensions: volcengine extensions: xai gateway Gateway runtime maintainer Maintainer-authored PR P3 Low-priority cleanup, docs, polish, ergonomics, or speculative work. plugin: file-transfer plugin: google-meet plugin: workboard rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. scripts Repository scripts security Security documentation size: XL status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant