Skip to content

fix(webui): localize v2 tools and extensions copy - #5401

Merged
italic-jinxin merged 5 commits into
mainfrom
fix-webui-i18n-missing
Jun 30, 2026
Merged

italic-jinxin merged 5 commits into
mainfrom
fix-webui-i18n-missing

Conversation

@italic-jinxin

Copy link
Copy Markdown
Contributor

Summary

  • Localizes WebUI v2 extension-card, configure-modal, registry, built-in channel, and action-result copy that previously rendered hardcoded English.
  • Adds localized descriptions for built-in builtin.* tools in the Settings > Tools permission list, including Trace Commons, memory, file, shell, skill, and trigger capabilities.
  • Keeps tool filtering compatible with both localized descriptions and the original backend-provided English descriptions.
  • Adds JS regression coverage for localized tool descriptions and updates extension tests to assert translated labels instead of hardcoded English.

Validation

  • node --test crates/ironclaw_webui_v2_static/static/js/pages/extensions/components/extension-card.test.mjs crates/ironclaw_webui_v2_static/static/js/pages/extensions/components/channels-tab.test.mjs crates/ironclaw_webui_v2_static/static/js/pages/extensions/hooks/useExtensions-catalog.test.mjs crates/ironclaw_webui_v2_static/static/js/pages/extensions/hooks/useExtensions-pairing.test.mjs crates/ironclaw_webui_v2_static/static/js/pages/settings/components/tools-tab.test.mjs
  • node crates/ironclaw_webui_v2_static/frontend/build.mjs
  • cargo test -p ironclaw_webui_v2_static
  • git diff --check

Security Impact

No. UI-only localization changes; no auth, approval, network, secret, or execution behavior changes.

Database Impact

No schema or migration changes.

Blast Radius

Limited to crates/ironclaw_webui_v2_static static WebUI v2 copy, locale packs, and focused JS tests.

Rollback Plan

Revert this PR to restore the previous backend-provided English descriptions and hardcoded WebUI v2 extension copy.


Review track: C

@italic-jinxin italic-jinxin added size: XL 500+ changed lines risk: low Changes to docs, tests, or low-risk modules contributor: core 20+ merged PRs labels Jun 29, 2026
@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-5401 June 29, 2026 09:52 Destroyed
@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-5401 June 29, 2026 09:52 Destroyed
@italic-jinxin

Copy link
Copy Markdown
Contributor Author

@claude review

@coderabbitai

coderabbitai Bot commented Jun 29, 2026 •

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@italic-jinxin, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 4 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 6b96af9f-8178-49ed-b99d-c93bd2dfd657

📥 Commits

Reviewing files that changed from the base of the PR and between 116efc5 and 7389e4f.

📒 Files selected for processing (10)
  • crates/ironclaw_webui_v2_static/static/js/i18n/ar.js
  • crates/ironclaw_webui_v2_static/static/js/i18n/de.js
  • crates/ironclaw_webui_v2_static/static/js/i18n/es.js
  • crates/ironclaw_webui_v2_static/static/js/i18n/fr.js
  • crates/ironclaw_webui_v2_static/static/js/i18n/hi.js
  • crates/ironclaw_webui_v2_static/static/js/i18n/ja.js
  • crates/ironclaw_webui_v2_static/static/js/i18n/ko.js
  • crates/ironclaw_webui_v2_static/static/js/i18n/pt-BR.js
  • crates/ironclaw_webui_v2_static/static/js/i18n/uk.js
  • crates/ironclaw_webui_v2_static/static/js/lib/i18n.test.mjs
📝 Walkthrough

Walkthrough

Adds new tools.description.builtin.* and extensions.* strings to 11 locale packs, switches extension UI text to t(...), and makes the tools tab render/search against translated descriptions. Tests add translation mocks and assert the localized labels and search behavior.

Changes

i18n keys and UI localization

