Repository navigation
feat(desktop-gpui): localize the screenshot editor, overlays and dialogs - #3423
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
perf(linux-camera): copy frames once
Contributor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Member
Author
|
@greptileai review |
Update app and tray menus for macOS
Member
Author
|
@greptileai review |
Member
Author
|
@greptileai review |
This was referenced Oct 27, 2026
feat(desktop-gpui): resize a picked window to a ratio or size, and focus it to record it alone
#3454
Merged
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 surfaces outside settings and the editor so they follow the UI language once the language picker ships in release builds.
What changed
278 new catalog keys, each in
en.tomland in all six translations (zh-CN, ja, fr, es, de, hi), underscreenshot_editor.*,overlay.*,dialog.*,permission.*,diagnostics.*,transcription.*,upload.*,import.*andauth.*. No existing key was renamed; existingmain.*,common.*andsettings.*keys are reused where the English already matched (device pills, countdown options, mode headers, delete confirmations).Converted surfaces:
Layout: labels that can grow in translation now truncate (background tabs, onboarding checklist rows, the overlay start label, teleprompter toggles). English renders the same.
Deliberately left in English
classify_start_failure),"access is unavailable"(camera window), cleanup errors checked byvisible_fallback_allowed, the controls' disk-space errors, the diagnostics cancel sentinel,IMPORT_CANCELLED, and the caption error inputs.last_error, the instant cleanup crash message, default project names ("Imported Video", "Screenshot").{error}, logs, ids (element ids built from labels now use separate English ids), window titles, key names.installer.rserrors, which reach the user throughupdates.rs; that file is being rewritten in Update app and tray menus for macOS #2987 and is left for after it merges.How English was proven unchanged
src/i18n/dialogs_surface_tests.rsasserts every plain key against the literal it replaced, counts the keys so a new one cannot skip the check, and formats every parameterized message against theformat!it replaced. The diagnostics stage labels are compared against a copy of the old function for every stage and mode.tests.rsgets one filter line so its own key count ignores these prefixes.CI
All CI jobs pass on the branch (run 40381205689): GPUI build and tests on macOS arm64, macOS x86_64, Windows and Linux, Format (Cargo), Format and Lint (Biome), Typecheck. The new tests ran on all four GPUI targets.


Confidence Score: 5/5
The PR appears safe to merge; no new actionable issue was established.Summary
The PR expands localization across screenshot editing, capture overlays, permissions, dialogs, settings, and background-task messages.
Previous threads:
display_name(), addressing the earlier English-only labels.richiemcilroyaccepted the direct display-capture behavior as intentional because the tray row matches its advertised shortcut.richiemcilroyacknowledged the busy-download menu issue, stated that it came from main, and reported its fix in feat(desktop-gpui): enable the language picker in release builds #3434.Validation was based on source inspection. No build, runtime test, or native UI capture was performed.
Reviews (4) · Last reviewed commit: "Merge dialogs i18n" · Reviewed by Greptile