[codex] Localize canvas text labels#1322
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
✅ Mock-LLM E2E Tests53/53 passed Commit:
Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses) |
🔶 Mock-LLM Docker E2E Test Results48/53 passed · 5 skipped Commit:
Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses) |
|
🤖 OpenHands is reviewing this PR. Trigger label: This comment was posted by an AI agent (OpenHands). |
|
Thanks for localizing these remaining labels. I didn’t see security concerns, and the added translation keys look complete across locales. One blocking correctness/build issue:
The snapshot bot also reports changed/crashed snapshot results, but those appear CI/process-related rather than a direct code issue from this diff. No additional tests seem necessary for these label-only changes once the type/a11y forwarding issue is fixed. 🔄 CHANGES REQUESTED This comment was posted by an AI agent (OpenHands). |
6b2ae0c to
dfd9e57
Compare
✅ Mock-LLM E2E Tests53/53 passed Commit:
Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses) |
📸 Snapshot Test ReportWarning Snapshot comparison step crashed (timeout, OOM, or runner error) — diff results below may be incomplete or absent. Warning One or more snapshot tests crashed during generation — some snapshots below may be incomplete. ❌ 3 snapshots differ from the main branch baselines. Add the
🔴 Changed snapshots (3)
|
| Expected (main) | Actual (PR) | Diff |
|---|---|---|
![]() |
![]() |
![]() |
settings-page — 2 snapshots
analytics-consent-modal
| Expected (main) | Actual (PR) | Diff |
|---|---|---|
![]() |
![]() |
![]() |
settings-app-page
| Expected (main) | Actual (PR) | Diff |
|---|---|---|
![]() |
![]() |
![]() |
✅ Unchanged snapshots (71)
archived-conversation
- conversation-panel-with-archived-badges
- conversation-view-archived
- conversation-view-sandbox-error
automations
- automations-delete-modal
- automations-list-active-inactive
- automations-no-automations
- automations-search-no-results
backends-extended
- backend-add-blank-disabled
- backend-add-cloud-advanced-open
- backend-add-cloud-no-key-disabled
- backend-add-cloud-with-key-enabled
- backend-add-form-partially-filled
- backend-add-invalid-url-disabled
- backend-add-local-ready
- backend-add-name-only-disabled
- backend-add-two-column-layout
- backend-add-whitespace-host-disabled
- backend-after-switch
- backend-cancel-nothing-saved
- backend-edit-prefilled
- backend-manage-after-removal
- backend-manage-two-listed
- backend-remove-cancelled
- backend-remove-confirmation
- backend-switch-overlay
backends
- backend-add-modal
- backend-manage-modal
- backend-selector-open
changes-tab
- changes-deleted-file
- changes-diff-viewer
- changes-empty
collapsible-thinking
- reasoning-content-collapsed
- reasoning-content-expanded
- think-action-collapsed
- think-action-expanded
mcp-page
- mcp-custom-server-1-editor-open
- mcp-custom-server-2-url-filled
- mcp-custom-server-3-all-filled
- mcp-custom-server-4-installed
- mcp-custom-server-editor
- mcp-empty-installed
- mcp-search-filtered
- mcp-slack-install-1-marketplace
- mcp-slack-install-2-modal
- mcp-slack-install-3-filled
- mcp-slack-install-4-installed
onboarding
- onboarding-step-0-check-backend
- onboarding-step-1-choose-agent
- onboarding-step-2-setup-llm
- onboarding-step-3-say-hello
projects-workspace-browser
- projects-workspace-browser
settings-page
- add-backend-modal
- home-screen
- settings-page
settings-secrets
- secrets-add-form-filled
- secrets-add-form
- secrets-after-save
- secrets-delete-confirm
- secrets-list
settings-verification
- condenser-settings
- verification-settings-critic-enabled
- verification-settings-off
- verification-settings-on
sidebar
- sidebar-collapsed
- sidebar-conversation-panel
- sidebar-filter-menu
skills-page
- skills-empty
- skills-loaded
- skills-no-match
- skills-search-filtered
- skills-type-filter
Generated by the Snapshot Tests workflow. This comment was created by an AI agent (OpenHands) on behalf of the repo maintainers.
🔶 Mock-LLM Docker E2E Test Results48/53 passed · 5 skipped Commit:
Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses) |
|
| Status | Test | Duration |
|---|
Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses)
🛑 Mock-LLM E2E Tests18/18 passed · Commit:
Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses) |
✅ Mock-LLM E2E Tests53/53 passed Commit:
Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses) |
🛑 Mock-LLM Docker E2E Test Results38/43 passed · 5 skipped · Commit:
Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses) |
|
🔍 Review in progress… We are performing the review through OpenHands Cloud Automation. You can log in and view the conversation here. |
✅ Mock-LLM E2E Tests53/53 passed Commit:
Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses) |
🛑 Mock-LLM Docker E2E Test Results33/35 passed · 2 skipped · Commit:
Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses) |
|
Addressed the AI review issue in b2ae57b by replacing the nested Typography.Text shortcut marker with a native span so aria-hidden is applied to the DOM. Local validation: |
✅ Mock-LLM E2E Tests53/53 passed Commit:
Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses) |
🔶 Mock-LLM Docker E2E Test Results48/53 passed · 5 skipped Commit:
Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses) |
✅ Mock-LLM E2E Tests53/53 passed Commit:
Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses) |
🔶 Mock-LLM Docker E2E Test Results48/53 passed · 5 skipped Commit:
Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses) |
✅ Mock-LLM E2E Tests53/53 passed Commit:
Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses) |
🔶 Mock-LLM Docker E2E Test Results48/53 passed · 5 skipped Commit:
Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses) |
|
✅ Review complete. This review was performed through OpenHands Cloud Automation. You can log in and view the conversation here. |
all-hands-bot
left a comment
There was a problem hiding this comment.
Code Review Summary
🟢 Good taste - Clean localization implementation with no blocking issues.
Overview
This PR adds i18n support for aria-labels, placeholders, and file validation error messages across the codebase. The changes are well-structured and comprehensive with 14-language translation coverage.
Analysis
Previous Review Follow-up:
The blocking issue from the previous review (passing aria-hidden to Typography.Text) has been correctly resolved. The shortcut label now uses a native <span> element with aria-hidden="true" in both plan-preview.tsx and conversation-tabs.tsx. ✅
Data Structure Quality:
The formatFileValidationError function in file-validation.ts is well-designed - it properly falls back to the raw error message when no i18n key is present, ensuring backward compatibility with any existing validation results that don't use the new error key system.
Consistency:
The build shortcut label extraction (String.fromCharCode(0x2318, 0x21a9)) is consistent across both files that use it, reducing duplication.
Translation Completeness:
All new translation keys have comprehensive 14-language coverage including: en, ja, zh-CN, zh-TW, ko-KR, no, it, pt, es, ar, fr, tr, de, uk, ca.
Minor Observations:
- The
eslint-disable i18next/no-literal-stringcomment removal is appropriate since the literal is no longer present in that file - The removed comment in
conversation-tabs.tsxwas also correctly removed when the hardcoded text was replaced
Testing
E2E test results: 53/53 passed ✅
[RISK ASSESSMENT]
- [Overall PR]
⚠️ Risk Assessment: 🟢 LOW
This PR consists entirely of localization changes with no functional logic modifications, no breaking API changes, and comprehensive test coverage passing.
VERDICT:
✅ Worth merging - The localization implementation is clean, consistent, and addresses all previous feedback.
KEY INSIGHT:
The formatFileValidationError helper demonstrates good defensive programming with a fallback pattern that prevents runtime errors if any validation results lack an error key.
This review was generated by an AI agent (OpenHands) on behalf of the user through OpenHands Automation. View conversation
✅ Mock-LLM E2E Tests53/53 passed Commit:
Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses) |
🔶 Mock-LLM Docker E2E Test Results48/53 passed · 5 skipped Commit:
Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses) |