Layer / File(s) Summary
Locale translation entries
crates/ironclaw_webui_v2_static/static/js/i18n/en.js, crates/ironclaw_webui_v2_static/static/js/i18n/ar.js, crates/ironclaw_webui_v2_static/static/js/i18n/de.js, crates/ironclaw_webui_v2_static/static/js/i18n/es.js, crates/ironclaw_webui_v2_static/static/js/i18n/fr.js, crates/ironclaw_webui_v2_static/static/js/i18n/hi.js, crates/ironclaw_webui_v2_static/static/js/i18n/ja.js, crates/ironclaw_webui_v2_static/static/js/i18n/ko.js, crates/ironclaw_webui_v2_static/static/js/i18n/pt-BR.js, crates/ironclaw_webui_v2_static/static/js/i18n/uk.js, crates/ironclaw_webui_v2_static/static/js/i18n/zh-CN.js
Adds tools.description.builtin.* and extensions.* entries for built-in tool text, extension lifecycle labels, auth/config prompts, and success/failure messages.
Extension UI localization
crates/ironclaw_webui_v2_static/static/js/pages/extensions/hooks/useExtensions.js, crates/ironclaw_webui_v2_static/static/js/pages/extensions/components/extension-card.js, crates/ironclaw_webui_v2_static/static/js/pages/extensions/components/configure-modal.js, crates/ironclaw_webui_v2_static/static/js/pages/extensions/components/channels-tab.js
Uses useT/t(...) for install, activate, remove, setup, reconfigure, no-capabilities, auth, and channel-row strings instead of hardcoded English text and fallbacks.
Tools tab translated descriptions
crates/ironclaw_webui_v2_static/static/js/pages/settings/components/tools-tab.js
Adds translated description lookup, renders translated tool descriptions, and includes them in search matching.
Test updates
crates/ironclaw_webui_v2_static/static/js/pages/extensions/components/extension-card.test.mjs, crates/ironclaw_webui_v2_static/static/js/pages/extensions/hooks/useExtensions-catalog.test.mjs, crates/ironclaw_webui_v2_static/static/js/pages/extensions/hooks/useExtensions-pairing.test.mjs, crates/ironclaw_webui_v2_static/static/js/pages/settings/components/tools-tab.test.mjs
Mocks useT and related helpers, updates action-label expectations, and adds coverage for translated tool descriptions and search behavior.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • nearai/ironclaw#4778: Touches channels-tab.js and related channel/extension translation keys on the same UI surface.
  • nearai/ironclaw#4900: Shares the useExtensions.js action-result flow updated here.
  • nearai/ironclaw#4909: Also changes ConfigureModal and extension i18n strings in the same modal flow.

Suggested reviewers

  • serrrfirat
  • think-in-universe

Poem

Eleven tongues now share one key,
and labels shed their fallback plea.
Tools now speak in translated form,
while extension flows stay neat and warm.
A search that hears the local tune 🎵

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title uses Conventional Commits style and accurately summarizes the localization change.
Description check ✅ Passed It covers summary, validation, security, database, blast radius, and rollback; only some template sections are omitted.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix-webui-i18n-missing

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

gemini-code-assist[bot]

