Skip to content

feat(desktop-gpui): localize the editor shell, export dialog, clips, timeline and editor tabs - #3428

Merged
richiemcilroy merged 91 commits into
mainfrom
i18n/editor-shell
Oct 28, 2026
Merged

richiemcilroy merged 91 commits into
mainfrom
i18n/editor-shell

Conversation

@richiemcilroy

@richiemcilroy richiemcilroy commented Oct 26, 2026 •

Copy link
Copy Markdown
Member

Localizes the GPUI editor shell so a non-English system no longer sees English in the editor once the language picker ships in 0.6.2.

What was converted

545 new catalog keys under editor.window.*, editor.export.*, editor.clips.*, editor.timeline.*, editor.tabs.*, editor.canvas.*, editor.modal.* and ui.*, with translations in all six catalogs (zh-CN, ja, fr, es, de, hi) that follow GLOSSARY.md.

  • Editor window (editor_window.rs, editor_window/): header and toolbar buttons and tooltips, aspect ratio and preview quality labels, transport tooltips, the clip and text context menus, presets menu and dialogs, the add-track popover, zoom and 3D lane prompts, frame picker, the "could not be opened" screen and its preflight errors, deletion and close blockers, title save errors, audio and image import errors, and the file dialog filter names.
  • Export dialog (editor_export.rs): every section, segmented option, toggle, stat, progress heading, completion state, the cancel and resource confirmations, upload failure dialogs, and the size and time estimates. Estimates keep their numeric formatting; only the units and the ~ and < wording come from the catalog.
  • Clips (editor_clips.rs): the sidebar, import menu, rfd filter names, the import and append error dialogs (titles and bodies), the clip and split default names, and the user-facing import errors.
  • Timeline (editor_timeline.rs): track names, track picker descriptions, the remove-track hints, empty lanes, segment labels, scene modes and badges.
  • Editor tabs (editor_tabs.rs): the camera, audio, cursor, keyboard, captions and sync tabs, including every menu catalogue (shapes, blur modes, corner styles, stereo modes, cursor styles, weights, positions, caption animations, highlight styles, caption languages, caption models and presets).
  • Canvas, modal and ui helpers: canvas selection labels and lock hints, the export cancel modal, the "Recording retained" alert, SelectionHeader and the Coming Soon tooltip.

The selection header used to build "{count} {noun} segment{s} selected". It is now one plural message per noun (ui.selection.*), and the zoom header's All {count} / {count} of {total} / {count} forms are plural messages too. selection_label still takes the same noun strings, so editor_panels.rs is untouched. "Remove the {track} track." is now one message per track (TrackKind::picker_remove) instead of a sentence wrapped around a translated label.

The const catalogues hold fn() -> &'static str instead of &str, so a label is read in the current language each time a menu or row is drawn. The timeline model keeps placeholder names (untitled text, caption and audio segments, clip numbers, mask kinds), so EditorWindow rebuilds it when the language changes. The frame title and preset name placeholders are set on render rather than once at creation.

Left in English on purpose

  • "Export cancelled" and the other control-flow comparisons in editor_export.rs.
  • Clock and duration formatters (format_time, format_clip_time, format_duration, slider readouts in ms and s).
  • Font family names (FONT_OPTIONS), keyboard key names (kbd.rs, Space, Esc), product names (Cap, Studio, Instant, Studio Sound, the PRO badge), OS names in the frame picker (macOS, Windows, MacBook), format names (MP4, GIF, 720p, 4K) and model engine names.
  • Persisted values: the Cap Recording export file name fallback, the Audio name stored on imported audio segments, export prefs.
  • Internal and technical errors that only reach logs or wrap engine text: thumbnail decode, ffmpeg probing, metadata save, the preparing pipeline, and the disk check messages built in cap_utils::export_resources, which Tauri shares.
  • The Make it pop caption preset preview words.

Layout