HUMAN:
Graham asked to move this clean, green, AI-approved PR out of draft for review.
AGENT:
Why
This PR is ready for review after the user requested human verification and the automated checks plus AI review passed. The original motivation and details are preserved below.
Summary
/goal Make sure that all textual elements in the canvas are properly localized.
This PR localizes canvas-facing text that was still hardcoded in components, including dropdown/menu accessibility labels, chat loading labels, planner build controls, settings/sidebar/home labels, backend form placeholders, secret-form validation text, session-expired and branch-load errors, and chat attachment validation/processing errors.
It also removes a broad i18next lint suppression from the plan preview by keeping the keyboard shortcut glyph non-translatable and hidden from assistive text while the button label stays localized.
Audit notes
npx,KEY=value,user/repo, localhost, and API-key examples.new Error(...)scan hits are internal guard/developer errors rather than ordinary rendered UI labels or accessibility text.Validation
npm run check-translation-completenessnpm run lintnpm run build🐳 Docker images for this PR
• GHCR package: https://github.com/OpenHands/agent-canvas/pkgs/container/agent-canvas
ghcr.io/openhands/agent-canvasghcr.io/openhands/agent-server:1.28.1-pythonopenhands-automation==1.0.0a97637c8071f7daf3c9b96aa990d036cbe5b15afa9Pull (multi-arch manifest)
# Multi-arch manifest — Docker automatically pulls the correct architecture docker pull ghcr.io/openhands/agent-canvas:sha-7637c80Run
All tags pushed for this build
About Multi-Architecture Support
sha-7637c80) is a multi-arch manifest supporting both amd64 and arm64sha-7637c80-amd64) are also available if neededIssue
Fixes #1326
How to Test