This comment was marked as resolved.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/ironclaw_webui_v2_static/static/js/i18n/hi.js`:
- Line 521: The Hindi translation for tools.description.builtin.trigger_pause
contains an Arabic word (محفوظ) that should be replaced with a proper Hindi
equivalent. Update the string in hi.js to use a natural Hindi phrase such as
बनाए रखा or सुरक्षित, keeping the rest of the translation intact and ensuring
the sentence remains fluent for Hindi readers.

In
`@crates/ironclaw_webui_v2_static/static/js/pages/settings/components/tools-tab.js`:
- Around line 11-15: The translatedToolDescription helper is returning an empty
string too early when tool.description is missing, which hides valid localized
text. Remove the initial tool.description guard in translatedToolDescription and
always try the tools.description.${tool.name} lookup first, falling back to
tool.description only if the translation is missing or unchanged; keep the
existing behavior in the tools-tab row copy and translated-search path by
relying on this helper’s translation-first flow.
- Around line 231-242: The search filter in tools-tab.js is incorrectly treating
every locked tool as “disabled” by using tool.locked ? t("tools.disabled") : ""
inside the matchesSearch array. Update the filtering logic in the filtered tools
callback so locked status is not indexed as the disabled label, and instead rely
on the actual tool.state/tool.default_state/tool.effective_source fields (and
any explicit disabled state text) to determine search matches. Keep the change
localized to the filter in the tools-tab component so locked-but-enabled tools
no longer match searches for “disabled”.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: ce154bd2-ff3f-4a5c-aa66-70ef85afb413

📥 Commits

Reviewing files that changed from the base of the PR and between fbf3a2e and f0fb497.

📒 Files selected for processing (20)
  • crates/ironclaw_webui_v2_static/static/js/i18n/ar.js
  • crates/ironclaw_webui_v2_static/static/js/i18n/de.js
  • crates/ironclaw_webui_v2_static/static/js/i18n/en.js
  • crates/ironclaw_webui_v2_static/static/js/i18n/es.js
  • crates/ironclaw_webui_v2_static/static/js/i18n/fr.js
  • crates/ironclaw_webui_v2_static/static/js/i18n/hi.js
  • crates/ironclaw_webui_v2_static/static/js/i18n/ja.js
  • crates/ironclaw_webui_v2_static/static/js/i18n/ko.js
  • crates/ironclaw_webui_v2_static/static/js/i18n/pt-BR.js
  • crates/ironclaw_webui_v2_static/static/js/i18n/uk.js
  • crates/ironclaw_webui_v2_static/static/js/i18n/zh-CN.js
  • crates/ironclaw_webui_v2_static/static/js/pages/extensions/components/channels-tab.js
  • crates/ironclaw_webui_v2_static/static/js/pages/extensions/components/configure-modal.js
  • crates/ironclaw_webui_v2_static/static/js/pages/extensions/components/extension-card.js
  • crates/ironclaw_webui_v2_static/static/js/pages/extensions/components/extension-card.test.mjs
  • crates/ironclaw_webui_v2_static/static/js/pages/extensions/hooks/useExtensions-catalog.test.mjs
  • crates/ironclaw_webui_v2_static/static/js/pages/extensions/hooks/useExtensions-pairing.test.mjs
  • crates/ironclaw_webui_v2_static/static/js/pages/extensions/hooks/useExtensions.js
  • crates/ironclaw_webui_v2_static/static/js/pages/settings/components/tools-tab.js
  • crates/ironclaw_webui_v2_static/static/js/pages/settings/components/tools-tab.test.mjs

Comment thread crates/ironclaw_webui_v2_static/static/js/i18n/hi.js Outdated
Comment thread crates/ironclaw_webui_v2_static/static/js/pages/settings/components/tools-tab.js Outdated
@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-5401 June 29, 2026 10:09 Destroyed
@railway-app

railway-app Bot commented Jun 29, 2026 •

Copy link
Copy Markdown

🚅 Deployed to the ironclaw-pr-5401 environment in ironclaw-ci-preview

Service Status Web Updated (UTC)
ironclaw ✅ Success (View Logs) Web Jun 29, 2026 at 10:43 am

@italic-jinxin italic-jinxin self-assigned this Jun 29, 2026
@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-5401 June 29, 2026 10:29 Destroyed
@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-5401 June 29, 2026 10:34 Destroyed
@italic-jinxin italic-jinxin added the human-verified Manually tested and verified label Jun 29, 2026
@think-in-universe
think-in-universe added this pull request to the merge queue Jun 29, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Jun 29, 2026
@italic-jinxin
italic-jinxin added this pull request to the merge queue Jun 30, 2026
Merged via the queue into main with commit 03136c7 Jun 30, 2026
106 checks passed
@italic-jinxin
italic-jinxin deleted the fix-webui-i18n-missing branch June 30, 2026 02:14

This branch was successfully deployed

No deployments
ironclaw-ci-preview / ironclaw-pr-5401 — 7389e4fd Deployed Jun 29, 2026 by railway-app[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

contributor: core 20+ merged PRs human-verified Manually tested and verified risk: low Changes to docs, tests, or low-risk modules size: XL 500+ changed lines

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants