Repository navigation
feat(desktop-gpui): localize the settings window and pages - #3424
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
…c2 move changes it
…t waits for a recording
… text width calculation
…in the Ask first label
…lder in the screenshot editor
… Ask first and Auto
perf(linux-camera): copy frames once
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 every Settings page in the GPUI app so that, once the language picker ships in release builds, a non-English system no longer sees a half-English Settings window.
What changed
545 new
settings.*keys, translated into zh-CN, ja, fr, es, de and hi followinglocales/GLOSSARY.md.settings_window.rs: the sidebar (account row, update links, Sign In/Out/Cancel), the Recordings and Screenshots pages (import buttons, filter tabs, empty states, row tooltips, badges, delete and corrupted-recording dialogs), and the Recording quality page (Studio tiers, Instant resolution summaries, Sharing).settings_pages.rs: Shortcuts, CLI, Transcription, Experimental (including the dev-only switch-back overlay), Feedback, the Diagnostic Report, System Information, Changelog, Plan & license, Integrations (index, S3 and Google Drive), and Automations (triggers, actions, conditions, editor fields, templates).store.rs: the display labels of thesettings_enum!options. The stored JSON values are unchanged.UpdateChannelstays Stable/Nightly, as the glossary requires.Sentences rewritten as whole messages
effect.*, which completes the saved message, andsentence.*, the row description. Languages need different grammatical forms for the two uses.capcode span and the S3 sentence around the guide link use a{command}/{guide}placeholder. The code formats the message with a marker and splits it around the marker, so each language can put the element wherever its grammar needs.to_uppercase(), and scripts without letter case keep their normal text.Live language switching
fn() -> &'static str, so they resolve at render time, not at startup. This covers the Studio tiers, Instant summaries, outcome cards, S3 fields and provider, and the capture-target, clipboard and compression options.Deliberately left in English
no_cli_syncwhen it displays it.{error}text from the engine or the network.src/i18nyet.upload/queue.rs) and the diagnostic mode/stage labels (diagnostics.rs) belong to other files and are not part of this change.English is unchanged
src/i18n/settings_surface_tests.rspairs every plain key with the literal it replaced. A key count keeps it complete. Separately, every plain English value was checked to appear verbatim as a string literal in the files onmain.format!it replaced, with plural cases 0, 1, 2 and 5.settings_pages'sshortcut_effects_match_the_sentences_they_replacedkeeps a copy of the old fragment assembly. It checks every action against every after-capture setting, Instant link setting and mode. Each phrase must equal the old assembly, and each sentence must equal the old capitalized form.src/i18n/tests.rsgets one filter line, so its key count skips the settings keys. Their pairs live in the new test file.Fit
max_pxbudgets checked bytranslations_fit_their_width_budgets.CI
CI run 40380983725 passed: the GPUI builds and the app tests on macOS arm64, macOS Intel, Linux and Windows, plus Format (Cargo). The repo's Clippy job covers only the root workspace, so it skips
apps/desktop-gpui.

Confidence Score: 5/5
The PR appears safe to merge; no new actionable issue was established.Summary
Localizes the Settings pages across seven catalogs and adds checks that preserve the existing English messages.
Reviews (3) · Last reviewed commit: "Merge settings i18n" · Reviewed by Greptile