Repository navigation
feat(desktop-gpui): localize the editor shell, export dialog, clips, timeline and editor tabs - #3428
Merged
Merged
Conversation
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.
…om mode picker view
# 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
…timeline and editor tabs
Update app and tray menus for macOS
Contributor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Member
Author
|
@greptileai review |
Member
Author
|
@greptileai review |
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.*andui.*, with translations in all six catalogs (zh-CN, ja, fr, es, de, hi) that followGLOSSARY.md.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.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.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.editor_timeline.rs): track names, track picker descriptions, the remove-track hints, empty lanes, segment labels, scene modes and badges.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).SelectionHeaderand theComing Soontooltip.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'sAll {count}/{count} of {total}/{count}forms are plural messages too.selection_labelstill takes the same noun strings, soeditor_panels.rsis 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 strinstead 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), soEditorWindowrebuilds 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 ineditor_export.rs.format_time,format_clip_time,format_duration, slider readouts in ms and s).FONT_OPTIONS), keyboard key names (kbd.rs,Space,Esc), product names (Cap, Studio, Instant, Studio Sound, thePRObadge), OS names in the frame picker (macOS, Windows, MacBook), format names (MP4, GIF, 720p, 4K) and model engine names.Cap Recordingexport file name fallback, theAudioname stored on imported audio segments, export prefs.cap_utils::export_resources, which Tauri shares.Make it popcaption 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.rspins 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 theformat!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.rsgained a test that pinsformat_estimate_rangeoutput.src/i18n/tests.rsgets 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-gpuitests on macOS (arm64 and Intel), Windows and Linux,cap-i18n-buildtests, Format (Cargo), Typecheck and Biome. The root-workspace Clippy and Rust test jobs are skipped by path filters because no root crate changed.

Confidence 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.
Reviews (3) · Last reviewed commit: "fix(desktop-gpui): translate the look na..." · Reviewed by Greptile