Segmented controls that stretch (the export dialog's destination and quality rows) now truncate their labels instead of overflowing, and the export stats card truncates its labels. English fits as before, so nothing moves for English.

How English was proven unchanged

  • src/i18n/editor_shell_surface_tests.rs pins every plain key to the literal it replaced (484 pairs, counted against the catalog so a new key without a pair fails) and checks every parameterized message against the format! it replaced, with plural cases 0, 1, 2 and 5. It also checks the per-noun selection labels and the remove-track hints against the old assembled sentences.
  • editor_export.rs gained a test that pins format_estimate_range output.
  • Every plain English value was checked against the literals in the pre-change sources; the only values not found verbatim are the derived ones covered by the tests above.
  • src/i18n/tests.rs gets one filter line so these keys are counted by the new test file instead.

CI

CI run 40383143384 on 92f1aac is green: GPUI builds and cap-gpui tests on macOS (arm64 and Intel), Windows and Linux, cap-i18n-build tests, Format (Cargo), Typecheck and Biome. The root-workspace Clippy and Rust test jobs are skipped by path filters because no root crate changed.

RetriggerView in GreptileConfidence Score: 5/5

The changes since the previous review appear safe to merge.

Summary

Localizes the GPUI editor, export dialog, clips, timeline, and tabs, with translated catalogs and English text checks.

  • Editor controls and timelines show labels in the selected language.
  • More app screens and native menus follow the selected language.

Reviews (3) · Last reviewed commit: "fix(desktop-gpui): translate the look na..." · Reviewed by Greptile

Move the Cap menu onto AppKit: the model in `menus.rs` gains Check for
Update, Preferences…, Help destinations, Open File… and Import Media…, and
`platform.rs` patches the standard items after gpui installs the bar —
About becomes `orderFrontStandardAboutPanel:` (the gpui action and its
panel plumbing are gone), autoenables is off so the model owns the enabled
state, and the File menu gets the NSDocumentController-backed Open Recent
list fed by `add_recent_document` on every editor open.

Check for Update resolves to three states (check / download / restart)
and is now rewritten in the live `NSMenuItem` by row position rather than
reinstalling the menu bar, so an open menu survives a status change; the
version and the macOS download percentage ride an `NSMenuItemBadge` on
macOS 14+, and the other platforms only rebuild when the state changes.

Bumps the app to objc2 0.6.5 / objc2-app-kit 0.3.2 / block2 0.6 and
migrates the native code to those bindings.
Give the tray its own AppKit menu: a mode picker (the current mode as a
section header with the mode icons on macOS 14+, the ✓-ticked Recording
Mode submenu on older macOS and on Windows), record/take-screenshot rows,
Previous ▸ with cover-cropped thumbnails, Import Media…, Settings and
Upload Logs, plus the version and the SF Symbols for each row.

The Previous thumbnails reuse the Recents thumbnail cache for JPEG
sources instead of decoding full-resolution originals, which is what the
warm-scan tests cover, and the header follows the palette's highlighted
row in italic.
Fix the tray row's Settings glyph (`gear`, not `gearshape`) and the macOS
26 window symbol, document the File menu (Open File…, Import Media…, Open
Recent), the Help destinations and the live update row.
# Conflicts:
#	.github/workflows/ci.yml
#	apps/chrome-extension/src/offscreen/recorder.test.ts
#	apps/desktop-gpui/kernels/Cargo.toml
#	apps/desktop-gpui/kernels/src/thumbnail.rs
#	apps/desktop-gpui/src/app_windows.rs
#	apps/desktop-gpui/src/camera_blur_portable.rs
#	apps/desktop-gpui/src/controls_window.rs
#	apps/desktop-gpui/src/editor_edits.rs
#	apps/desktop-gpui/src/editor_window.rs
#	apps/desktop-gpui/src/library.rs
#	apps/desktop-gpui/src/main.rs
#	apps/desktop-gpui/src/main_window.rs
#	apps/desktop-gpui/src/menus.rs
#	apps/desktop-gpui/src/mode_select_window.rs
#	apps/desktop-gpui/src/platform.rs
#	apps/desktop-gpui/src/settings_window.rs
#	apps/desktop-gpui/src/target_thumbnails.rs
#	apps/desktop-gpui/src/tray.rs
#	apps/media-server/src/__tests__/lib/media-routes-real-world.integration.test.ts
#	apps/media-server/src/__tests__/lib/recording-verification.integration.test.ts
#	apps/media-server/src/__tests__/lib/storage-upload.test.ts
#	apps/media-server/src/__tests__/routes/lifecycle.test.ts
#	apps/media-server/src/lib/media-video.ts
#	apps/media-server/src/lib/recording-packet-proof.ts
#	apps/media-server/src/lib/recording-timing.ts
#	apps/media-server/src/routes/video.ts
#	apps/mobile/app/(tabs)/upload.tsx
#	apps/mobile/src/screens/dashboard-upload-visibility.test.tsx
#	apps/web/__tests__/unit/add-folder-videos.test.ts
#	apps/web/__tests__/unit/analytics-chart-dates.test.ts
#	apps/web/__tests__/unit/desktop-recording-source.test.ts
#	apps/web/__tests__/unit/finalize-desktop-recording.test.ts
#	apps/web/__tests__/unit/folder-access.test.ts
#	apps/web/__tests__/unit/loom-import-start.test.ts
#	apps/web/__tests__/unit/media-processing-workflows.test.ts
#	apps/web/__tests__/unit/media-server-progress.test.ts
#	apps/web/__tests__/unit/mobile-email-session.test.ts
#	apps/web/__tests__/unit/notification-read-state.test.ts
#	apps/web/__tests__/unit/s3-bucket-connections.test.ts
#	apps/web/__tests__/unit/segment-playlist-route.test.ts
#	apps/web/__tests__/unit/video-pipeline-recovery.test.ts
#	apps/web/__tests__/unit/video-processing-recovery.test.ts
#	apps/web/actions/folders/folder-access.ts
#	apps/web/actions/loom.ts
#	apps/web/actions/notifications/mark-as-read.ts
#	apps/web/actions/spaces/get-space-videos.ts
#	apps/web/app/(org)/dashboard/analytics/components/ChartArea.tsx
#	apps/web/app/s/[videoId]/_components/utils/parse-transcript-vtt.ts
#	apps/web/lib/desktop-recording-source-checkpoint.ts
#	apps/web/lib/desktop-recording-source.ts
#	apps/web/lib/loom-import-start.ts
#	apps/web/lib/loom-import-upload.ts
#	apps/web/lib/loom-media-dispatch.ts
#	apps/web/lib/video-pipeline-recovery.ts
#	apps/web/lib/video-processing-recovery.ts
#	apps/web/workflows/finalize-desktop-recording.ts
#	apps/web/workflows/import-loom-video.ts
#	crates/enc-ffmpeg/src/mux/ogg.rs
#	crates/enc-ffmpeg/src/video/h264.rs
#	crates/enc-ffmpeg/src/video/h264_packet.rs
#	crates/enc-ffmpeg/src/video/packed_yuv.rs
#	crates/project/src/caption_timing/projection_tests.rs
#	crates/project/src/configuration.rs
#	crates/project/src/configuration/style_resolution_tests.rs
#	crates/recording/src/instant_recording/linux_camera.rs
#	crates/recording/src/screenshot.rs
#	crates/rendering/src/frame_pipeline.rs
#	crates/rendering/src/lib.rs
#	crates/scap-targets/src/platform/linux.rs
#	packages/database/types/metadata.ts
#	packages/sdk-recorder/__tests__/recorder-options.test.ts
#	packages/sdk-recorder/src/index.ts
#	packages/web-backend/src/S3Buckets/S3ConnectionPool.ts
#	scripts/prepare-gpui-dependency.sh
#	scripts/prepare-gpui-dependency.test.mjs

@capy-ai capy-ai 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.

Capy found no issues.

View 2 other findings in Capy.

Open in Capy

@vercel

vercel Bot commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
cap-status Ready Ready Preview Oct 26, 2026 10:21pm UTC

@capy-ai capy-ai 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.

Capy found no issues.

Open in Capy

@richiemcilroy

Copy link
Copy Markdown
Member Author

@greptileai review

Comment thread apps/desktop-gpui/src/library.rs
Comment thread apps/desktop-gpui/src/menus.rs
Comment thread apps/desktop-gpui/src/editor_timeline.rs
Comment thread apps/desktop-gpui/src/editor_tabs.rs

@capy-ai capy-ai 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.

Capy found no issues.

Open in Capy

@richiemcilroy

Copy link
Copy Markdown
Member Author

@greptileai review

This branch was successfully deployed

2 active deployments
Preview – cap-web — ab36da51 Deployed Oct 26, 2026 by vercel[bot]
Preview – cap-status — ab36da51 Deployed Oct 26, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants